[
  {
    "path": ".gitignore",
    "content": ".DS_Store\nnode_modules/*\nbower_components/*\nrelease/*\nrelease.zip\n.idea/\ndev/*\n"
  },
  {
    "path": "Gruntfile.js",
    "content": " module.exports = function(grunt) {\n\n \t/*\n \t * To build a release run 'grunt'\n \t * index.html has to be manually copied to 'release/' because of\n \t * reference differences (import.min.css, jquery)\n \t */\n\n\tvar minBanner = '/* <%= pkg.name %> | Copyright <%= grunt.template.today(\"yyyy\") %> <%= pkg.author %> (<%= pkg.homepage %>) | <%= pkg.license %> license | v<%= pkg.version %> */';\n\tvar largeBanner = '/*' + '\\n' +\n\t\t'* <%= pkg.name %> v<%= pkg.version %>' + '\\n' +\n\t\t'* Copyright <%= grunt.template.today(\"yyyy\") %> <%= pkg.author %>' + '\\n' +\n\t\t'* <%= pkg.homepage %>' + '\\n' +\n\t\t'* Free to use under the MIT license.' + '\\n' +\n\t\t'* http://www.opensource.org/licenses/mit-license.php' + '\\n' +\n\t\t'*/' + '\\n';\n\n\tgrunt.initConfig({\n\n\t\tpkg: grunt.file.readJSON('package.json'),\n\n\t \tuglify: {\n\t\t\toptions: {\n\t\t\t\tbanner: minBanner + '\\n'\n\t\t\t},\n\t \t\tbuild: {\n\t\t\t\tfiles: {\n\t\t\t\t\t'js/simpleStore.min.js': 'js/simpleStore.js'\n\t\t\t\t}\n\t\t\t}\n\t \t},\n\n\t\tcssmin: {\n\t\t\ttarget: {\n\t\t\t\tfiles: {\n\t\t\t\t\t'css/simpleStore.min.css': 'css/simpleStore.css'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfile_append: {\n\t\t\tdefault_options: {\n\t\t\t\tfiles: [\n\t\t\t\t\t{prepend: minBanner + '\\n', input: 'css/simpleStore.min.css'}\n\t\t\t\t]\n\t\t\t}\n\t\t},\n\n\t\tcopy: {\n\t\t\tmain: {\n\t\t\t\tfiles: [\n\t\t\t\t\t{src: 'css/simpleStore.min.css', dest: 'release/css/simpleStore.min.css'},\n\t\t\t\t\t{src: 'js/simpleStore.min.js', dest: 'release/js/simpleStore.min.js'},\n\t\t\t\t\t{src: 'js/simpleCart.min.js', dest: 'release/js/simpleCart.min.js'},\n\t\t\t\t\t{src: 'js/config.js', dest: 'release/js/config.js'},\n\t\t\t\t\t{src: 'products.json', dest: 'release/products.json'},\n\t\t\t\t\t{src: 'images/favicon.png', dest: 'release/images/favicon.png'}\n\t\t\t\t]\n\t\t\t},\n\t\t}\n\n\t});\n\n\tgrunt.loadNpmTasks('grunt-contrib-uglify');\n\tgrunt.loadNpmTasks('grunt-contrib-cssmin');\n\tgrunt.loadNpmTasks('grunt-contrib-copy');\n\tgrunt.loadNpmTasks('grunt-file-append');\n\n\tgrunt.registerTask('default', ['uglify', 'cssmin', 'file_append', 'copy']);\n };\n"
  },
  {
    "path": "LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Chris Diana\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "**UPDATES COMING SOON! [Get notified](http://eepurl.com/dHBK11)**\n\n\n[Sign up](http://eepurl.com/gntUvf) to get updates on new features and releases\n\n# simpleStore\n\n[simpleStore](http://chrisdiana.github.io/simplestore) is a clean, responsive\nstorefront boilerplate with no database you can setup in minutes. simpleStore is built on\n[simpleCart.js](http://simplecartjs.org) and [Skeleton](http://getskeleton.com)\nCSS Framework for a lightweight, fast, simple to use, and completely\ncustomizable experience.\n\n![simpleStore Screenshot](https://raw.githubusercontent.com/chrisdiana/simplestore/gh-pages/images/screenshot-v1.1-full.png)\n![simpleStore Cart Screenshot](https://raw.githubusercontent.com/chrisdiana/simplestore/gh-pages/images/screenshot-v1.1-cart.png)\n![simpleStore Detail Screenshot](https://raw.githubusercontent.com/chrisdiana/simplestore/gh-pages/images/screenshot-v1.1-detail.png)\n\n---\n\n# Features\n\n* No Databases, all client-side (just simple HTML, CSS & Javascript)\n* Lightweight & Fast\n* Tax Rate Calculations\n* Unlimited product attributes\n* Shipping\n* Multiple Currencies\n* Payment Gateways (Paypal, Google Checkout, Amazon Payments)\n* For more features check out [simpleCart.js](http://simplecartjs.org)\n\n# Plugins\n\n* Google Sheets (Control products from a Google Sheet instead of JSON file)\n\n# Demo\n\nYou can see a working demo [here](http://chrisdiana.github.io/simplestore/demo/)\n\n\n# Installation\n\nInstall with Bower\n\n```\nbower install\n```\n\nor manually install using the latest [release](https://github.com/chrisdiana/simplestore/releases/latest)\n\n\n# Setup\n\n1.Make sure simpleStore is on a web server (any type will do as long as it can serve static web pages).\n\n2.Configure your payment options in `js/config.js`.\n\n```\ncheckout: {\n\ttype: \"PayPal\" ,\n\temail: \"you@yours.com\"\n},\n```\n\n3.Edit the `js/config.js` to your liking.\n\n4.Add additional products in the `products.json` file.\n\n# Using Plugins\n\nTo use a plugin, add a reference just before your `config.js` file\n\n```\n<script src=\"plugins/google-sheets.js\"></script>\n<script src=\"js/config.js\"></script>\n```\n\n## HTML Version\n\nIf you are looking for something more basic, check out the [HTML version on this\nbranch](https://github.com/chrisdiana/simplestore/tree/simplestore-html).\nThe HTML version uses plain HTML to build the store instead of a JSON\nfile.\n\nAdd additional products using the `<div class=\"simpleCart_shelfItem\"></div>` tags.\n\n## Credit where credit is due\n\nFor further documentation on expanding/tweaking simpleStore, check out the\nframework/plugin pages.\n\n* [Skeleton](http://getskeleton.com)\n* [simpleCart.js](http://simplecartjs.org)\n* [Normalize.css](http://necolas.github.io/normalize.css)\n* [FontAwesome](http://fortawesome.github.io/Font-Awesome)\n* [jQuery](https://jquery.com/)\n\n### A note about JavaScript shopping carts\n\nALL JavaScript shopping carts are NOT fullproof. Because simpleStore is fully\nclient-side, some users may attempt to alter prices before checkout.\nSimpleStore does the best it can to minimize this\nkind of activity. Make sure to monitor your sales. Just like in real life, if someone\nwalks into your store and changes the price tag, you will certainly not honor\nthose changes.\n\n\n# Contributing\n\nAll forms of contribution are welcome: bug reports, bug fixes, pull requests and simple suggestions.\nIf you do wish to contribute, please follow the [Airbnb Javascript Style Guide](https://github.com/airbnb/javascript) Thanks!\n\n\n## List of contributors\n\nYou can find the list of contributors [here](https://github.com/chrisdiana/simplestore/graphs/contributors).\n"
  },
  {
    "path": "bower.json",
    "content": "{\n    \"name\": \"simpleStore\",\n    \"description\": \"A clean, responsive storefront boilerplate with no database or backend.\",\n    \"version\": \"1.1.1\",\n    \"homepage\": \"http://cdmedia.github.io/simplestore\",\n    \"repository\": {\n\t    \"type\": \"git\",\n\t    \"url\": \"https://github.com/cdmedia/simplestore\"\n\t},\n    \"main\": \"index.html\",\n    \"license\": \"MIT\",\n    \"dependencies\": {\n        \"jquery\": \"latest\",\n        \"skeleton\": \"~2.0.4\",\n        \"fontawesome\": \"latest\"\n    }\n}\n"
  },
  {
    "path": "css/simpleStore.css",
    "content": "/*\n* simplestore\n* Copyright 2015 Chris Diana\n* https://github.com/cdmedia/simplestore\n* Free to use under the MIT license.\n* http://www.opensource.org/licenses/mit-license.php\n*/\n\nselect {\n    display: block;\n    float: left;\n    margin-right: 10px;\n}\n\na.hover {\n    text-decoration: none;\n}\n\n/* Main Layout */\n\n.simpleStore {\n    margin-top: 20px;\n}\n\n.brand {\n    display: block;\n    float: left;\n    text-decoration: none;\n    color: #000;\n}\n\n.brand:hover {\n    color: #777;\n}\n\n.brand img {\n\tmax-height: 50px;\n}\n\n/* simpleCart */\n\n.simpleCart_shelfItem {\n    border: 1px solid #EFEFEF;\n    padding: 25px 18px 10px 18px;\n    margin: 15px 0;\n}\n\n.simpleCart_items {\n    display: table;\n    border-collapse: collapse;\n    width: 100%;\n    min-height: 20px;\n    margin-bottom: 50px;\n}\n\n.simpleCart_items div:first-child {\n    width: 100%\n}\n\n.simpleCart_decrement, .simpleCart_increment {\n    font-size: 18px;\n    line-height: 5px;\n    text-decoration: none;\n}\n\n.simpleCart_shelfItem label {\n    display: block;\n    float: left;\n    line-height: 40px;\n    margin-right: 10px;\n}\n\n.item_thumb, .detail_thumb {\n    height: 150px;\n    display: block;\n    margin: 0 auto;\n    padding-bottom: 10px;\n}\n\n.item_Quantity {\n    display: inline-block;\n    width: 50px;\n}\n\n.item_price {\n    font-weight: 700;\n    font-size: 20px;\n    line-height: 22px;\n}\n\n.item_description {\n    margin-top: 1rem;\n    margin-bottom: 1.5rem;\n}\n\n.headerRow {\n    display: table-row;\n    font-weight: 700;\n    border-bottom: 1px solid #E1E1E1;\n}\n\n.headerRow div {\n    display: table-cell;\n    padding: 10px;\n}\n\n.itemRow.odd {\n    background: #FAFAFA;\n}\n\n.itemRow {\n    display: table-row;\n    border-bottom: 1px solid #E1E1E1;\n}\n\n.itemRow:last-child {\n    border-bottom: 0 solid #fff;\n}\n\n.itemRow div {\n    display: table-cell;\n    padding: 10px;\n}\n\n.itemRow .item-quantity {\n    text-align: center;\n}\n\n/* Cart */\n\n.cart_info {\n    position: absolute;\n    bottom: 0px;\n    right: 0px;\n    margin: 22px;\n    text-align: right;\n}\n\n.cart_info div {\n    display: inline;\n}\n\n.cart_info_item {\n    display: block !important;\n}\n\n.cart_total {\n    font-size: 20px;\n}\n\n/* Views */\n\n.simpleStore_getDetail_container {\n    display: block;\n    float: left;\n    width: 50%;\n    padding: 5px 0px;\n}\n\n.simpleStore_detailView {\n    margin: 15px 0px;\n    border: 1px solid #EFEFEF;\n    position: relative;\n}\n\n.simpleStore_detailView.simpleCart_shelfItem {\n    padding: 26px 18px 8px 18px;\n}\n\n.simpleStore_detailView .item_add {\n    margin: 0px;\n    margin-bottom: 0px;\n}\n\n.simpleStore_detailView .item_name {\n\tmargin-bottom: 1rem;\n}\n\n.simpleStore_detailView .item_price {\n    display: block;\n    margin-bottom: 1.5rem;\n}\n\n.simpleStore_cart_container {\n    display: none;\n}\n\n.simpleStore_cart {\n    position: relative;\n    border: 1px solid #EFEFEF;\n    padding: 22px;\n    min-height: 230px;\n    margin: 15px 0px;\n}\n\na.simpleCart_empty {\n    color: #CDCDCD;\n    text-decoration: none;\n    text-transform: uppercase;\n    font-size: 14px;\n}\n\na.simpleCart_empty:hover {\n    color: #777;\n}\n\n.simpleCart_checkout {\n    margin: 12px 0px 0px 0px;\n}\n\n\n/* Utility */\n\n.hidden {\n    display: none;\n}\n\n.loader {\n\tdisplay: inline-block;\n    font-size: 60px;\n    line-height: 50px;\n    color: #ddd;\n    margin: 120px auto;\n    width: 100%;\n    height: 50px;\n    text-align: center;\n    vertical-align: bottom;\n}\n\na.back {\n    position: absolute;\n    top: 10px;\n    left: 18px;\n    line-height: 0px;\n    margin: 0;\n    padding: 0;\n    font-size: 34px;\n    color: #CDCDCD;\n    text-decoration: none;\n}\n\na.back:hover {\n    color: #777;\n}\n\na.close {\n    position: absolute;\n    top: 18px;\n    right: 14px;\n    margin: 0;\n    line-height: 0px;\n    padding: 0;\n    font-size: 32px;\n    color: #CDCDCD;\n    text-decoration: none;\n    font-family: Garamond, \"Apple Garamond\";\n}\n\na.close:hover {\n    color: #777;\n}\n\n.chevron::before {\n\tborder-style: solid;\n\tborder-width: 0.1em 0.1em 0 0;\n\tcontent: '';\n\tdisplay: inline-block;\n\theight: 0.45em;\n\tposition: relative;\n\ttop: 0.15em;\n\ttransform: rotate(-45deg);\n\tvertical-align: top;\n\twidth: 0.45em;\n    left: 0.25em;\n\ttransform: rotate(-135deg);\n}\n\n.error {\n\tbackground: #FFE5E5;\n\tpadding: 15px;\n\tborder-radius: 5px;\n\tposition: relative;\n    margin-bottom: 10px;\n}\np.error_text {\n\tmargin-bottom: 0rem;\n}\n\n.notify {\n\tbackground: #D9F6FF;\n\tbackground: rgba(81, 81, 81, 0.8);\n\tcolor: #fff;\n\tposition: fixed;\n\tpadding: 14px 0;\n\ttext-align: center;\n\tmargin: 0 auto;\n\twidth: 100%;\n\tfont-size: 14px;\n\ttop: 0;\n\tright: 0;\n\ttop: 0;\n\tz-index: 9999;\n}\np.notify_text {\n\tmargin-bottom: 0rem;\n}\n\n@media (max-width: 920px) {\n    .simpleStore_getDetail_container {\n        width: 100%;\n    }\n    .simpleCart_shelfItem {\n        position: relative;\n    }\n    .simpleCart_shelfItem .item_name {\n        font-size: 1.8rem;\n    }\n    .simpleStore_getDetail {\n        position: inherit;\n        display: block;\n        width: 100%;\n        margin: 0px;\n        margin-bottom: 0px;\n    }\n}\n\n@media (max-width: 620px) {\n\n   .simpleStore_detailView .item_thumb {\n        margin-bottom: 10px;\n        display: block;\n        width: 100%;\n        height: auto;\n    }\n\n    .simpleStore_detailView .item_add {\n        position: inherit;\n        display: block;\n        width: 100%;\n    }\n\n    .cart_info {\n        position: inherit;\n        margin: 0px;\n        padding-top: 15px;\n        text-align: left;\n        border-top: 1px solid #E1E1E1;\n    }\n\n    .simpleCart_checkout {\n        width: 100%;\n    }\n\n    .simpleCart_items {\n        font-size: 12px;\n    }\n\n    /* Better mobile support for cart */\n    .item-decrement, .item-increment, .item-total {\n        display: none !important;\n    }\n}\n"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\n    <!-- Basic Page Needs\n    –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n    <meta charset=\"utf-8\">\n    <title>simpleStore</title>\n    <meta name=\"description\" content=\"A clean, responsive storefront boilerplate with no database or backend\">\n    <meta name=\"author\" content=\"\">\n\n    <!-- Mobile Specific Metas\n    –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n    <!-- FONT\n    –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n    <link href=\"//fonts.googleapis.com/css?family=Raleway:400,300,600\" rel=\"stylesheet\" type=\"text/css\">\n\n    <!-- CSS\n    –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n    <link rel=\"stylesheet\" href=\"css/imports.min.css\">\n    <link rel=\"stylesheet\" href=\"css/simpleStore.css\">\n\n    <!-- Favicon\n    –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n    <link rel=\"icon\" type=\"image/png\" href=\"images/favicon.png\">\n\n</head>\n<body>\n\n    <!-- Primary Page Layout\n    –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n    <div class=\"container simpleStore\">\n        <div class=\"row\">\n            <a class=\"brand\" href=\"#\"></a>\n            <a class=\"button button-primary u-pull-right simpleStore_viewCart\">\n                <i class=\"fa fa-shopping-cart\"></i> Cart <span class=\"simpleCart_total\"></span>\n            </a>\n        </div>\n        <div class=\"simpleStore_container\"></div>\n        <div class=\"simpleStore_cart_container\"></div>\n    </div>\n\n    <!-- Templates\n    –––––––––––––––––––––––––––––––––––––––––––––––––– -->\n\n    <!-- Products View -->\n    <script id=\"products-template\" type=\"x-template\">\n        <div class=\"column\">\n            <div class=\"simpleCart_shelfItem\">\n                <img src=\"\" class=\"item_thumb\"/>\n                <div class=\"row\">\n                    <h5 class=\"item_name\"></h5>\n                    <div class=\"simpleStore_getDetail_container\">\n                        <span class=\"item_price\"></span>\n                    </div>\n                    <div class=\"simpleStore_getDetail_container\">\n                        <a class=\"button u-pull-right simpleStore_getDetail\">Details</a>\n                    </div>\n                </div>\n\n            </div>\n        </div>\n    </script>\n\n    <!-- Product Detail View -->\n    <script id=\"product-detail-template\" type=\"x-template\">\n        <div class=\"simpleCart_shelfItem simpleStore_detailView\">\n            <a href=\"#\" class=\"close view_close\">&times;</a>\n\n            <div class=\"row\">\n                <div class=\"four columns\">\n                    <img src=\"\" class=\"item_thumb\"/>\n                </div>\n                <div class=\"eight columns\">\n                    <h5 class=\"item_name\"></h5>\n\n                    <p class=\"item_description\"></p>\n                    <span class=\"item_price\"></span>\n\n                    <div class=\"qty\">\n                        <label>QTY</label>\n                        <input type=\"number\" value=\"1\" min=\"1\" step=\"1\" class=\"item_Quantity\">\n                    </div>\n                    <div class=\"simpleStore_options\"></div>\n                    <a class=\"item_add button u-pull-right\" href=\"javascript:;\">Add to Cart</a>\n                </div>\n            </div>\n        </div>\n    </script>\n\n    <!-- Cart View -->\n    <script id=\"cart-template\" type=\"x-template\">\n        <div class=\"simpleStore_cart\">\n            <h2>Cart</h2>\n            <a href=\"#\" class=\"close\">&times;</a>\n\n            <div class=\"row\">\n                <div class=\"eight columns\">\n                    <div class=\"simpleCart_items\"></div>\n                    <a href=\"javascript:;\" class=\"simpleCart_empty u-pull-left\">Empty Cart <i class=\"fa fa-trash-o\"></i></a>\n                </div>\n                <div class=\"four columns\">\n                    <div class=\"cart_info\">\n                        <div class=\"cart_info_item cart_itemcount\">Items:\n                            <div class=\"simpleCart_quantity\"></div>\n                        </div>\n                        <div class=\"cart_info_item cart_taxrate\">Tax Rate:\n                            <div class=\"simpleCart_taxRate\"></div>\n                        </div>\n                        <div class=\"cart_info_item cart_tax\">Tax:\n                            <div class=\"simpleCart_tax\"></div>\n                        </div>\n                        <div class=\"cart_info_item cart_shipping\">Shipping:\n                            <div class=\"simpleCart_shipping\"></div>\n                        </div>\n                        <div class=\"cart_info_item cart_total\"><b>Total:\n                            <div class=\"simpleCart_grandTotal\"></div>\n                        </b></div>\n                        <a href=\"javascript:;\" class=\"button button-primary simpleStore_checkout u-pull-right\">Checkout <i class=\"fa fa-arrow-right\"></i></a>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </script>\n\n    <!-- Error View -->\n    <script id=\"error-template\" type=\"x-template\">\n        <div class=\"error\">\n            <b>Sorry, something went wrong :(</b>\n\t\t\t<p class=\"error_text\"></p>\n\t\t\t<a href=\"#\" class=\"close alert_close\">&times;</a>\n        </div>\n    </script>\n\n    <!-- Notify View -->\n    <script id=\"notify-template\" type=\"x-template\">\n        <div class=\"notify\">\n\t\t\t<p class=\"notify_text\"></p>\n        </div>\n    </script>\n\n<!-- End Document\n–––––––––––––––––––––––––––––––––––––––––––––––––– -->\n</body>\n\n<!-- Scripts\n–––––––––––––––––––––––––––––––––––––––––––––––––– -->\n<script src=\"bower_components/jquery/dist/jquery.min.js\"></script>\n<script src=\"js/simpleCart.min.js\"></script>\n<script src=\"js/simpleStore.js\"></script>\n\n<script src=\"js/config.js\"></script>\n\n</html>\n"
  },
  {
    "path": "js/config.js",
    "content": "$(function() {\n\tsimpleCart({\n\n\t    // array representing the format and columns of the cart, see\n\t    // the cart columns documentation\n\t    cartColumns: [\n\t        { attr: \"name\" , label: \"Name\" },\n\t        { attr: \"price\" , label: \"Price\", view: 'currency' },\n\t        { view: \"decrement\" , label: false },\n\t        { attr: \"quantity\" , label: \"Qty\" },\n\t        { view: \"increment\" , label: false },\n\t        { attr: \"total\" , label: \"SubTotal\", view: 'currency' },\n\t        { view: \"remove\" , text: \"Remove\" , label: false }\n\t    ],\n\n\t    // \"div\" or \"table\" - builds the cart as a table or collection of divs\n\t    cartStyle: \"div\",\n\n\t    // how simpleCart should checkout, see the checkout reference for more info\n\t    checkout: {\n\t        type: \"PayPal\" ,\n\t        email: \"you@yours.com\"\n\t    },\n\n\t    // set the currency, see the currency reference for more info\n\t    currency: \"USD\",\n\n\t    // collection of arbitrary data you may want to store with the cart,\n\t    // such as customer info\n\t    data: {},\n\n\t    // set the cart langauge (may be used for checkout)\n\t    language: \"english-us\",\n\n\t    // array of item fields that will not be sent to checkout\n\t    excludeFromCheckout: [\n\t    \t'qty',\n\t    \t'thumb'\n\t    ],\n\n\t    // custom function to add shipping cost\n\t    shippingCustom: null,\n\n\t    // flat rate shipping option\n\t    shippingFlatRate: 0,\n\n\t    // added shipping based on this value multiplied by the cart quantity\n\t    shippingQuantityRate: 0,\n\n\t    // added shipping based on this value multiplied by the cart subtotal\n\t    shippingTotalRate: 0,\n\n\t    // tax rate applied to cart subtotal\n\t    taxRate: 0,\n\n\t    // true if tax should be applied to shipping\n\t    taxShipping: false,\n\n\t    // event callbacks\n\t    beforeAdd               \t: null,\n\t    afterAdd                \t: null,\n\t    load                    \t: null,\n\t    beforeSave              \t: null,\n\t    afterSave               \t: null,\n\t    update                  \t: null,\n\t    ready                   \t: null,\n\t    checkoutSuccess             : null,\n\t    checkoutFail                : null,\n\t    beforeCheckout              : null\n\n\t});\n\n\tsimpleStore.init({\n\n\t\t// brand can be text or image URL\n\t\tbrand : \"SimpleStore\",\n\n\t\t// numder of products per row (accepts 1, 2 or 3)\n\t\tnumColumns : 3,\n\n\t\t// name of JSON file, located in directory root\n\t\tJSONFile : \"products.json\"\n\n\t});\n\n});\n"
  },
  {
    "path": "js/simpleStore.js",
    "content": "/*\n* simplestore\n* Copyright 2015 Chris Diana\n* https://github.com/cdmedia/simplestore\n* Free to use under the MIT license.\n* http://www.opensource.org/licenses/mit-license.php\n*/\n\nvar simpleStore = {\n\n    products: [],\n    plugins: {},\n\n    // Default settings\n    settings: {\n        numColumns: 3,\n        brand: \"SimpleStore\",\n        mode: \"JSON\",\n        JSONFile: \"products.json\",\n        fadeSpeed: 200,\n        buttonColor: null,\n        backgroundColor: null,\n        textColor: null,\n        container: $('.simpleStore_container'),\n        cartContainer: $('.simpleStore_cart_container'),\n        rowClass: 'simpleStore_row_',\n        columnWidthClasses: {\n            1: \"\",\n            2: \"one-half\",\n            3: \"one-third\"\n        }\n    },\n\n    productPageOptions: [\n        'OneOfAKind'\n    ],\n\n    extend: function (target, opts, callback) {\n        var next;\n        if (typeof opts === \"undefined\") {\n            opts = target;\n            target = simpleStore;\n        }\n        for (next in opts) {\n            if (Object.prototype.hasOwnProperty.call(opts, next)) {\n                target[next] = opts[next];\n            }\n        }\n        callback(); // check user config options\n        return target;\n    },\n\n    render: function (url, s) {\n        var type = url.split('/')[0];\n\n        var map = {\n            // Main view\n            '': function () {\n                simpleStore.renderProducts(simpleStore.products, s);\n            },\n            // Detail view\n            '#product': function () {\n                var id = url.split('#product/')[1].trim();\n                simpleStore.renderSingleProduct(id, s);\n            },\n            // Cart view\n            '#cart': function () {\n                simpleStore.renderCart(s);\n            }\n        };\n\n        if (map[type]) {\n            map[type]();\n        } else {\n            simpleStore.renderError(s);\n        }\n    },\n\n    insertData: function (tmpl, product) {\n        tmpl.find('.item_thumb').attr(\"src\", product.image);\n        tmpl.find('.item_name').text(product.name);\n        tmpl.find('.item_price').text(product.price);\n        tmpl.find('.item_description').text(product.description);\n    },\n\n    renderProducts: function (products, s) {\n\n        var rowCount = 1,\n            numProducts = products.length,\n            numRows = Math.ceil(products.length / s.numColumns),\n            itemWidth;\n\n        s.cartContainer.hide();\n        s.container.fadeOut(s.fadeSpeed, function () {\n\n            // Empty out main container on load\n            s.container.html('').fadeIn(s.fadeSpeed);\n\n            // Build rows based on number of products\n            for (var r = 0; r < numRows; r++) {\n                s.container.append('<div class=\"row ' + s.rowClass + (r + 1) + '\"></div>');\n            }\n\n            // Get item column width\n            var widthClasses = s.columnWidthClasses;\n            for (var k in widthClasses) {\n                if (k == s.numColumns) {\n                    itemWidth = widthClasses[k];\n                }\n            }\n\n            // List layout\n            products.forEach(function (product, i) {\n\n\t\t\t\tif (!product.soldOut) {\n\t\t\t\t\tvar tmpl = $('#products-template').html(),\n\t\t\t\t\t\t$tmpl = $(tmpl);\n\n\t\t\t\t\t// Set item width\n\t\t\t\t\t$tmpl.first().addClass(itemWidth);\n\n\t\t\t\t\t// Insert data into template\n\t\t\t\t\tsimpleStore.insertData($tmpl, product);\n\n\t\t\t\t\t// Render detail view on hash change\n\t\t\t\t\tvar getDetail = $tmpl.find('.simpleStore_getDetail');\n\t\t\t\t\tgetDetail.on('click', function (e) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\twindow.location.hash = 'product/' + product.id;\n\t\t\t\t\t});\n\n\t\t\t\t\t// Check where to add new item based on row\n\t\t\t\t\tif (i === 0) {\n\t\t\t\t\t\ti = 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (i % (s.numColumns) === 0) {\n\t\t\t\t\t\trowCount++;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Append to appropriate container\n\t\t\t\t\t$('.' + s.rowClass + rowCount).append($tmpl);\n\t\t\t\t}\n            });\n        });\n    },\n\n    renderProductOptions: function (options, s) {\n\n        var optionsLayout = '';\n\n        options.forEach(function (option) {\n            if (!(simpleStore.productPageOptions in option)) {\n                var selectItems = '';\n                var attributeLabel = Object.keys(option)[0].trim();\n                var attributeValues = option[attributeLabel].trim().split(\",\");\n\n                // Set attribute values\n                $(attributeValues).each(function (attribute, attributeValue) {\n                    selectItems += '<option value=\"' + attributeValue.replace(/ /g, \"_\").toLowerCase() + '\"> ' + attributeValue + ' </option>';\n                });\n\n                // Build options layout\n                if (options.length) {\n                    optionsLayout += '<label>' + attributeLabel + '</label><select class=\"item_' + attributeLabel.replace(/ /g, \"_\").toLowerCase() + '\">' + selectItems + '</select>';\n                }\n            } else {\n                simpleStore.renderProductPageOptions(option);\n            }\n        });\n\n        return optionsLayout;\n    },\n\n    renderProductPageOptions: function (option) {\n        if (option.OneOfAKind) {\n            $('.qty').hide();\n        }\n    },\n\n    renderSingleProduct: function (id, s) {\n\n        s.container.fadeOut(s.fadeSpeed, function () {\n\n            var tmpl = $('#product-detail-template').html(),\n                $tmpl = $(tmpl);\n\n            simpleStore.products.forEach(function (product) {\n                if (product.id == id) {\n\n                    // Insert data into template\n                    simpleStore.insertData($tmpl, product);\n\n                    // Load detail view into main container\n                    s.container.html($tmpl);\n\n                    // Render product options\n                    if (product.options.length) {\n                        var options = simpleStore.renderProductOptions(product.options, s);\n                        $('.simpleStore_options').append(options);\n                    }\n                    s.container.fadeIn(s.fadeSpeed);\n                }\n            });\n        });\n    },\n\n    renderCart: function (s) {\n        s.container.fadeOut(s.fadeSpeed, function () {\n            s.cartContainer.fadeIn(s.fadeSpeed);\n        });\n    },\n\n    renderError: function (s, msg) {\n        var tmpl = $('#error-template').html(),\n            $tmpl = $(tmpl);\n\n\t\t// Empty out main container on load\n\t\ts.container.html('').fadeIn(s.fadeSpeed);\n\n\t\tif (msg.length) {\n\t\t\t$tmpl.find('.error_text').text(msg);\n\t\t}\n\t\ts.container.append($tmpl);\n\t\ts.container.fadeIn(s.fadeSpeed);\n\n\t\t$tmpl.find('.alert_close').on('click', function (e) {\n\t\t\te.preventDefault();\n\t\t\t$tmpl.fadeOut(s.fadeSpeed, function() {\n\t\t\t\t$tmpl.remove();\n\t\t\t});\n\t\t});\n    },\n\n\thandleFailure:  function(s, errorMsg) {\n\t\tsetTimeout(function () {\n\t\t\tsimpleStore.renderError(s, errorMsg);\n\t\t}, 1000);\n\t},\n\n\tnotifier: function(msg) {\n\t\ts = this.settings;\n\n  \t\tvar tmpl = $('#notify-template').html(),\n            $tmpl = $(tmpl);\n\n\t\tif (msg.length) {\n\t\t\t$tmpl.find('.notify_text').text(msg);\n\t\t\ts.container.append($tmpl);\n\t\t\t$tmpl.hide();\n\t\t\t$tmpl.fadeIn(s.fadeSpeed);\n\t\t\tsetTimeout(function () {\n\t\t\t\t$tmpl.fadeOut(s.fadeSpeed);\n\t\t\t}, 1000);\n\t\t}\n\t},\n\n    initJSON: function (s) {\n        var errorMsg = 'There was an error loading the JSON file.' +\n            ' Please make sure you have \"' + s.JSONFile + '\" file in' +\n            ' your main directory.';\n\n        // Checks to make sure file exists\n        $.get(s.JSONFile)\n            .success(function () {\n                // Get product data from JSON file\n                $.getJSON(s.JSONFile, function (data) {\n                    simpleStore.setProducts(data.products);\n                })\n                .fail(function () { simpleStore.handleFailure(s, errorMsg); });\n            })\n            .fail(function () { simpleStore.handleFailure(s, errorMsg); });\n    },\n\n    checkMode : function (s) {\n        if (s.hasOwnProperty(\"spreadsheetID\") || s.hasOwnProperty(\"spreadsheetId\")) {\n            s.mode = \"Google\";\n        }\n    },\n\n\tcheckout : function (s, checkoutData) {\n\t\tif (!$.isEmptyObject(checkoutData)) {\n        \tsimpleCart.checkout();\n\t\t\ts.cartContainer.fadeOut(s.fadeSpeed, function () {\n\t\t\t\ts.container.html('<i class=\"fa fa-spin fa-circle-o-notch loader\"></i>');\n\t\t\t\ts.container.fadeIn(s.fadeSpeed);\n\t\t\t});\n\t\t}\n\t},\n\n\tverifyCheckoutData : function (cdata, adata, v) {\n\t\tfor (var d in cdata) {\n\t\t\tif (cdata.hasOwnProperty(d)) {\n\t\t\t\tvar cp = cdata[d], cn = cp.name, cpp = cp.price;\n\t\t\t\tfor (var i = 0; i < adata.length; i++) {\n\t\t\t\t\tvar ap = adata[i], an = ap.name, app = ap.price;\n\t\t\t\t\tif (cn === an) {if (cpp != app) { v = false; }}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn v;\n\t},\n\n    validatePrices : function (s) {\n        var checkoutData = JSON.parse(localStorage.simpleCart_items),\n\t\t\terrorMsg = 'There was an error validating your cart.';\n\n\t\tif (s.mode === \"JSON\") {\n\t\t\t $.get(s.JSONFile)\n\t\t\t\t.success(function () {\n\t\t\t\t\t$.getJSON(s.JSONFile, function (data) {\n\t\t\t\t\t\tvar JSONData = data.products;\n\t\t\t\t\t\tif (simpleStore.verifyCheckoutData(checkoutData, JSONData, true)) {\n        \t\t\t\t\tsimpleStore.checkout(s, checkoutData);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsimpleStore.renderError(s, errorMsg);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n                \t.fail(function () { simpleStore.handleFailure(s, errorMsg); });\n\t\t\t\t})\n                .fail(function () { simpleStore.handleFailure(s, errorMsg); });\n\t\t} else {\n\t\t\tvar plugin = s.mode.toLowerCase();\n\t\t\tif(simpleStore.plugins[plugin]) {\n\t\t\t\tsimpleStore.plugins[plugin].validate(checkoutData);\n\t\t\t}\n\t\t}\n    },\n\n    setProducts: function (products, s) {\n        if (products.length > 0) {\n            products.forEach(function (product, index) {\n                product.id = index + 1;\n                simpleStore.products.push(product);\n            });\n        }\n\n        // Manually trigger on initial load\n        $(window).trigger('hashchange');\n    },\n\n\tsetLayout: function (s) {\n\t\t// Set brand\n        if (s.brand.match('^http://') || s.brand.match('^https://') || s.brand.match('^www.')) {\n            $('.brand').html('<img src=\"' + s.brand + '\" />');\n        } else {\n            $('.brand').html('<h5>' + s.brand + '</h5>');\n        }\n\n\t\t// Set title\n\t\t$('title').html(s.brand);\n\t},\n\n    generateCart: function (s) {\n        var tmpl = $('#cart-template').html(),\n            $tmpl = $(tmpl);\n        s.cartContainer.html($tmpl);\n    },\n\n    generateStore: function () {\n\n        var s = this.settings;\n\n        // Set mode\n        this.checkMode(s);\n\n        // Check for hash changes\n        $(window).on('hashchange', function () {\n            simpleStore.render(window.location.hash, s);\n        });\n\n        // Set products based on mode\n        switch (s.mode) {\n            case 'JSON':\n                this.initJSON(s);\n                break;\n            case 'Google':\n\t\t\t\tif(simpleStore.plugins.google) {\n\t\t\t\t\tsimpleStore.plugins.google.init(function (products) {\n\t\t\t\t\t\tsimpleStore.setProducts(products, s);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tvar errorMsg = 'There was an error loading the Google plugin. Make sure it is installed properly.';\n\t\t\t\t\tsimpleStore.renderError(s, errorMsg);\n\t\t\t\t}\n                break;\n            default:\n                this.initJSON(s);\n        }\n\n        // Because simpleCart items appends to cart, set up only once\n        this.generateCart(s);\n\n        // Setup layout\n        this.setLayout(s);\n\n\t\t// Handle Checkout\n        $('.simpleStore_checkout').on('click', function (e) {\n            e.preventDefault();\n            simpleStore.validatePrices(s);\n        });\n\n        // View Cart\n        $('.simpleStore_viewCart').on('click', function (e) {\n            e.preventDefault();\n            window.location = '#cart';\n        });\n\n        // Go to home on close\n        $('.view_close').on('click', function (e) {\n            e.preventDefault();\n            window.location.hash = '';\n        });\n\n\t\t// SimpleCart extend\n\t\tsimpleCart({\n\t\t\tafterAdd: function() {\n\t\t\t\tsimpleStore.notifier('Item added to cart');\n\t\t\t}\n\t\t});\n    },\n\n    init: function (options) {\n        if ($.isPlainObject(options)) {\n            return this.extend(this.settings, options, function () {\n                simpleStore.generateStore();\n            });\n        }\n    }\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"simplestore\",\n  \"version\": \"1.5\",\n  \"description\": \"A clean, responsive storefront boilerplate with no database or backend.\",\n  \"main\": \"index.html\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/cdmedia/simplestore.git\"\n  },\n  \"author\": \"Chris Diana\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/cdmedia/simplestore/issues\"\n  },\n  \"private\": true,\n  \"homepage\": \"https://github.com/cdmedia/simplestore\",\n  \"devDependencies\": {\n    \"grunt\": \"~0.4.4\",\n    \"grunt-contrib-copy\": \"latest\",\n    \"grunt-contrib-cssmin\": \"latest\",\n    \"grunt-contrib-uglify\": \"latest\",\n    \"grunt-contrib-watch\": \"latest\",\n    \"grunt-file-append\": \"0.0.6\"\n  }\n}\n"
  },
  {
    "path": "plugins/google-sheets/google-sheets.js",
    "content": "/*\n * SimpleStore Google Sheets Plugin\n * To use Google spreadsheet as your database, follow the steps below:\n * 1. Use the \"DemoSpreadsheet.xlsx\" as a starting point\n * 2. Create a new Google spreadsheet\n * 3. Set sharing permissions to either “Public” or set to “Anyone with link can view”\n * 4. Publish the sheet (File -> Publish to the web -> Publish)\n * 5. Add the spreadsheet ID to your 'config.js' ( spreadsheetID : \"XXXXXXXXXXXXXXXXXXXXXXX\" )\n */\n\nsimpleStore.plugins.google = (function() {\n\n\tvar storeProducts = verifyProducts = [];\n\n\tfunction getSpreadsheetData(s, verify, callback) {\n\n\t\tverify = typeof verify !== 'undefined' ? verify : false;\n\n\t\tvar hostname = \"https://spreadsheets.google.com\";\n\t\tvar format = \"json\";\n\t\tvar spreadsheetURL = hostname + \"/feeds/worksheets/\" + s.spreadsheetID + \"/public/full?alt=\" + format;\n\t\tvar mainsheetURL = hostname + \"/feeds/list/\" + s.spreadsheetID + \"/od6/public/values?alt=\" + format;\n\t\tvar settingsSheetName = \"Settings\";\n\t\tvar productsSheetName = \"Products\";\n\t\tvar sheetIDs = {};\n\n\t\tfunction getSheetInfo (url, callback) {\n\t\t\t// Need to do this because od6 is default Google Sheet ID\n\t\t\t$.getJSON(url)\n\t\t\t\t.done(function(data) {\n\n\t\t\t\t\tvar sheets = data.feed.entry;\n\n\t\t\t\t\t$(sheets).each(function(i, sheet) {\n\n\t\t\t\t\t\tvar title = sheet.title.$t;\n\t\t\t\t\t\tvar id = sheet.id.$t;\n\t\t\t\t\t\tvar sheetID = id.substr(id.lastIndexOf('/') + 1);\n\n\t\t\t\t\t\tif(title == settingsSheetName) {\n\t\t\t\t\t\t\tsheetIDs.settingsSheetID = sheetID;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(title == productsSheetName) {\n\t\t\t\t\t\t\tsheetIDs.productsSheetID  = sheetID;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tcallback(sheetIDs.settingsSheetID);\n\t\t\t\t\tloadProductData(sheetIDs.productsSheetID);\n\t\t\t\t});\n\t\t}\n\n\t\tfunction loadSiteSettings (id, callback) {\n\n\t\t\tvar settingsSheetURL = hostname + \"/feeds/list/\" + s.spreadsheetID + \"/\" + id + \"/public/values?alt=\" + format;\n\n\t\t\t$.getJSON(settingsSheetURL)\n\t\t\t\t.done(function(data) {\n\t\t\t\t\tvar data = data.feed.entry;\n\t\t\t\t\tvar s = simpleStore.settings;\n\n\t\t\t\t\tif(data[0]) {\n\n\t\t\t\t\t\tvar siteName = data[0].gsx$sitenametextorimagelink.$t;\n\t\t\t\t\t\tvar columns = data[0].gsx$columns123.$t;\n\n\t\t\t\t\t\tif (siteName) {\n\t\t\t\t\t\t\ts.brand = siteName;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (columns) {\n\t\t\t\t\t\t\ts.numColumns = columns;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsimpleStore.setLayout(s);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\n\t\tfunction loadProductData (id) {\n\n\t\t\tvar productsSheetURL = hostname + \"/feeds/list/\" + s.spreadsheetID + \"/\" + id + \"/public/values?alt=\" + format;\n\n\t\t\t// Get Main Sheet Products data\n\t\t\t$.getJSON(productsSheetURL)\n\t\t\t\t.done(function(data) {\n\n\t\t\t\t\tvar productsData = data.feed.entry;\n\n\t\t\t\t\t// Build products\n\t\t\t\t\t$(productsData).each(function(i) {\n\n\t\t\t\t\t\tvar options = this.gsx$options.$t;\n\t\t\t\t\t\tvar setOptions = function(options) {\n\t\t\t\t\t\t\tvar productOptions = [];\n\t\t\t\t\t\t\tif(options) {\n\t\t\t\t\t\t\t\tvar opts = options.split(\";\").filter(function(el) {return el.length != 0});\n\t\t\t\t\t\t\t\t$(opts).each(function(i, option) {\n\t\t\t\t\t\t\t\t\tvar opt = option.trim().split(\":\"),\n\t\t\t\t\t\t\t\t\t\tkey = opt[0],\n\t\t\t\t\t\t\t\t\t\tval = opt[1],\n\t\t\t\t\t\t\t\t\t\toptObj = {};\n\n\t\t\t\t\t\t\t\t\toptObj[key] = val;\n\t\t\t\t\t\t\t\t\tproductOptions.push(optObj);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn productOptions;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Get product values\n\t\t\t\t\t\tvar product = {\n\t\t\t\t\t\t\tname : this.gsx$name.$t,\n\t\t\t\t\t\t\tprice : this.gsx$price.$t,\n\t\t\t\t\t\t\tdescription : this.gsx$description.$t,\n\t\t\t\t\t\t\toptions : setOptions(options),\n\t\t\t\t\t\t\timage : this.gsx$image.$t\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (verify) {\n\t\t\t\t\t\t\tverifyProducts.push(product);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstoreProducts.push(product);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tcallback();\n\t\t\t\t})\n\t\t\t\t.fail(function(data){\n\t\t\t\t\tif (verify) {\n\t\t\t\t\t\tvar errorMsg = 'There was an error validating your cart.';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar errorMsg = 'Error loading spreadsheet data. Make sure the spreadsheet ID is correct.';\n\t\t\t\t\t}\n\t\t\t\t\tsetTimeout(function(){ simpleStore.renderError(s, errorMsg); }, 1000);\n\t\t\t\t});\n\t\t}\n\n\t\t// Get Sheet data\n\t\tgetSheetInfo(spreadsheetURL, loadSiteSettings);\n\t}\n\n\tfunction validatePrices(s, checkoutData) {\n\t\tverifyProducts = [];\n\n\t\tgetSpreadsheetData(s, true, function() {\n\t\t\tif(simpleStore.verifyCheckoutData(checkoutData, verifyProducts, true)) {\n        \t\tsimpleStore.checkout(s, checkoutData);\n\t\t\t} else {\n\t\t\t\tvar errorMsg = 'There was an error validating your cart.';\n\t\t\t\tsimpleStore.renderError(s, errorMsg);\n\t\t\t}\n\t\t});\n\t}\n\n\treturn {\n\t\tinit: function(callback) {\n\t\t\tvar s = simpleStore.settings;\n\n\t\t\t// Clears out brand to allow for spreadsheet site name\n\t\t\ts.brand = \"\";\n\t\t\tsimpleStore.setLayout(s);\n\n\t\t\tgetSpreadsheetData(s, false, function(){\n\t\t\t\tcallback(storeProducts);\n\t\t\t});\n\t\t},\n\t\tvalidate: function(checkoutData) {\n\t\t\tvalidatePrices(simpleStore.settings, checkoutData);\n\t\t}\n\t};\n})();\n"
  },
  {
    "path": "products.json",
    "content": "{\n\t\"products\" : [\n\t\t{\n\t\t\t\"name\" : \"Awesome T-shirt\",\n\t\t\t\"price\" : \"35.99\",\n\t\t\t\"options\" : [\n\t\t\t\t{ \"Size\" : \"Small,Medium,Large\" }\n\t\t\t],\n\t\t\t\"image\" : \"http://upload.wikimedia.org/wikipedia/commons/c/c6/Grey_Tshirt.jpg\",\n\t\t\t\"description\" : \"This is a very awesome grey T-shirt\"\n\t\t},\n\t\t{\n\t\t\t\"name\" : \"Cool T-shirt\",\n\t\t\t\"price\" : \"15.99\",\n\t\t\t\"options\" : [\n\t\t\t\t{ \"Size\" : \"Small,Medium,Large\" },\n\t\t\t\t{ \"Color\" : \"Blue,Red\" },\n\t\t\t    { \"OneOfAKind\" : true }\n\t\t\t],\n\t\t\t\"image\" : \"http://upload.wikimedia.org/wikipedia/commons/2/24/Blue_Tshirt.jpg\",\n\t\t\t\"description\" : \"This is a really cool blue T-shirt\",\n\t\t\t\"soldOut\" : true\n\t\t},\n\t\t{\n\t\t\t\"name\" : \"Fun T-shirt\",\n\t\t\t\"price\" : \"15.99\",\n\t\t\t\"options\" : [\n\t\t\t\t{ \"Size\" : \"Small,Medium,Large\" }\n\t\t\t],\n\t\t\t\"image\" : \"http://upload.wikimedia.org/wikipedia/commons/c/c6/Grey_Tshirt.jpg\",\n\t\t\t\"description\" : \"This is another fun grey T-shirt\"\n\t\t}\n\t]\n}\n"
  }
]