blob: 2d17d52ea5c1971f98fb0911cb3fd9a9424753ed [file] [log] [blame]
{"total_rows":147,"offset":0,"rows":[
{"id":"_design/app","key":"_design/app","value":{"rev":"1-fe0bebbf8328e90adfc4d2f7e8981a0d"},"doc":{"_id":"_design/app","_rev":"1-fe0bebbf8328e90adfc4d2f7e8981a0d","shows":{"package":"function (doc, req) {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n\n var semver = require(\"semver\")\n , code = 200\n , headers = {\"Content-Type\":\"application/json\"}\n , body = null\n\n delete doc.ctime\n delete doc.mtime\n if (doc.versions) Object.keys(doc.versions).forEach(function (v) {\n delete doc.versions[v].ctime\n delete doc.versions[v].mtime\n })\n\n // legacy kludge\n if (doc.versions) for (var v in doc.versions) {\n var clean = semver.clean(v, true)\n doc.versions[v].directories = doc.versions[v].directories || {}\n if (clean !== v) {\n var p = doc.versions[v]\n delete doc.versions[v]\n p.version = v = clean\n p._id = p.name + '@' + p.version\n doc.versions[clean] = p\n }\n if (doc.versions[v].dist.tarball) {\n // if there is an attachment for this tarball, then use that.\n // make it point at THIS registry that is being requested,\n // with the full /db/_design/app/_rewrite if that is being used,\n // or just the /name if not.\n\n var t = doc.versions[v].dist.tarball\n t = t.replace(/^https?:\\/\\/[^\\/:]+(:[0-9]+)?/, '')\n var f = t.match(/[^\\/]+$/)[0]\n var requestedPath = req.requested_path\n if (doc._attachments && doc._attachments[f]) {\n // workaround for old couch versions that didn't\n // have requested_path\n if (requestedPath && -1 === requestedPath.indexOf('show'))\n requestedPath = requestedPath.slice(0)\n else {\n var path = req.path\n if (path) {\n var i = path.indexOf('_show')\n if (i !== -1) {\n requestedPath = path.slice(0)\n requestedPath.splice(i, i + 2, '_rewrite')\n }\n } else return {\n code : 500,\n body : JSON.stringify({error: 'bad couch'}),\n headers : headers\n }\n }\n\n // doc.versions[v].dist._origTarball = doc.versions[v].dist.tarball\n // doc.versions[v].dist._headers = req.headers\n // doc.versions[v].dist._query = req.query\n // doc.versions[v].dist._reqPath = req.requested_path\n // doc.versions[v].dist._path = req.path\n // doc.versions[v].dist._t = t.slice(0)\n\n // actual location of tarball should always be:\n // .../_rewrite/pkg/-/pkg-version.tgz\n // or: /pkg/-/pkg-version.tgz\n // depending on what requested path is.\n var tf = [doc.name, '-', t.split('/').pop()]\n var i = requestedPath.indexOf('_rewrite')\n if (i !== -1) {\n tf = requestedPath.slice(0, i + 1).concat(tf)\n }\n t = '/' + tf.join('/')\n var h = \"http://\" + req.headers.Host\n\n doc.versions[v].dist.tarball = h + t\n } else {\n doc.versions[v].dist.noattachment = true\n }\n }\n }\n if (doc[\"dist-tags\"]) for (var tag in doc[\"dist-tags\"]) {\n var clean = semver.clean(doc[\"dist-tags\"][tag], true)\n if (!clean) delete doc[\"dist-tags\"][tag]\n else doc[\"dist-tags\"][tag] = clean\n }\n // end kludge\n\n if (req.query.version) {\n // could be either one!\n var ver = req.query.version\n var clean = semver.clean(ver, true)\n\n if (clean && clean !== ver && (clean in doc.versions))\n ver = clean\n\n // if not a valid version, then treat as a tag.\n if ((!(ver in doc.versions) && (ver in doc[\"dist-tags\"]))\n || !semver.valid(ver)) {\n ver = doc[\"dist-tags\"][ver]\n }\n body = doc.versions[ver]\n if (!body) {\n code = 404\n body = {\"error\" : \"version not found: \"+req.query.version}\n }\n } else {\n body = doc\n for (var i in body) if (i.charAt(0) === \"_\" && i !== \"_id\" && i !== \"_rev\" && i !== \"_attachments\") {\n delete body[i]\n }\n for (var i in body.time) {\n if (!body.versions[i]) delete body.time[i]\n else body.time[i] = new Date(Date.parse(body.time[i])).toISOString()\n }\n }\n\n body = req.query.jsonp\n ? req.query.jsonp + \"(\" + JSON.stringify(body) + \")\"\n : toJSON(body)\n\n return {\n code : code,\n body : body,\n headers : headers\n }\n}"},"updates":{"package":"function (doc, req) {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n\n var semver = require(\"semver\")\n var valid = require(\"valid\")\n function error (reason) {\n return [{_id: \"error: forbidden\", forbidden:reason}, JSON.stringify({forbidden:reason})]\n }\n\n function ok (doc, message) {\n delete doc.mtime\n delete doc.ctime\n var time = doc.time = doc.time || {}\n time.modified = (new Date()).toISOString()\n time.created = time.created || time.modified\n for (var v in doc.versions) {\n var ver = doc.versions[v]\n delete ver.ctime\n delete ver.mtime\n time[v] = time[v] || (new Date()).toISOString()\n }\n return [doc, JSON.stringify({ok:message})]\n }\n\n if (doc) {\n if (req.query.version) {\n var parsed = semver.valid(req.query.version, true)\n if (!parsed) {\n // it's a tag.\n var tag = req.query.version\n , ver = JSON.parse(req.body)\n if (!semver.valid(ver)) {\n return error(\"setting tag \"+tag+\" to invalid version: \"+req.body)\n }\n doc[\"dist-tags\"][tag] = semver.clean(ver, true)\n return ok(doc, \"updated tag\")\n }\n // adding a new version.\n var ver = req.query.version\n if (!semver.valid(ver, true)) {\n return error(\"invalid version: \"+ver)\n }\n\n if ((ver in doc.versions) || (semver.clean(ver) in doc.versions)) {\n // attempting to overwrite an existing version.\n // not supported at this time.\n if (!req.query.rev || req.query.rev !== doc._rev) {\n return error(\"cannot modify existing version\")\n }\n }\n\n var body = JSON.parse(req.body)\n if (!valid.name(body.name)) {\n return error( \"Invalid name: \"+JSON.stringify(body.name))\n }\n body.version = semver.clean(body.version, true)\n ver = semver.clean(ver, true)\n if (body.version !== ver) {\n return error( \"version in doc doesn't match version in request: \"\n + JSON.stringify(body.version)\n + \" !== \" + JSON.stringify(ver) )\n }\n body._id = body.name + \"@\" + body.version\n if (body.description) doc.description = body.description\n if (body.author) doc.author = body.author\n if (body.repository) doc.repository = body.repository\n body.maintainers = doc.maintainers\n\n if (body.publishConfig && typeof body.publishConfig === 'object') {\n Object.keys(body.publishConfig).filter(function (k) {\n return k.match(/^_/)\n }).forEach(function (k) {\n delete body.publishConfig[k]\n })\n }\n\n var tag = req.query.tag\n || (body.publishConfig && body.publishConfig.tag)\n || body.tag\n || \"latest\"\n\n if (!req.query.pre)\n doc[\"dist-tags\"][tag] = body.version\n if (!doc[\"dist-tags\"].latest)\n doc[\"dist-tags\"].latest = body.version\n doc.versions[ver] = body\n doc.time = doc.time || {}\n doc.time[ver] = (new Date()).toISOString()\n return ok(doc, \"added version\")\n }\n\n // update the package info\n var newdoc = JSON.parse(req.body)\n , changed = false\n if (doc._rev && doc._rev !== newdoc._rev) {\n return error( \"must supply latest _rev to update existing package\" )\n }\n for (var i in newdoc) if (typeof newdoc[i] === \"string\" || i === \"maintainers\") {\n doc[i] = newdoc[i]\n }\n if (newdoc.versions) {\n doc.versions = newdoc.versions\n }\n if (newdoc[\"dist-tags\"]) {\n doc[\"dist-tags\"] = newdoc[\"dist-tags\"]\n }\n if (newdoc.users) {\n if (!doc.users) doc.users = {}\n doc.users[req.userCtx.name] = newdoc.users[req.userCtx.name]\n }\n return ok(doc, \"updated package metadata\")\n } else {\n // Create new package doc\n doc = JSON.parse(req.body)\n if (!doc._id) doc._id = doc.name\n if (!doc.versions) doc.versions = {}\n var latest\n for (var v in doc.versions) {\n if (!semver.valid(v, true)) return error(\"Invalid version: \"+JSON.stringify(v))\n var p = doc.versions[v]\n if (p.version !== v) return error(\"Version mismatch: \"+JSON.stringify(v)\n +\" !== \"+JSON.stringify(p.version))\n if (!valid.name(p.name)) return error(\"Invalid name: \"+JSON.stringify(p.name))\n latest = semver.clean(v, true)\n }\n if (!doc['dist-tags']) doc['dist-tags'] = {}\n if (latest) doc[\"dist-tags\"].latest = latest\n return ok(doc, \"created new entry\")\n }\n}"},"rewrites":[{"from":"/","to":"../../../registry","method":"GET"},{"from":"/-/jsonp/:jsonp","to":"_list/short/listAll","method":"GET"},{"from":"/_session","to":"../../../_session","method":"GET"},{"from":"/_session","to":"../../../_session","method":"PUT"},{"from":"/_session","to":"../../../_session","method":"POST"},{"from":"/_session","to":"../../../_session","method":"DELETE"},{"from":"/_session","to":"../../../_session","method":"HEAD"},{"from":"/-/all/since","to":"_list/index/modified","method":"GET"},{"from":"/-/rss","to":"_list/rss/modified","method":"GET"},{"from":"/-/rss/:package","to":"_list/rss/modifiedPackage","method":"GET"},{"from":"/-/all","to":"_list/index/listAll","method":"GET"},{"from":"/-/all/-/jsonp/:jsonp","to":"_list/index/listAll","method":"GET"},{"from":"/-/short","to":"_list/short/listAll","method":"GET"},{"from":"/-/scripts","to":"_list/scripts/scripts","method":"GET"},{"from":"/-/by-field","to":"_list/byField/byField","method":"GET"},{"from":"/-/fields","to":"_list/sortCount/fieldsInUse","method":"GET","query":{"group":"true"}},{"from":"/-/needbuild","to":"_list/needBuild/needBuild","method":"GET"},{"from":"/-/prebuilt","to":"_list/preBuilt/needBuild","method":"GET"},{"from":"/-/nonlocal","to":"_list/short/nonlocal","method":"GET"},{"from":"/favicon.ico","to":"../../npm/favicon.ico","method":"GET"},{"from":"/-/users","to":"../../../_users/_design/_auth/_list/index/listAll","method":"GET"},{"from":"/-/user/:user","to":"../../../_users/:user","method":"PUT"},{"from":"/-/user/:user/-rev/:rev","to":"../../../_users/:user","method":"PUT"},{"from":"/-/user/:user","to":"../../../_users/:user","method":"GET"},{"from":"/_users/:user","to":"../../../_users/:user","method":"PUT"},{"from":"/_users/:user","to":"../../../_users/:user","method":"GET"},{"from":"/public_users/:user","to":"../../../public_users/:user","method":"PUT"},{"from":"/public_users/:user","to":"../../../public_users/:user","method":"GET"},{"from":"/-/user-by-email/:email","to":"../../../_users/_design/_auth/_list/email/listAll","method":"GET"},{"from":"/-/top","to":"_view/npmTop","query":{"group_level":1},"method":"GET"},{"from":"/-/by-user/:user","to":"_list/byUser/byUser","method":"GET"},{"from":"/-/starred-by-user/:user","to":"_list/byUser/starredByUser","method":"GET"},{"from":"/-/starred-by-package/:user","to":"_list/byUser/starredByPackage","method":"GET"},{"from":"/:pkg","to":"/_show/package/:pkg","method":"GET"},{"from":"/:pkg/-/jsonp/:jsonp","to":"/_show/package/:pkg","method":"GET"},{"from":"/:pkg/:version","to":"_show/package/:pkg","method":"GET"},{"from":"/:pkg/:version/-/jsonp/:jsonp","to":"_show/package/:pkg","method":"GET"},{"from":"/:pkg/-/:att","to":"../../:pkg/:att","method":"GET"},{"from":"/:pkg/-/:att/:rev","to":"../../:pkg/:att","method":"PUT"},{"from":"/:pkg/-/:att/-rev/:rev","to":"../../:pkg/:att","method":"PUT"},{"from":"/:pkg/-/:att/:rev","to":"../../:pkg/:att","method":"DELETE"},{"from":"/:pkg/-/:att/-rev/:rev","to":"../../:pkg/:att","method":"DELETE"},{"from":"/:pkg","to":"/_update/package/:pkg","method":"PUT"},{"from":"/:pkg/-rev/:rev","to":"/_update/package/:pkg","method":"PUT"},{"from":"/:pkg/:version","to":"_update/package/:pkg","method":"PUT"},{"from":"/:pkg/:version/-rev/:rev","to":"_update/package/:pkg","method":"PUT"},{"from":"/:pkg/:version/-tag/:tag","to":"_update/package/:pkg","method":"PUT"},{"from":"/:pkg/:version/-tag/:tag/-rev/:rev","to":"_update/package/:pkg","method":"PUT"},{"from":"/:pkg/:version/-pre/:pre","to":"_update/package/:pkg","method":"PUT"},{"from":"/:pkg/:version/-pre/:pre/-rev/:rev","to":"_update/package/:pkg","method":"PUT"},{"from":"/:pkg/-rev/:rev","to":"../../:pkg","method":"DELETE"},{"from":"/-/_view/*","to":"_view/*","method":"GET"},{"from":"/-/_list/*","to":"_list/*","method":"GET"},{"from":"/-/_show/*","to":"_show/*","method":"GET"}],"views":{"noCDN":{"map":"function (doc) {\n if (!doc.versions || Object.keys(doc.versions).length === 0)\n return\n Object.keys(doc.versions).forEach(function(v) {\n if (doc.versions[v].dist.cdn)\n return\n emit([doc._id, v], 1)\n })\n}","reduce":"_sum"},"updated":{"map":"function (doc) {\n var l = doc[\"dist-tags\"].latest\n , t = doc.time && doc.time[l]\n if (t) emit(t, 1)\n}"},"listAll":{"map":"function (doc) { return emit(doc._id, doc) }"},"allVersions":{"map":"function (doc) {\n if (!doc || !doc.versions)\n return\n for (var i in doc.versions)\n emit([i, doc._id], 1)\n}","reduce":"_sum"},"modified":{"map":"function (doc) {\n if (!doc.versions || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var latest = doc[\"dist-tags\"].latest\n if (!doc.versions[latest]) return\n var time = doc.time && doc.time[latest] || 0\n var t = new Date(time)\n emit(t.getTime(), doc)\n}"},"modifiedPackage":{"map":"function (doc) {\n if (!doc.versions || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var latest = doc[\"dist-tags\"].latest\n if (!doc.versions[latest]) return\n var time = doc.time && doc.time[latest] || 0\n var t = new Date(time)\n emit([doc._id, t.getTime()], doc)\n}"},"noShasum":{"map":"function (doc) {\n if (!doc || !doc.versions)\n return\n\n for (var ver in doc.versions) {\n var version = doc.versions[ver]\n if (!version || !version.dist || !version.dist.shasum) {\n emit([doc.name, ver, !!version, !!version.dist, !!version.shasum], 1)\n }\n }\n}","reduce":"_sum"},"byEngine":{"map":"function (doc) {\n if (!doc || !doc.versions || !doc[\"dist-tags\"] || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc[\"dist-tags\"].latest\n var d = doc.versions[v]\n if (d && d.engines) emit(doc._id, [d.engines, doc.maintainers])\n }"},"countVersions":{"map":"function (doc) {\n if (!doc || !doc.name || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var i = 0\n if (!doc.versions) return emit([i, doc._id], 1)\n for (var v in doc.versions) i++\n emit([i, doc._id], 1)\n}","reduce":"_sum"},"byKeyword":{"map":"function (doc) {\n if (!doc || !doc.versions || !doc['dist-tags'] || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc.versions[doc['dist-tags'].latest]\n if (!v || !v.keywords || !Array.isArray(v.keywords)) return\n v.keywords.forEach(function (kw) {\n emit([kw.toLowerCase(), doc.name, doc.description], 1)\n })\n }","reduce":"_sum"},"byField":{"map":"function (doc) {\n if (!doc || !doc.versions || !doc[\"dist-tags\"]) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc[\"dist-tags\"].latest\n //Object.keys(doc.versions).forEach(function (v) {\n var d = doc.versions[v]\n if (!d) return\n //emit(d.name + \"@\" + d.version, d.dist.bin || {})\n var out = {}\n for (var i in d) {\n out[i] = d[i] //true\n if (d[i] && typeof d[i] === \"object\" &&\n (i === \"scripts\" || i === \"directories\")) {\n for (var j in d[i]) out[i + \".\" + j] = d[i][j]\n }\n }\n out.maintainers = doc.maintainers\n emit(doc._id, out)\n //})\n }"},"needBuild":{"map":"function (doc) {\n\n if (!doc || !doc.versions || !doc[\"dist-tags\"]) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc[\"dist-tags\"].latest\n //Object.keys(doc.versions).forEach(function (v) {\n var d = doc.versions[v]\n if (!d) return\n if (!d.scripts) return\n var inst = d.scripts.install\n || d.scripts.preinstall\n || d.scripts.postinstall\n if (!inst) return\n //emit(d.name + \"@\" + d.version, d.dist.bin || {})\n emit(d._id, d.dist.bin || {})\n //})\n }"},"scripts":{"map":"function (doc) {\n if (!doc || !doc.versions || !doc[\"dist-tags\"]) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc[\"dist-tags\"].latest\n v = doc.versions[v]\n if (!v || !v.scripts) return\n var out = {}\n var any = false\n for (var i in v.scripts) {\n out[i] = v.scripts[i]\n any = true\n }\n if (!any) return\n out.maintainers = doc.maintainers\n emit(doc._id, out)\n }"},"nodeWafInstall":{"map":"function (doc) {\n if (!doc || !doc.versions || !doc[\"dist-tags\"]) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc[\"dist-tags\"].latest\n if (!doc.versions[v]) return\n if (!doc.versions[v].scripts) return\n for (var i in doc.versions[v].scripts) {\n if (doc.versions[v].scripts[i].indexOf(\"node-waf\") !== -1 ||\n doc.versions[v].scripts[i].indexOf(\"make\") !== -1) {\n emit(doc._id, doc.versions[v]._id)\n return\n }\n }\n }"},"badBins":{"map":"function (doc) {\n if (!doc || !doc.versions || !doc[\"dist-tags\"]) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc[\"dist-tags\"].latest\n if (!doc.versions[v]) return\n v = doc.versions[v]\n var b = v.bin\n , d = v.directories && v.directories.bin\n if (!b && !d) return\n if (b && (typeof b === \"string\" || Object.keys(b).length === 1)) {\n // it's ok.\n return\n }\n emit(doc._id, {binHash:b, binDir:d})\n }"},"orphanAttachments":{"map":"function (doc) {\n if (!doc || !doc._attachments) return\n var orphans = []\n , size = 0\n for (var i in doc._attachments) {\n var n = i.substr(doc._id.length + 1).replace(/\\.tgz$/, \"\")\n .replace(/^v/, \"\")\n if (!doc.versions[n] && i.match(/\\.tgz$/)) {\n orphans.push(i)\n size += doc._attachments[i].length\n }\n }\n if (orphans.length) emit(doc._id, {size:size, orphans:orphans})\n }"},"starredByUser":{"map":"function (doc) {\n if (!doc || !doc.users) return\n if (doc._id.match(/^npm-test-.+$/) && doc.maintainers[0].name === 'isaacs')\n return\n Object.keys(doc.users).forEach(function (m) {\n if (!doc.users[m]) return\n emit(m, doc._id)\n })\n}"},"starredByPackage":{"map":"function (doc) {\n if (!doc || !doc.users) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n Object.keys(doc.users).forEach(function (m) {\n if (!doc.users[m]) return\n emit(doc._id, m)\n })\n}"},"byUser":{"map":"function (doc) {\n if (!doc || !doc.maintainers) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n doc.maintainers.forEach(function (m) {\n emit(m.name, doc._id)\n })\n}"},"browseAuthorsRecent":{"map":"function (doc) {\n if (!doc || !doc.maintainers || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n l = l && doc.versions && doc.versions[l]\n if (!l) return\n var t = doc.time && doc.time[l.version]\n if (!t) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n doc.maintainers.forEach(function (m) {\n // Have to sum it up by the author name in the app.\n // couchdb makes me sad sometimes.\n emit([t, m.name, doc._id, desc, readme], 1)\n })\n}","reduce":"_sum"},"npmTop":{"map":"function (doc) {\n if (!doc || !doc.maintainers || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n l = l && doc.versions && doc.versions[l]\n if (!l) return\n var t = doc.time && doc.time[l.version]\n if (!t) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n doc.maintainers.forEach(function (m) {\n emit([m.name, doc._id, desc, t, readme], 1)\n })\n}","reduce":"_sum"},"browseAuthors":{"map":"function (doc) {\n if (!doc || !doc.maintainers || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n l = l && doc.versions && doc.versions[l]\n if (!l) return\n var t = doc.time && doc.time[l.version]\n if (!t) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n doc.maintainers.forEach(function (m) {\n emit([m.name, doc._id, desc, t, readme], 1)\n })\n}","reduce":"_sum"},"browseUpdated":{"map":"function (doc) {\n if (!doc || !doc.versions || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n if (!l) return\n var t = doc.time && doc.time[l]\n if (!t) return\n var v = doc.versions[l]\n if (!v) return\n var d = new Date(t)\n if (!d.getTime()) return\n emit([ d.toISOString(),\n doc._id,\n v.description,\n v.readme ], 1)\n}","reduce":"_sum"},"browseAll":{"map":"function (doc) {\n if (!doc || !doc.versions || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n if (!l) return\n l = doc.versions && doc.versions[l]\n if (!l) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n emit([doc.name, desc, readme], 1)\n}","reduce":"_sum"},"analytics":{"map":"function (doc) {\n if (!doc || !doc.time || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n for (var i in doc.time) {\n var t = doc.time[i]\n var d = new Date(t)\n if (!d.getTime()) return\n var type = i === 'modified' ? 'latest'\n : i === 'created' ? 'created'\n : 'update'\n emit([ type,\n d.getUTCFullYear(),\n d.getUTCMonth() + 1,\n d.getUTCDate(),\n doc._id ], 1)\n }\n}","reduce":"_sum"},"dependedUpon":{"map":"function (doc) {\n if (!doc || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n if (!l) return\n l = doc.versions && doc.versions[l]\n if (!l) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n var d = l.dependencies\n if (!d) return\n for (var dep in d) {\n emit([dep, doc._id, desc, readme], 1)\n }\n}","reduce":"_sum"},"dependentVersions":{"map":"function (doc) {\n if (!doc || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n if (!l) return\n l = doc.versions && doc.versions[l]\n if (!l) return\n var deps = l.dependencies\n if (!deps) return\n for (var dep in deps)\n emit([dep, deps[dep], doc._id], 1)\n}","reduce":"_sum"},"browseStarUser":{"map":"function (doc) {\n if (!doc) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n if (!l) return\n l = doc.versions && doc.versions[l]\n if (!l) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n var d = doc.users\n if (!d) return\n for (var user in d) {\n emit([user, doc._id, desc, readme], 1)\n }\n}","reduce":"_sum"},"browseStarPackage":{"map":"function (doc) {\n if (!doc || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n if (!l) return\n l = doc.versions && doc.versions[l]\n if (!l) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n var d = doc.users\n if (!d) return\n for (var user in d) {\n emit([doc._id, desc, user, readme], 1)\n }\n}","reduce":"_sum"},"fieldsInUse":{"map":"function (doc) {\n if (!doc.versions || !doc[\"dist-tags\"] || !doc[\"dist-tags\"].latest || doc.deprecated) {\n return\n }\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var d = doc.versions[doc[\"dist-tags\"].latest]\n if (!d) return\n for (var f in d) {\n emit(f, 1)\n if (d[f] && typeof d[f] === \"object\" &&\n (f === \"scripts\" || f === \"directories\")) {\n for (var i in d[f]) emit(f+\".\"+i, 1)\n }\n }\n}","reduce":"_sum"},"howBigIsYourPackage":{"map":"function (doc) {\n if (!doc) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var s = 0\n , c = 0\n for (var i in doc._attachments) {\n s += doc._attachments[i].length\n c ++\n }\n if (s === 0) return\n emit(doc._id, {_id: doc._id, size: s, count: c, avg: s/c})\n }"}},"lists":{"first":"function (head, req) {\n var row = getRow()\n send(toJSON([row, row.id, row.doc]))\n}","short":"function (head, req) {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n\n var out = {}\n , row\n , show = (req.query.show || \"\").split(\",\")\n , v = show.indexOf(\"version\") !== -1\n , t = show.indexOf(\"tag\") !== -1\n while (row = getRow()) {\n if (!row.id) continue\n if (!t && !v) {\n out[row.id] = true\n continue\n }\n var val = row.value\n if (t) Object.keys(val[\"dist-tags\"] || {}).forEach(function (t) {\n out[row.id + \"@\" + t] = true\n })\n if (v) Object.keys(val.versions || {}).forEach(function (v) {\n out[row.id + \"@\" + v] = true\n })\n }\n send(toJSON(Object.keys(out)))\n}","rss":"function (head, req) {\n var limit = +req.query.limit\n , desc = req.query.descending\n if (!desc || !limit || limit > 50 || limit < 0) {\n start({ code: 403\n , headers: { 'Content-type': 'text/xml' }})\n send('<error><![CDATA[Please retry your request with '\n + '?descending=true&limit=50 query params]]></error>')\n return\n }\n\n start({ code: 200\n // application/rss+xml is correcter, but also annoyinger\n , headers: { \"Content-Type\": \"text/xml\" } })\n send('<?xml version=\"1.0\" encoding=\"UTF-8\"?>'\n +'\\n<!DOCTYPE rss PUBLIC \"-//Netscape Communications//DTD RSS 0.91//EN\" '\n +'\"http://my.netscape.com/publish/formats/rss-0.91.dtd\">'\n +'\\n<rss version=\"0.91\">'\n +'\\n <channel>'\n +'\\n <title>npm recent updates</title>'\n +'\\n <link>http://search.npmjs.org/</link>'\n +'\\n <description>Updates to the npm package registry</description>'\n +'\\n <language>en</language>')\n\n var row\n while (row = getRow()) {\n if (!row.value || !row.value[\"dist-tags\"]) continue\n\n var doc = row.value\n var authors = doc.maintainers.map(function (m) {\n return '<author>' + m.name + '</author>'\n }).join('\\n ')\n\n var latest = doc[\"dist-tags\"].latest\n var time = doc.time && doc.time[latest]\n var date = new Date(time)\n doc = doc.versions[latest]\n if (!doc || !time || !date) continue\n\n var url = \"https://npmjs.org/package/\" + doc.name\n\n send('\\n <item>'\n +'\\n <title>' + doc._id + '</title>'\n +'\\n <link>' + url + '</link>'\n +'\\n ' + authors\n +'\\n <description><![CDATA['\n + (doc.description || '').trim() + ']]></description>'\n +'\\n <pubDate>' + date.toISOString() + '</pubDate>'\n +'\\n </item>')\n }\n send('\\n </channel>'\n +'\\n</rss>')\n}","index":"function (head, req) {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n var basePath = req.requested_path\n if (basePath.indexOf(\"_list\") === -1) basePath = \"\"\n else {\n basePath = basePath.slice(0, basePath.indexOf(\"_list\"))\n .concat([\"_rewrite\", \"\"]).join(\"/\")\n }\n\n var row\n , semver = require(\"semver\")\n , res = []\n\n if (req.query.jsonp) send(req.query.jsonp + \"(\")\n send('{\"_updated\":' + Date.now())\n while (row = getRow()) {\n if (!row.id) continue\n\n var doc = row.value\n if (!doc.name || !doc._id ||\n encodeURIComponent(doc._id) !== doc._id) continue\n\n var p = {}\n\n // legacy kludge\n delete doc.mtime\n delete doc.ctime\n if (doc.versions) for (var v in doc.versions) {\n var clean = semver.clean(v)\n delete doc.versions[v].ctime\n delete doc.versions[v].mtime\n if (clean !== v) {\n var x = doc.versions[v]\n delete doc.versions[v]\n x.version = v = clean\n doc.versions[clean] = x\n }\n }\n if (doc[\"dist-tags\"]) for (var tag in doc[\"dist-tags\"]) {\n var clean = semver.clean(doc[\"dist-tags\"][tag])\n if (!clean) delete doc[\"dist-tags\"][tag]\n else doc[\"dist-tags\"][tag] = clean\n }\n // end kludge\n\n for (var i in doc) {\n if (i === \"versions\" || i.charAt(0) === \"_\" || i === 'readme' ||\n i === 'time') continue\n p[i] = doc[i]\n }\n if (doc.time) {\n p.time = { modified: doc.time.modified }\n }\n if (p['dist-tags'] && typeof p['dist-tags'] === 'object') {\n p.versions = Object.keys(p['dist-tags']).reduce(function (ac, v) {\n ac[ p['dist-tags'][v] ] = v\n return ac\n }, {})\n }\n if (doc.repositories && Array.isArray(doc.repositories)) {\n doc.repository = doc.repositories[0]\n delete doc.repositories\n }\n if (doc.repository) p.repository = doc.repository\n if (doc.description) p.description = doc.description\n for (var i in doc.versions) {\n if (doc.versions[i].repository && !doc.repository) {\n p.repository = doc.versions[i].repository\n }\n if (doc.versions[i].keywords) p.keywords = doc.versions[i].keywords\n }\n send(',' + JSON.stringify(doc._id) + ':' + JSON.stringify(p))\n }\n send('}')\n if (req.query.jsonp) send(')')\n\n}","byField":"function (head, req) {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n\n if (!req.query.field) {\n start({\"code\":\"400\", \"headers\": {\"Content-Type\": \"application/json\"}})\n send('{\"error\":\"Please specify a field parameter\"}')\n return\n }\n\n start({\"code\": 200, \"headers\": {\"Content-Type\": \"application/json\"}})\n var row\n , out = {}\n , field = req.query.field\n , not = field.charAt(0) === \"!\"\n if (not) field = field.substr(1)\n while (row = getRow()) {\n if (!row.id) continue\n var has = row.value.hasOwnProperty(field)\n if (!not && !has || not && has) continue\n out[row.key] = { \"maintainers\": row.value.maintainers.map(function (m) {\n return m.name + \" <\" + m.email + \">\"\n }) }\n if (has) out[row.key][field] = row.value[field]\n }\n send(JSON.stringify(out))\n}","preBuilt":"function (head, req) {\n start({\"code\": 200, \"headers\": {\"Content-Type\": \"text/plain\"}});\n var row\n , out = []\n while (row = getRow()) {\n if (!row.id) continue\n if (!(req.query.bindist && row.value[req.query.bindist])) continue\n out.push(row.key)\n }\n send(out.join(\"\\n\"))\n}","needBuild":"function (head, req) {\n start({\"code\": 200, \"headers\": {\"Content-Type\": \"text/plain\"}});\n var row\n , first = true\n while (row = getRow()) {\n if (!row.id) continue\n if (req.query.bindist && row.value[req.query.bindist]) continue\n // out.push(row.key)\n send((first ? \"{\" : \",\")\n + JSON.stringify(row.key)\n + \":\"\n + JSON.stringify(Object.keys(row.value))\n + \"\\n\")\n first = false\n }\n send(\"}\\n\")\n}","scripts":"function (head, req) {\n var row\n , out = {}\n , scripts = req.query.scripts && req.query.scripts.split(\",\")\n , match = req.query.match\n\n if (match) match = new RegExp(match)\n\n while (row = getRow()) {\n inc = true\n if (!row.id) continue\n if (req.query.package && row.id !== req.query.package) continue\n if (scripts && scripts.length) {\n var inc = false\n for (var s = 0, l = scripts.length; s < l && !inc; s ++) {\n inc = row.value[scripts[s]]\n if (match) inc = inc && row.value[scripts[s]].match(match)\n }\n if (!inc) continue\n }\n out[row.id] = row.value\n }\n send(toJSON(out))\n}","rowdump":"function (head, req) {\n var rows = []\n while (row = getRow()) rows.push(row)\n send(toJSON(rows))\n}","passthrough":"function (head, req) {\n var out = {}\n , row\n while (row = getRow()) {\n if (!row.id) continue\n out[row.id] = row.value\n }\n send(toJSON(out))\n}","byUser":"function (head, req) {\n var out = {}\n , user = req.query.user && req.query.user !== \"-\" ? req.query.user : null\n , users = user && user.split(\"|\")\n while (row = getRow()) {\n if (!user || users.indexOf(row.key) !== -1) {\n var l = out[row.key] = out[row.key] || []\n l.push(row.value)\n }\n }\n send(toJSON(out))\n}","sortCount":"function (head, req) {\n var out = []\n while (row = getRow()) {\n out.push([row.key, row.value])\n }\n out = out.sort(function (a, b) {\n return a[1] === b[1] ? 0\n : a[1] < b[1] ? 1 : -1\n })\n var outObj = {}\n for (var i = 0, l = out.length; i < l; i ++) {\n outObj[out[i][0]] = out[i][1]\n }\n send(toJSON(outObj))\n}","size":"function (head, req) {\n var row\n , out = []\n , max = 0\n while (row = getRow()) {\n if (!row.id) continue\n out.push(row.value)\n }\n var list = []\n out = out.sort(function (a, b) {\n max = Math.max(max, a.size, b.size)\n return a.size > b.size ? -1 : 1\n })\n .reduce(function (l, r) {\n var stars = new Array(Math.ceil(80 * (r.size/max)) + 1).join(\"\\u25FE\")\n l[r._id] = { size: r.size\n , count: r.count\n , avg: r.avg\n , rel: r.size / max\n , s: stars\n }\n return l\n }, {})\n send(JSON.stringify(out))\n}","histogram":"function (head, req) {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n start({\"code\": 200, \"headers\": {\"Content-Type\": \"text/plain\"}});\n var row\n , out = []\n , max = {}\n , field = req.query.field\n , sort = req.query.sort\n , doAll = !field\n\n while (row = getRow()) {\n if (!row.id) continue\n out.push(row.value)\n }\n\n if (!doAll) out.sort(function (a, b) {\n max[field] = Math.max(max[field] || -Infinity, a[field], b[field])\n return a[field] > b[field] ? -1 : 1\n })\n else out.sort(function (a, b) {\n for (var field in a) if (field.charAt(0) !== \"_\" && !isNaN(a[field])) {\n max[field] = Math.max(max[field] || -Infinity, a[field])\n }\n for (var field in b) if (field.charAt(0) !== \"_\" && !isNaN(b[field])) {\n max[field] = Math.max(max[field] || -Infinity, b[field])\n }\n if (sort) {\n return Number(a[sort]) > Number(b[sort]) ? -1 : 1\n } else {\n return 0\n }\n })\n if (doAll) {\n // sort the fields by the max sizes.\n var m = {}\n Object.keys(max).sort(function (a, b) {\n return max[a] > max[b] ? -1 : 1\n }).forEach(function (k) { m[k] = max[k] })\n max = m\n }\n out = out.map(function (a) {\n var o = {}\n for (var f in max) {\n var blk = new Array(Math.ceil(80*(a[f] / max[f])+1)).join(\"#\")\n , spc = new Array(80 - blk.length + 1).join(\" \")\n o[f] = spc + blk + \" \" + a[f]\n }\n o._id = a._id\n return o\n }).reduce(function (l, r) {\n l[r._id] = r\n return l\n }, {})\n\n var spc = new Array(82).join(\" \")\n send(Object.keys(out).map(function (i) {\n if (doAll) return [spc + i].concat(Object.keys(max).map(function (f) {\n return out[i][f] + \" \" + f\n })).join(\"\\n\") + \"\\n\"\n return out[i][field] + \" \" + i\n }).join(\"\\n\"))\n}"},"validate_doc_update":"function (doc, oldDoc, user, dbCtx) {\n function assert (ok, message) {\n if (!ok) throw {forbidden:message}\n }\n\n // can't write to the db without logging in.\n if (!user) {\n throw { unauthorized: \"Please log in before writing to the db\" }\n }\n\n try {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n } catch (er) {\n assert(false, \"failed monkeypatching\")\n }\n\n try {\n var semver = require(\"semver\")\n var valid = require(\"valid\")\n var deep = require(\"deep\")\n var deepEquals = deep.deepEquals\n } catch (er) {\n assert(false, \"failed loading modules\")\n }\n\n try {\n if (oldDoc) oldDoc.users = oldDoc.users || {}\n doc.users = doc.users || {}\n } catch (er) {\n assert(false, \"failed checking users\")\n }\n\n\n // admins can do ANYTHING (even break stuff)\n try {\n if (isAdmin()) return\n } catch (er) {\n assert(false, \"failed checking admin-ness\")\n }\n\n // figure out what changed in the doc.\n function diffObj (o, n, p) {\n p = p || \"\"\n var d = []\n var seenKeys = []\n\n for (var i in o) {\n seenKeys.push(i)\n if (n[i] === undefined) {\n d.push(\"Deleted: \"+p+i)\n }\n else if (typeof o[i] !== typeof n[i]) {\n d.push(\"Changed Type: \"+p+i)\n }\n else if (typeof o[i] === \"object\") {\n if (o[i]) {\n if (n[i]) {\n d = d.concat(diffObj(o[i], n[i], p + i + \".\"))\n } else {\n d.push(\"Nulled: \"+p+i)\n }\n } else {\n if (n[i]) {\n d.push(\"Un-nulled: \"+p+i)\n } else {\n // they're both null, and thus equal. do nothing.\n }\n }\n }\n // non-object, non-null\n else if (o[i] !== n[i]) {\n d.push(\"Changed: \"+p+i+\" \"+JSON.stringify(o[i]) + \" -> \"\n +JSON.stringify(n[i]))\n }\n }\n\n for (var i in n) {\n if (-1 === seenKeys.indexOf(i)) {\n d.push(\"Added: \"+p+i)\n }\n }\n return d\n }\n\n // if the doc is an {error:\"blerg\"}, then throw that right out.\n // something detected in the _updates/package script.\n // XXX: Make this not ever happen ever. Validation belongs here,\n // not in the update function.\n try {\n assert(!doc.forbidden || doc._deleted, doc.forbidden)\n } catch (er) {\n assert(false, \"failed checking doc.forbidden or doc._deleted\")\n }\n\n // everyone may alter his \"starred\" status on any package\n try {\n if (oldDoc &&\n !doc._deleted &&\n deepEquals(doc, oldDoc,\n [[\"users\", user.name], [\"time\", \"modified\"]])) {\n return\n }\n } catch (er) {\n assert(false, \"failed checking starred stuff\")\n }\n\n\n // check if the user is allowed to write to this package.\n function validUser () {\n if ( !oldDoc || !oldDoc.maintainers ) return true\n if (isAdmin()) return true\n if (typeof oldDoc.maintainers !== \"object\") return true\n for (var i = 0, l = oldDoc.maintainers.length; i < l; i ++) {\n if (oldDoc.maintainers[i].name === user.name) return true\n }\n return false\n }\n\n function isAdmin () {\n if (dbCtx &&\n dbCtx.admins) {\n if (dbCtx.admins.names &&\n dbCtx.admins.roles &&\n dbCtx.admins.names.indexOf(user.name) !== -1) return true\n for (var i=0;i<user.roles.length;i++) {\n if (dbCtx.admins.roles.indexOf(user.roles[i]) !== -1) return true\n }\n }\n return user && user.roles.indexOf(\"_admin\") >= 0\n }\n\n try {\n var vu = validUser()\n } catch (er) {\n assert(false, \"problem checking user validity\");\n }\n\n if (!vu) {\n assert(vu, \"user: \" + user.name + \" not authorized to modify \"\n + oldDoc.name + \"\\n\"\n + diffObj(oldDoc, doc).join(\"\\n\"))\n }\n\n // deleting a document entirely *is* allowed.\n if (doc._deleted) return\n\n // sanity checks.\n assert(valid.name(doc.name), \"name invalid: \"+doc.name)\n\n // New documents may only be created with all lowercase names.\n // At some point, existing docs will be migrated to lowercase names\n // as well.\n if (!oldDoc && doc.name !== doc.name.toLowerCase()) {\n assert(false, \"New packages must have all-lowercase names\")\n }\n\n assert(doc.name === doc._id, \"name must match _id\")\n assert(!doc.mtime, \"doc.mtime is deprecated\")\n assert(!doc.ctime, \"doc.ctime is deprecated\")\n assert(typeof doc.time === \"object\", \"time must be object\")\n\n assert(typeof doc[\"dist-tags\"] === \"object\", \"dist-tags must be object\")\n\n var versions = doc.versions\n assert(typeof versions === \"object\", \"versions must be object\")\n\n var latest = doc[\"dist-tags\"].latest\n if (latest) {\n assert(versions[latest], \"dist-tags.latest must be valid version\")\n }\n\n // the 'latest' version must have a dist and shasum\n // I'd like to also require this of all past versions, but that\n // means going back and cleaning up about 2000 old package versions,\n // or else *new* versions of those packages can't be published.\n // Until that time, do this instead:\n var version = versions[latest]\n if (version) {\n if (!version.dist)\n assert(false, \"no dist object in \" + latest + \" version\")\n if (!version.dist.tarball)\n assert(false, \"no tarball in \" + latest + \" version\")\n if (!version.dist.shasum)\n assert(false, \"no shasum in \" + latest + \" version\")\n }\n\n for (var v in doc[\"dist-tags\"]) {\n var ver = doc[\"dist-tags\"][v]\n assert(semver.valid(ver, true),\n v + \" version invalid version: \" + ver)\n assert(versions[ver],\n v + \" version missing: \" + ver)\n }\n\n var depCount = 0\n var maxDeps = 5000\n function ridiculousDeps() {\n if (++depCount > maxDeps)\n assert(false, \"too many deps. please be less ridiculous.\")\n }\n for (var ver in versions) {\n var version = versions[ver]\n assert(semver.valid(ver, true),\n \"invalid version: \" + ver)\n assert(typeof version === \"object\",\n \"version entries must be objects\")\n assert(version.version === ver,\n \"version must match: \"+ver)\n assert(version.name === doc._id,\n \"version \"+ver+\" has incorrect name: \"+version.name)\n\n depCount = 0\n for (var dep in version.dependencies || {}) ridiculousDeps()\n for (var dep in version.devDependencies || {}) ridiculousDeps()\n for (var dep in version.optionalDependencies || {}) ridiculousDeps()\n }\n\n assert(Array.isArray(doc.maintainers),\n \"maintainers should be a list of owners\")\n doc.maintainers.forEach(function (m) {\n assert(m.name && m.email,\n \"Maintainer should have name and email: \" + JSON.stringify(m))\n })\n\n var time = doc.time\n var c = new Date(Date.parse(time.created))\n , m = new Date(Date.parse(time.modified))\n assert(c.toString() !== \"Invalid Date\",\n \"invalid created time: \" + JSON.stringify(time.created))\n\n assert(m.toString() !== \"Invalid Date\",\n \"invalid modified time: \" + JSON.stringify(time.modified))\n\n if (oldDoc &&\n oldDoc.time &&\n oldDoc.time.created &&\n Date.parse(oldDoc.time.created)) {\n assert(Date.parse(oldDoc.time.created) === Date.parse(time.created),\n \"created time cannot be changed\")\n }\n\n if (oldDoc && oldDoc.users) {\n assert(deepEquals(doc.users,\n oldDoc.users, [[user.name]]),\n \"you may only alter your own 'star' setting\")\n }\n\n if (doc.url) {\n assert(false,\n \"Package redirection has been removed. \"+\n \"Please update your publish scripts.\")\n }\n\n if (doc.description) {\n assert(typeof doc.description === 'string',\n '\"description\" field must be a string')\n }\n\n // at this point, we've passed the basic sanity tests.\n // Time to dig into more details.\n // Valid operations:\n // 1. Add a version\n // 2. Remove a version\n // 3. Modify a version\n // 4. Add or remove onesself from the \"users\" hash (already done)\n //\n // If a version is being added or changed, make sure that the\n // _npmUser field matches the current user, and that the\n // time object has the proper entry, and that the \"maintainers\"\n // matches the current \"maintainers\" field.\n //\n // Things that must not change:\n //\n // 1. More than one version being modified.\n // 2. Removing keys from the \"time\" hash\n //\n // Later, once we are off of the update function 3-stage approach,\n // these things should also be errors:\n //\n // 1. Lacking an attachment for any published version.\n // 2. Having an attachment for any version not published.\n\n var oldVersions = oldDoc ? oldDoc.versions || {} : {}\n var oldTime = oldDoc ? oldDoc.time || {} : {}\n\n var versions = Object.keys(doc.versions)\n , modified = null\n\n for (var i = 0, l = versions.length; i < l; i ++) {\n var v = versions[i]\n if (!v) continue\n assert(doc.time[v], \"must have time entry for \"+v)\n\n if (!deepEquals(doc.versions[v], oldVersions[v], [[\"directories\"], [\"deprecated\"]]) &&\n doc.versions[v]) {\n // this one was modified\n // if it's more than a few minutes off, then something is wrong.\n var t = Date.parse(doc.time[v])\n , n = Date.now()\n // assert(doc.time[v] !== oldTime[v] &&\n // Math.abs(n - t) < 1000 * 60 * 60,\n // v + \" time needs to be updated\\n\" +\n // \"new=\" + JSON.stringify(doc.versions[v]) + \"\\n\" +\n // \"old=\" + JSON.stringify(oldVersions[v]))\n\n // var mt = Date.parse(doc.time.modified).getTime()\n // , vt = t.getTime()\n // assert(Math.abs(mt - vt) < 1000 * 60 * 60,\n // v + \" is modified, should match modified time\")\n\n // XXX Remove the guard these once old docs have been found and\n // fixed. It's too big of a pain to have to manually fix\n // each one every time someone complains.\n if (typeof doc.versions[v]._npmUser !== \"object\") continue\n\n\n assert(typeof doc.versions[v]._npmUser === \"object\",\n \"_npmUser field must be object\\n\"+\n \"(You probably need to upgrade your npm version)\")\n assert(doc.versions[v]._npmUser.name === user.name,\n \"_npmUser.name must === user.name\")\n assert(deepEquals(doc.versions[v].maintainers,\n doc.maintainers),\n \"modified version 'maintainers' must === doc.maintainers\")\n\n // make sure that the _npmUser is one of the maintainers\n var found = false\n for (var j = 0, lm = doc.maintainers.length; j < lm; j ++) {\n var m = doc.maintainers[j]\n if (m.name === doc.versions[v]._npmUser.name) {\n found = true\n break\n }\n }\n assert(found, \"_npmUser must be a current maintainer.\\n\"+\n \"maintainers=\" + JSON.stringify(doc.maintainers)+\"\\n\"+\n \"current user=\" + JSON.stringify(doc.versions[v]._npmUser))\n\n } else if (oldTime[v]) {\n assert(oldTime[v] === doc.time[v],\n v + \" time should not be modified 1\")\n }\n }\n\n // now go through all the time settings that weren't covered\n for (var v in oldTime) {\n if (doc.versions[v] || !oldVersions[v]) continue\n assert(doc.time[v] === oldTime[v],\n v + \" time should not be modified 2\")\n }\n\n}","language":"javascript","deep":"exports.deepEquals = deepEquals\nexports.extend = deepExtend\nfunction deepExtend(o1, o2) {\n // extend o1 with o2 (in-place)\n for (var prop in o2) {\n if (hOP(o2, prop)) {\n if (hOP(o1, prop)) {\n if (typeof o1[prop] === \"object\") {\n deepExtend(o1[prop], o2[prop])\n }\n } else {\n o1[prop] = o2[prop]\n }\n }\n }\n return o1\n }\nfunction fullPath(pathPrefix, p){\n return pathPrefix.concat([p])\n }\nfunction isObject(v){\n return typeof v === 'object'\n }\nfunction arrayInArray(v, arr) {\n // Check whether `arr` contains an array that's shallowly equal to `v`.\n return arr.some(function(e) {\n if (e.length !== v.length) return false\n for (var i=0; i<e.length; i++) {\n if (e[i] !== v[i]) {\n return false\n }\n }\n return true\n })\n }\nfunction deepEquals(o1, o2, ignoreKeys, pathPrefix){\n pathPrefix = pathPrefix || []\n ignoreKeys = ignoreKeys || []\n function hOP (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop)\n }\n if (typeof o1 !== typeof o2) {\n return false\n } else if (!isObject(o1)) {\n return o1 === o2\n }\n for (var prop in o1) {\n if (hOP(o1, prop) &&\n !arrayInArray(fullPath(pathPrefix, prop), ignoreKeys)) {\n if (!hOP(o2, prop) ||\n !deepEquals(o1[prop],\n o2[prop],\n ignoreKeys,\n fullPath(pathPrefix, prop))) {\n return false\n }\n }\n }\n for (var prop in o2) {\n if (hOP(o2, prop) &&\n !hOP(o1, prop) &&\n !arrayInArray(fullPath(pathPrefix, prop), ignoreKeys)) {\n return false\n }\n }\n return true\n }","semver":";(function (exports) { // nothing in here is node-specific.\n\n// See http://semver.org/\n// This implementation is a *hair* less strict in that it allows\n// v1.2.3 things, and also tags that don't begin with a char.\n\nvar semver = \"\\\\s*[v=]*\\\\s*([0-9]+)\" // major\n + \"\\\\.([0-9]+)\" // minor\n + \"\\\\.([0-9]+)\" // patch\n + \"(-[0-9]+-?)?\" // build\n + \"([a-zA-Z-][a-zA-Z0-9-\\.:]*)?\" // tag\n , exprComparator = \"^((<|>)?=?)\\s*(\"+semver+\")$|^$\"\n , xRangePlain = \"[v=]*([0-9]+|x|X|\\\\*)\"\n + \"(?:\\\\.([0-9]+|x|X|\\\\*)\"\n + \"(?:\\\\.([0-9]+|x|X|\\\\*)\"\n + \"([a-zA-Z-][a-zA-Z0-9-\\.:]*)?)?)?\"\n , xRange = \"((?:<|>)=?)?\\\\s*\" + xRangePlain\n , exprSpermy = \"(?:~>?)\"+xRange\n , expressions = exports.expressions =\n { parse : new RegExp(\"^\\\\s*\"+semver+\"\\\\s*$\")\n , parsePackage : new RegExp(\"^\\\\s*([^\\/]+)[-@](\" +semver+\")\\\\s*$\")\n , parseRange : new RegExp(\n \"^\\\\s*(\" + semver + \")\\\\s+-\\\\s+(\" + semver + \")\\\\s*$\")\n , validComparator : new RegExp(\"^\"+exprComparator+\"$\")\n , parseXRange : new RegExp(\"^\"+xRange+\"$\")\n , parseSpermy : new RegExp(\"^\"+exprSpermy+\"$\")\n }\n\n\nObject.getOwnPropertyNames(expressions).forEach(function (i) {\n exports[i] = function (str) {\n return (\"\" + (str || \"\")).match(expressions[i])\n }\n})\n\nexports.rangeReplace = \">=$1 <=$7\"\nexports.clean = clean\nexports.compare = compare\nexports.rcompare = rcompare\nexports.satisfies = satisfies\nexports.gt = gt\nexports.gte = gte\nexports.lt = lt\nexports.lte = lte\nexports.eq = eq\nexports.neq = neq\nexports.cmp = cmp\nexports.inc = inc\n\nexports.valid = valid\nexports.validPackage = validPackage\nexports.validRange = validRange\nexports.maxSatisfying = maxSatisfying\n\nexports.replaceStars = replaceStars\nexports.toComparators = toComparators\n\nfunction stringify (version) {\n var v = version\n return [v[1]||'', v[2]||'', v[3]||''].join(\".\") + (v[4]||'') + (v[5]||'')\n}\n\nfunction clean (version) {\n version = exports.parse(version)\n if (!version) return version\n return stringify(version)\n}\n\nfunction valid (version) {\n if (typeof version !== \"string\") return null\n return exports.parse(version) && version.trim().replace(/^[v=]+/, '')\n}\n\nfunction validPackage (version) {\n if (typeof version !== \"string\") return null\n return version.match(expressions.parsePackage) && version.trim()\n}\n\n// range can be one of:\n// \"1.0.3 - 2.0.0\" range, inclusive, like \">=1.0.3 <=2.0.0\"\n// \">1.0.2\" like 1.0.3 - 9999.9999.9999\n// \">=1.0.2\" like 1.0.2 - 9999.9999.9999\n// \"<2.0.0\" like 0.0.0 - 1.9999.9999\n// \">1.0.2 <2.0.0\" like 1.0.3 - 1.9999.9999\nvar starExpression = /(<|>)?=?\\s*\\*/g\n , starReplace = \"\"\n , compTrimExpression = new RegExp(\"((<|>)?=?)\\\\s*(\"\n +semver+\"|\"+xRangePlain+\")\", \"g\")\n , compTrimReplace = \"$1$3\"\n\nfunction toComparators (range) {\n var ret = (range || \"\").trim()\n .replace(expressions.parseRange, exports.rangeReplace)\n .replace(compTrimExpression, compTrimReplace)\n .split(/\\s+/)\n .join(\" \")\n .split(\"||\")\n .map(function (orchunk) {\n return orchunk\n .split(\" \")\n .map(replaceXRanges)\n .map(replaceSpermies)\n .map(replaceStars)\n .join(\" \").trim()\n })\n .map(function (orchunk) {\n return orchunk\n .trim()\n .split(/\\s+/)\n .filter(function (c) { return c.match(expressions.validComparator) })\n })\n .filter(function (c) { return c.length })\n return ret\n}\n\nfunction replaceStars (stars) {\n return stars.trim().replace(starExpression, starReplace)\n}\n\n// \"2.x\",\"2.x.x\" --> \">=2.0.0- <2.1.0-\"\n// \"2.3.x\" --> \">=2.3.0- <2.4.0-\"\nfunction replaceXRanges (ranges) {\n return ranges.split(/\\s+/)\n .map(replaceXRange)\n .join(\" \")\n}\n\nfunction replaceXRange (version) {\n return version.trim().replace(expressions.parseXRange,\n function (v, gtlt, M, m, p, t) {\n var anyX = !M || M.toLowerCase() === \"x\" || M === \"*\"\n || !m || m.toLowerCase() === \"x\" || m === \"*\"\n || !p || p.toLowerCase() === \"x\" || p === \"*\"\n , ret = v\n\n if (gtlt && anyX) {\n // just replace x'es with zeroes\n ;(!M || M === \"*\" || M.toLowerCase() === \"x\") && (M = 0)\n ;(!m || m === \"*\" || m.toLowerCase() === \"x\") && (m = 0)\n ;(!p || p === \"*\" || p.toLowerCase() === \"x\") && (p = 0)\n ret = gtlt + M+\".\"+m+\".\"+p+\"-\"\n } else if (!M || M === \"*\" || M.toLowerCase() === \"x\") {\n ret = \"*\" // allow any\n } else if (!m || m === \"*\" || m.toLowerCase() === \"x\") {\n // append \"-\" onto the version, otherwise\n // \"1.x.x\" matches \"2.0.0beta\", since the tag\n // *lowers* the version value\n ret = \">=\"+M+\".0.0- <\"+(+M+1)+\".0.0-\"\n } else if (!p || p === \"*\" || p.toLowerCase() === \"x\") {\n ret = \">=\"+M+\".\"+m+\".0- <\"+M+\".\"+(+m+1)+\".0-\"\n }\n //console.error(\"parseXRange\", [].slice.call(arguments), ret)\n return ret\n })\n}\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0\nfunction replaceSpermies (version) {\n return version.trim().replace(expressions.parseSpermy,\n function (v, gtlt, M, m, p, t) {\n if (gtlt) throw new Error(\n \"Using '\"+gtlt+\"' with ~ makes no sense. Don't do it.\")\n\n if (!M || M.toLowerCase() === \"x\") {\n return \"\"\n }\n // ~1 == >=1.0.0- <2.0.0-\n if (!m || m.toLowerCase() === \"x\") {\n return \">=\"+M+\".0.0- <\"+(+M+1)+\".0.0-\"\n }\n // ~1.2 == >=1.2.0- <1.3.0-\n if (!p || p.toLowerCase() === \"x\") {\n return \">=\"+M+\".\"+m+\".0- <\"+M+\".\"+(+m+1)+\".0-\"\n }\n // ~1.2.3 == >=1.2.3- <1.3.0-\n t = t || \"-\"\n return \">=\"+M+\".\"+m+\".\"+p+t+\" <\"+M+\".\"+(+m+1)+\".0-\"\n })\n}\n\nfunction validRange (range) {\n range = replaceStars(range)\n var c = toComparators(range)\n return (c.length === 0)\n ? null\n : c.map(function (c) { return c.join(\" \") }).join(\"||\")\n}\n\n// returns the highest satisfying version in the list, or undefined\nfunction maxSatisfying (versions, range) {\n return versions\n .filter(function (v) { return satisfies(v, range) })\n .sort(compare)\n .pop()\n}\nfunction satisfies (version, range) {\n version = valid(version)\n if (!version) return false\n range = toComparators(range)\n for (var i = 0, l = range.length ; i < l ; i ++) {\n var ok = false\n for (var j = 0, ll = range[i].length ; j < ll ; j ++) {\n var r = range[i][j]\n , gtlt = r.charAt(0) === \">\" ? gt\n : r.charAt(0) === \"<\" ? lt\n : false\n , eq = r.charAt(!!gtlt) === \"=\"\n , sub = (!!eq) + (!!gtlt)\n if (!gtlt) eq = true\n r = r.substr(sub)\n r = (r === \"\") ? r : valid(r)\n ok = (r === \"\") || (eq && r === version) || (gtlt && gtlt(version, r))\n if (!ok) break\n }\n if (ok) return true\n }\n return false\n}\n\n// return v1 > v2 ? 1 : -1\nfunction compare (v1, v2) {\n var g = gt(v1, v2)\n return g === null ? 0 : g ? 1 : -1\n}\n\nfunction rcompare (v1, v2) {\n return compare(v2, v1)\n}\n\nfunction lt (v1, v2) { return gt(v2, v1) }\nfunction gte (v1, v2) { return !lt(v1, v2) }\nfunction lte (v1, v2) { return !gt(v1, v2) }\nfunction eq (v1, v2) { return gt(v1, v2) === null }\nfunction neq (v1, v2) { return gt(v1, v2) !== null }\nfunction cmp (v1, c, v2) {\n switch (c) {\n case \">\": return gt(v1, v2)\n case \"<\": return lt(v1, v2)\n case \">=\": return gte(v1, v2)\n case \"<=\": return lte(v1, v2)\n case \"==\": return eq(v1, v2)\n case \"!=\": return neq(v1, v2)\n case \"===\": return v1 === v2\n case \"!==\": return v1 !== v2\n default: throw new Error(\"Y U NO USE VALID COMPARATOR!? \"+c)\n }\n}\n\n// return v1 > v2\nfunction num (v) {\n return v === undefined ? -1 : parseInt((v||\"0\").replace(/[^0-9]+/g, ''), 10)\n}\nfunction gt (v1, v2) {\n v1 = exports.parse(v1)\n v2 = exports.parse(v2)\n if (!v1 || !v2) return false\n\n for (var i = 1; i < 5; i ++) {\n v1[i] = num(v1[i])\n v2[i] = num(v2[i])\n if (v1[i] > v2[i]) return true\n else if (v1[i] !== v2[i]) return false\n }\n // no tag is > than any tag, or use lexicographical order.\n var tag1 = v1[5] || \"\"\n , tag2 = v2[5] || \"\"\n\n // kludge: null means they were equal. falsey, and detectable.\n // embarrassingly overclever, though, I know.\n return tag1 === tag2 ? null\n : !tag1 ? true\n : !tag2 ? false\n : tag1 > tag2\n}\n\nfunction inc (version, release) {\n version = exports.parse(version)\n if (!version) return null\n\n var parsedIndexLookup =\n { 'major': 1\n , 'minor': 2\n , 'patch': 3\n , 'build': 4 }\n var incIndex = parsedIndexLookup[release]\n if (incIndex === undefined) return null\n\n var current = num(version[incIndex])\n version[incIndex] = current === -1 ? 1 : current + 1\n\n for (var i = incIndex + 1; i < 5; i ++) {\n if (num(version[i]) !== -1) version[i] = \"0\"\n }\n\n if (version[4]) version[4] = \"-\" + version[4]\n version[5] = \"\"\n\n return stringify(version)\n}\n})(typeof exports === \"object\" ? exports : semver = {})\n","valid":"var semver = require(\"semver\")\nexports.name = validName\nexports.package = validPackage\nfunction validName(name) {\n if (!name) return false\n var n = name.trim()\n if (!n || n.charAt(0) === \".\"\n || !n.match(/^[a-zA-Z0-9]/)\n || n.match(/[\\/\\(\\)&\\?#\\|<>@:%\\s\\\\\\*'\"!~`]/)\n || n.toLowerCase() === \"node_modules\"\n || n !== encodeURIComponent(n)\n || n.toLowerCase() === \"favicon.ico\") {\n return false\n }\n return n\n }\nfunction validPackage(pkg) {\n return validName(pkg.name) && semver.valid(pkg.version)\n }","Date":"exports.parse = parse\nexports.toISOString = toISOString\nexports.now = now\nfunction now() {\n return new Date().getTime()\n }\nfunction parse(s) {\n // s is something like \"2010-12-29T07:31:06Z\"\n s = s.split(\"T\")\n var ds = s[0]\n , ts = s[1]\n , d = new Date()\n ds = ds.split(\"-\")\n ts = ts.split(\":\")\n var tz = ts[2].substr(2)\n ts[2] = ts[2].substr(0, 2)\n d.setUTCFullYear(+ds[0])\n d.setUTCMonth(+ds[1]-1)\n d.setUTCDate(+ds[2])\n d.setUTCHours(+ts[0])\n d.setUTCMinutes(+ts[1])\n d.setUTCSeconds(+ts[2])\n d.setUTCMilliseconds(0)\n return d.getTime()\n }\nexports.toISOString = toISOString\nfunction toISOString() { return ISODateString(this) }\nfunction pad(n){return n<10 ? '0'+n : n}\nfunction ISODateString(d){\n return d.getUTCFullYear()+'-'\n + pad(d.getUTCMonth()+1)+'-'\n + pad(d.getUTCDate())+'T'\n + pad(d.getUTCHours())+':'\n + pad(d.getUTCMinutes())+':'\n + pad(d.getUTCSeconds())+'Z'}","Object":"exports.keys = keys\nfunction keys(o) {\n var a = []\n for (var i in o) a.push(i)\n return a }","Array":"exports.isArray = isArray\nexports.forEach = forEach\n\nexports.reduce = reduce\n\nfunction forEach(fn) {\n for (var i = 0, l = this.length; i < l; i ++) {\n if (this.hasOwnProperty(i)) {\n fn(this[i], i, this)\n }\n }\n }\nfunction reduce(callback, initialValue) {\n var previousValue = initialValue || this[0];\n for (var i = initialValue ? 0 : 1; i < this.length; i++) {\n previousValue = callback(previousValue, this[i], i, this);\n }\n return previousValue;\n }\nfunction isArray(a) {\n return a instanceof Array\n || Object.prototype.toString.call(a) === \"[object Array]\"\n || (typeof a === \"object\" && typeof a.length === \"number\") }","String":"exports.trim = trim\nfunction trim() {\n return this.replace(/^\\s+|\\s+$/g, \"\")\n }","monkeypatch":"exports.patch = patch\nfunction patch(Object, Date, Array, String) {\n if (!Date.parse || isNaN(Date.parse(\"2010-12-29T07:31:06Z\"))) {\n Date.parse = require(\"Date\").parse\n }\n\n Date.prototype.toISOString = Date.prototype.toISOString\n || require(\"Date\").toISOString\n\n Date.now = Date.now\n || require(\"Date\").now\n\n Object.keys = Object.keys\n || require(\"Object\").keys\n\n Array.prototype.forEach = Array.prototype.forEach\n || require(\"Array\").forEach\n\n Array.prototype.reduce = Array.prototype.reduce\n || require(\"Array\").reduce\n\n Array.isArray = Array.isArray\n || require(\"Array\").isArray\n\n String.prototype.trim = String.prototype.trim\n || require(\"String\").trim\n }","attachments_md5":{}}},
{"id":"_design/ghost","key":"_design/ghost","value":{"rev":"1-9d924455cca472bd7512b813c769fb00"},"doc":{"_id":"_design/ghost","_rev":"1-9d924455cca472bd7512b813c769fb00","rewrites":[{"from":"/","method":"GET","to":"../app/../../../registry"},{"from":"/-/jsonp/:jsonp","method":"GET","to":"../app/_list/short/listAll"},{"from":"/_session","method":"GET","to":"../app/../../../_session"},{"from":"/_session","method":"PUT","to":"../app/../../../_session"},{"from":"/_session","method":"POST","to":"../app/../../../_session"},{"from":"/_session","method":"DELETE","to":"../app/../../../_session"},{"from":"/_session","method":"HEAD","to":"../app/../../../_session"},{"from":"/-/all/since","method":"GET","to":"../app/_list/index/modified"},{"from":"/-/rss","method":"GET","to":"../app/_list/rss/modified"},{"from":"/-/rss/:package","method":"GET","to":"../app/_list/rss/modifiedPackage"},{"from":"/-/all","method":"GET","to":"../app/_list/index/listAll"},{"from":"/-/all/-/jsonp/:jsonp","method":"GET","to":"../app/_list/index/listAll"},{"from":"/-/short","method":"GET","to":"../app/_list/short/listAll"},{"from":"/-/scripts","method":"GET","to":"../app/_list/scripts/scripts"},{"from":"/-/by-field","method":"GET","to":"../app/_list/byField/byField"},{"from":"/-/fields","method":"GET","query":{"group":"true"},"to":"../app/_list/sortCount/fieldsInUse"},{"from":"/-/needbuild","method":"GET","to":"../app/_list/needBuild/needBuild"},{"from":"/-/prebuilt","method":"GET","to":"../app/_list/preBuilt/needBuild"},{"from":"/-/nonlocal","method":"GET","to":"../app/_list/short/nonlocal"},{"from":"/favicon.ico","method":"GET","to":"../app/../../npm/favicon.ico"},{"from":"/-/users","method":"GET","to":"../../../public_users/_design/_auth/_list/index/listAll"},{"from":"/-/user/:user","method":"PUT","to":"../../../_users/:user"},{"from":"/-/user/:user/-rev/:rev","method":"PUT","to":"../../../_users/:user"},{"from":"/-/user/:user","method":"GET","to":"../../../public_users/:user"},{"from":"/_users/:user","method":"PUT","to":"../app/../../../_users/:user"},{"from":"/_users/:user","method":"GET","to":"../app/../../../_users/:user"},{"from":"/public_users/:user","method":"PUT","to":"../app/../../../public_users/:user"},{"from":"/public_users/:user","method":"GET","to":"../app/../../../public_users/:user"},{"from":"/-/user-by-email/:email","method":"GET","to":"../../../public_users/_design/_auth/_list/email/listAll"},{"from":"/-/top","method":"GET","query":{"group_level":1},"to":"../app/_view/npmTop"},{"from":"/-/by-user/:user","method":"GET","to":"../app/_list/byUser/byUser"},{"from":"/-/starred-by-user/:user","method":"GET","to":"../app/_list/byUser/starredByUser"},{"from":"/-/starred-by-package/:user","method":"GET","to":"../app/_list/byUser/starredByPackage"},{"from":"/:pkg","method":"GET","to":"../app/_show/package/:pkg"},{"from":"/:pkg/-/jsonp/:jsonp","method":"GET","to":"../app/_show/package/:pkg"},{"from":"/:pkg/:version","method":"GET","to":"../app/_show/package/:pkg"},{"from":"/:pkg/:version/-/jsonp/:jsonp","method":"GET","to":"../app/_show/package/:pkg"},{"from":"/:pkg/-/:att","method":"GET","to":"../app/../../:pkg/:att"},{"from":"/:pkg/-/:att/:rev","method":"PUT","to":"../app/../../:pkg/:att"},{"from":"/:pkg/-/:att/-rev/:rev","method":"PUT","to":"../app/../../:pkg/:att"},{"from":"/:pkg/-/:att/:rev","method":"DELETE","to":"../app/../../:pkg/:att"},{"from":"/:pkg/-/:att/-rev/:rev","method":"DELETE","to":"../app/../../:pkg/:att"},{"from":"/:pkg","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/-rev/:rev","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/:version","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/:version/-rev/:rev","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/:version/-tag/:tag","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/:version/-tag/:tag/-rev/:rev","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/:version/-pre/:pre","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/:version/-pre/:pre/-rev/:rev","method":"PUT","to":"../app/_update/package/:pkg"},{"from":"/:pkg/-rev/:rev","method":"DELETE","to":"../app/../../:pkg"},{"from":"/-/_view/*","method":"GET","to":"../app/_view/*"},{"from":"/-/_list/*","method":"GET","to":"../app/_list/*"},{"from":"/-/_show/*","method":"GET","to":"../app/_show/*"}],"language":"javascript","attachments_md5":{}}},
{"id":"_design/scratch","key":"_design/scratch","value":{"rev":"1-ed58268b187991c485e6cadc0bd16110"},"doc":{"_id":"_design/scratch","_rev":"1-ed58268b187991c485e6cadc0bd16110","shows":{"package":"function (doc, req) {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n\n var semver = require(\"semver\")\n , code = 200\n , headers = {\"Content-Type\":\"application/json\"}\n , body = null\n\n delete doc.ctime\n delete doc.mtime\n if (doc.versions) Object.keys(doc.versions).forEach(function (v) {\n delete doc.versions[v].ctime\n delete doc.versions[v].mtime\n })\n\n // legacy kludge\n if (doc.versions) for (var v in doc.versions) {\n var clean = semver.clean(v, true)\n doc.versions[v].directories = doc.versions[v].directories || {}\n if (clean !== v) {\n var p = doc.versions[v]\n delete doc.versions[v]\n p.version = v = clean\n p._id = p.name + '@' + p.version\n doc.versions[clean] = p\n }\n if (doc.versions[v].dist.tarball) {\n // if there is an attachment for this tarball, then use that.\n // make it point at THIS registry that is being requested,\n // with the full /db/_design/app/_rewrite if that is being used,\n // or just the /name if not.\n\n var t = doc.versions[v].dist.tarball\n t = t.replace(/^https?:\\/\\/[^\\/:]+(:[0-9]+)?/, '')\n var f = t.match(/[^\\/]+$/)[0]\n var requestedPath = req.requested_path\n if (doc._attachments && doc._attachments[f]) {\n // workaround for old couch versions that didn't\n // have requested_path\n if (requestedPath && -1 === requestedPath.indexOf('show'))\n requestedPath = requestedPath.slice(0)\n else {\n var path = req.path\n if (path) {\n var i = path.indexOf('_show')\n if (i !== -1) {\n requestedPath = path.slice(0)\n requestedPath.splice(i, i + 2, '_rewrite')\n }\n } else return {\n code : 500,\n body : JSON.stringify({error: 'bad couch'}),\n headers : headers\n }\n }\n\n // doc.versions[v].dist._origTarball = doc.versions[v].dist.tarball\n // doc.versions[v].dist._headers = req.headers\n // doc.versions[v].dist._query = req.query\n // doc.versions[v].dist._reqPath = req.requested_path\n // doc.versions[v].dist._path = req.path\n // doc.versions[v].dist._t = t.slice(0)\n\n // actual location of tarball should always be:\n // .../_rewrite/pkg/-/pkg-version.tgz\n // or: /pkg/-/pkg-version.tgz\n // depending on what requested path is.\n var tf = [doc.name, '-', t.split('/').pop()]\n var i = requestedPath.indexOf('_rewrite')\n if (i !== -1) {\n tf = requestedPath.slice(0, i + 1).concat(tf)\n }\n t = '/' + tf.join('/')\n var h = \"http://\" + req.headers.Host\n\n doc.versions[v].dist.tarball = h + t\n } else {\n doc.versions[v].dist.noattachment = true\n }\n }\n }\n if (doc[\"dist-tags\"]) for (var tag in doc[\"dist-tags\"]) {\n var clean = semver.clean(doc[\"dist-tags\"][tag], true)\n if (!clean) delete doc[\"dist-tags\"][tag]\n else doc[\"dist-tags\"][tag] = clean\n }\n // end kludge\n\n if (req.query.version) {\n // could be either one!\n var ver = req.query.version\n var clean = semver.clean(ver, true)\n\n if (clean && clean !== ver && (clean in doc.versions))\n ver = clean\n\n // if not a valid version, then treat as a tag.\n if ((!(ver in doc.versions) && (ver in doc[\"dist-tags\"]))\n || !semver.valid(ver)) {\n ver = doc[\"dist-tags\"][ver]\n }\n body = doc.versions[ver]\n if (!body) {\n code = 404\n body = {\"error\" : \"version not found: \"+req.query.version}\n }\n } else {\n body = doc\n for (var i in body) if (i.charAt(0) === \"_\" && i !== \"_id\" && i !== \"_rev\" && i !== \"_attachments\") {\n delete body[i]\n }\n for (var i in body.time) {\n if (!body.versions[i]) delete body.time[i]\n else body.time[i] = new Date(Date.parse(body.time[i])).toISOString()\n }\n }\n\n body = req.query.jsonp\n ? req.query.jsonp + \"(\" + JSON.stringify(body) + \")\"\n : toJSON(body)\n\n return {\n code : code,\n body : body,\n headers : headers\n }\n}"},"updates":{"package":"function (doc, req) {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n\n var semver = require(\"semver\")\n var valid = require(\"valid\")\n function error (reason) {\n return [{_id: \"error: forbidden\", forbidden:reason}, JSON.stringify({forbidden:reason})]\n }\n\n function ok (doc, message) {\n delete doc.mtime\n delete doc.ctime\n var time = doc.time = doc.time || {}\n time.modified = (new Date()).toISOString()\n time.created = time.created || time.modified\n for (var v in doc.versions) {\n var ver = doc.versions[v]\n delete ver.ctime\n delete ver.mtime\n time[v] = time[v] || (new Date()).toISOString()\n }\n return [doc, JSON.stringify({ok:message})]\n }\n\n if (doc) {\n if (req.query.version) {\n var parsed = semver.valid(req.query.version, true)\n if (!parsed) {\n // it's a tag.\n var tag = req.query.version\n , ver = JSON.parse(req.body)\n if (!semver.valid(ver)) {\n return error(\"setting tag \"+tag+\" to invalid version: \"+req.body)\n }\n doc[\"dist-tags\"][tag] = semver.clean(ver, true)\n return ok(doc, \"updated tag\")\n }\n // adding a new version.\n var ver = req.query.version\n if (!semver.valid(ver, true)) {\n return error(\"invalid version: \"+ver)\n }\n\n if ((ver in doc.versions) || (semver.clean(ver) in doc.versions)) {\n // attempting to overwrite an existing version.\n // not supported at this time.\n if (!req.query.rev || req.query.rev !== doc._rev) {\n return error(\"cannot modify existing version\")\n }\n }\n\n var body = JSON.parse(req.body)\n if (!valid.name(body.name)) {\n return error( \"Invalid name: \"+JSON.stringify(body.name))\n }\n body.version = semver.clean(body.version, true)\n ver = semver.clean(ver, true)\n if (body.version !== ver) {\n return error( \"version in doc doesn't match version in request: \"\n + JSON.stringify(body.version)\n + \" !== \" + JSON.stringify(ver) )\n }\n body._id = body.name + \"@\" + body.version\n if (body.description) doc.description = body.description\n if (body.author) doc.author = body.author\n if (body.repository) doc.repository = body.repository\n body.maintainers = doc.maintainers\n\n if (body.publishConfig && typeof body.publishConfig === 'object') {\n Object.keys(body.publishConfig).filter(function (k) {\n return k.match(/^_/)\n }).forEach(function (k) {\n delete body.publishConfig[k]\n })\n }\n\n var tag = req.query.tag\n || (body.publishConfig && body.publishConfig.tag)\n || body.tag\n || \"latest\"\n\n if (!req.query.pre)\n doc[\"dist-tags\"][tag] = body.version\n if (!doc[\"dist-tags\"].latest)\n doc[\"dist-tags\"].latest = body.version\n doc.versions[ver] = body\n doc.time = doc.time || {}\n doc.time[ver] = (new Date()).toISOString()\n return ok(doc, \"added version\")\n }\n\n // update the package info\n var newdoc = JSON.parse(req.body)\n , changed = false\n if (doc._rev && doc._rev !== newdoc._rev) {\n return error( \"must supply latest _rev to update existing package\" )\n }\n for (var i in newdoc) if (typeof newdoc[i] === \"string\" || i === \"maintainers\") {\n doc[i] = newdoc[i]\n }\n if (newdoc.versions) {\n doc.versions = newdoc.versions\n }\n if (newdoc[\"dist-tags\"]) {\n doc[\"dist-tags\"] = newdoc[\"dist-tags\"]\n }\n if (newdoc.users) {\n if (!doc.users) doc.users = {}\n doc.users[req.userCtx.name] = newdoc.users[req.userCtx.name]\n }\n return ok(doc, \"updated package metadata\")\n } else {\n // Create new package doc\n doc = JSON.parse(req.body)\n if (!doc._id) doc._id = doc.name\n if (!doc.versions) doc.versions = {}\n var latest\n for (var v in doc.versions) {\n if (!semver.valid(v, true)) return error(\"Invalid version: \"+JSON.stringify(v))\n var p = doc.versions[v]\n if (p.version !== v) return error(\"Version mismatch: \"+JSON.stringify(v)\n +\" !== \"+JSON.stringify(p.version))\n if (!valid.name(p.name)) return error(\"Invalid name: \"+JSON.stringify(p.name))\n latest = semver.clean(v, true)\n }\n if (!doc['dist-tags']) doc['dist-tags'] = {}\n if (latest) doc[\"dist-tags\"].latest = latest\n return ok(doc, \"created new entry\")\n }\n}"},"rewrites":[{"from":"/","to":"../../../registry","method":"GET"},{"from":"/-/jsonp/:jsonp","to":"_list/short/listAll","method":"GET"},{"from":"/_session","to":"../../../_session","method":"GET"},{"from":"/_session","to":"../../../_session","method":"PUT"},{"from":"/_session","to":"../../../_session","method":"POST"},{"from":"/_session","to":"../../../_session","method":"DELETE"},{"from":"/_session","to":"../../../_session","method":"HEAD"},{"from":"/-/all/since","to":"_list/index/modified","method":"GET"},{"from":"/-/rss","to":"_list/rss/modified","method":"GET"},{"from":"/-/rss/:package","to":"_list/rss/modifiedPackage","method":"GET"},{"from":"/-/all","to":"_list/index/listAll","method":"GET"},{"from":"/-/all/-/jsonp/:jsonp","to":"_list/index/listAll","method":"GET"},{"from":"/-/short","to":"_list/short/listAll","method":"GET"},{"from":"/-/scripts","to":"_list/scripts/scripts","method":"GET"},{"from":"/-/by-field","to":"_list/byField/byField","method":"GET"},{"from":"/-/fields","to":"_list/sortCount/fieldsInUse","method":"GET","query":{"group":"true"}},{"from":"/-/needbuild","to":"_list/needBuild/needBuild","method":"GET"},{"from":"/-/prebuilt","to":"_list/preBuilt/needBuild","method":"GET"},{"from":"/-/nonlocal","to":"_list/short/nonlocal","method":"GET"},{"from":"/favicon.ico","to":"../../npm/favicon.ico","method":"GET"},{"from":"/-/users","to":"../../../_users/_design/_auth/_list/index/listAll","method":"GET"},{"from":"/-/user/:user","to":"../../../_users/:user","method":"PUT"},{"from":"/-/user/:user/-rev/:rev","to":"../../../_users/:user","method":"PUT"},{"from":"/-/user/:user","to":"../../../_users/:user","method":"GET"},{"from":"/_users/:user","to":"../../../_users/:user","method":"PUT"},{"from":"/_users/:user","to":"../../../_users/:user","method":"GET"},{"from":"/public_users/:user","to":"../../../public_users/:user","method":"PUT"},{"from":"/public_users/:user","to":"../../../public_users/:user","method":"GET"},{"from":"/-/user-by-email/:email","to":"../../../_users/_design/_auth/_list/email/listAll","method":"GET"},{"from":"/-/top","to":"_view/npmTop","query":{"group_level":1},"method":"GET"},{"from":"/-/by-user/:user","to":"_list/byUser/byUser","method":"GET"},{"from":"/-/starred-by-user/:user","to":"_list/byUser/starredByUser","method":"GET"},{"from":"/-/starred-by-package/:user","to":"_list/byUser/starredByPackage","method":"GET"},{"from":"/:pkg","to":"/_show/package/:pkg","method":"GET"},{"from":"/:pkg/-/jsonp/:jsonp","to":"/_show/package/:pkg","method":"GET"},{"from":"/:pkg/:version","to":"_show/package/:pkg","method":"GET"},{"from":"/:pkg/:version/-/jsonp/:jsonp","to":"_show/package/:pkg","method":"GET"},{"from":"/:pkg/-/:att","to":"../../:pkg/:att","method":"GET"},{"from":"/:pkg/-/:att/:rev","to":"../../:pkg/:att","method":"PUT"},{"from":"/:pkg/-/:att/-rev/:rev","to":"../../:pkg/:att","method":"PUT"},{"from":"/:pkg/-/:att/:rev","to":"../../:pkg/:att","method":"DELETE"},{"from":"/:pkg/-/:att/-rev/:rev","to":"../../:pkg/:att","method":"DELETE"},{"from":"/:pkg","to":"/_update/package/:pkg","method":"PUT"},{"from":"/:pkg/-rev/:rev","to":"/_update/package/:pkg","method":"PUT"},{"from":"/:pkg/:version","to":"_update/package/:pkg","method":"PUT"},{"from":"/:pkg/:version/-rev/:rev","to":"_update/package/:pkg","method":"PUT"},{"from":"/:pkg/:version/-tag/:tag","to":"_update/package/:pkg","method":"PUT"},{"from":"/:pkg/:version/-tag/:tag/-rev/:rev","to":"_update/package/:pkg","method":"PUT"},{"from":"/:pkg/:version/-pre/:pre","to":"_update/package/:pkg","method":"PUT"},{"from":"/:pkg/:version/-pre/:pre/-rev/:rev","to":"_update/package/:pkg","method":"PUT"},{"from":"/:pkg/-rev/:rev","to":"../../:pkg","method":"DELETE"},{"from":"/-/_view/*","to":"_view/*","method":"GET"},{"from":"/-/_list/*","to":"_list/*","method":"GET"},{"from":"/-/_show/*","to":"_show/*","method":"GET"}],"views":{"noCDN":{"map":"function (doc) {\n if (!doc.versions || Object.keys(doc.versions).length === 0)\n return\n Object.keys(doc.versions).forEach(function(v) {\n if (doc.versions[v].dist.cdn)\n return\n emit([doc._id, v], 1)\n })\n}","reduce":"_sum"},"updated":{"map":"function (doc) {\n var l = doc[\"dist-tags\"].latest\n , t = doc.time && doc.time[l]\n if (t) emit(t, 1)\n}"},"listAll":{"map":"function (doc) { return emit(doc._id, doc) }"},"allVersions":{"map":"function (doc) {\n if (!doc || !doc.versions)\n return\n for (var i in doc.versions)\n emit([i, doc._id], 1)\n}","reduce":"_sum"},"modified":{"map":"function (doc) {\n if (!doc.versions || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var latest = doc[\"dist-tags\"].latest\n if (!doc.versions[latest]) return\n var time = doc.time && doc.time[latest] || 0\n var t = new Date(time)\n emit(t.getTime(), doc)\n}"},"modifiedPackage":{"map":"function (doc) {\n if (!doc.versions || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var latest = doc[\"dist-tags\"].latest\n if (!doc.versions[latest]) return\n var time = doc.time && doc.time[latest] || 0\n var t = new Date(time)\n emit([doc._id, t.getTime()], doc)\n}"},"noShasum":{"map":"function (doc) {\n if (!doc || !doc.versions)\n return\n\n for (var ver in doc.versions) {\n var version = doc.versions[ver]\n if (!version || !version.dist || !version.dist.shasum) {\n emit([doc.name, ver, !!version, !!version.dist, !!version.shasum], 1)\n }\n }\n}","reduce":"_sum"},"byEngine":{"map":"function (doc) {\n if (!doc || !doc.versions || !doc[\"dist-tags\"] || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc[\"dist-tags\"].latest\n var d = doc.versions[v]\n if (d && d.engines) emit(doc._id, [d.engines, doc.maintainers])\n }"},"countVersions":{"map":"function (doc) {\n if (!doc || !doc.name || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var i = 0\n if (!doc.versions) return emit([i, doc._id], 1)\n for (var v in doc.versions) i++\n emit([i, doc._id], 1)\n}","reduce":"_sum"},"byKeyword":{"map":"function (doc) {\n if (!doc || !doc.versions || !doc['dist-tags'] || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc.versions[doc['dist-tags'].latest]\n if (!v || !v.keywords || !Array.isArray(v.keywords)) return\n v.keywords.forEach(function (kw) {\n emit([kw.toLowerCase(), doc.name, doc.description], 1)\n })\n }","reduce":"_sum"},"byField":{"map":"function (doc) {\n if (!doc || !doc.versions || !doc[\"dist-tags\"]) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc[\"dist-tags\"].latest\n //Object.keys(doc.versions).forEach(function (v) {\n var d = doc.versions[v]\n if (!d) return\n //emit(d.name + \"@\" + d.version, d.dist.bin || {})\n var out = {}\n for (var i in d) {\n out[i] = d[i] //true\n if (d[i] && typeof d[i] === \"object\" &&\n (i === \"scripts\" || i === \"directories\")) {\n for (var j in d[i]) out[i + \".\" + j] = d[i][j]\n }\n }\n out.maintainers = doc.maintainers\n emit(doc._id, out)\n //})\n }"},"needBuild":{"map":"function (doc) {\n\n if (!doc || !doc.versions || !doc[\"dist-tags\"]) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc[\"dist-tags\"].latest\n //Object.keys(doc.versions).forEach(function (v) {\n var d = doc.versions[v]\n if (!d) return\n if (!d.scripts) return\n var inst = d.scripts.install\n || d.scripts.preinstall\n || d.scripts.postinstall\n if (!inst) return\n //emit(d.name + \"@\" + d.version, d.dist.bin || {})\n emit(d._id, d.dist.bin || {})\n //})\n }"},"scripts":{"map":"function (doc) {\n if (!doc || !doc.versions || !doc[\"dist-tags\"]) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc[\"dist-tags\"].latest\n v = doc.versions[v]\n if (!v || !v.scripts) return\n var out = {}\n var any = false\n for (var i in v.scripts) {\n out[i] = v.scripts[i]\n any = true\n }\n if (!any) return\n out.maintainers = doc.maintainers\n emit(doc._id, out)\n }"},"nodeWafInstall":{"map":"function (doc) {\n if (!doc || !doc.versions || !doc[\"dist-tags\"]) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc[\"dist-tags\"].latest\n if (!doc.versions[v]) return\n if (!doc.versions[v].scripts) return\n for (var i in doc.versions[v].scripts) {\n if (doc.versions[v].scripts[i].indexOf(\"node-waf\") !== -1 ||\n doc.versions[v].scripts[i].indexOf(\"make\") !== -1) {\n emit(doc._id, doc.versions[v]._id)\n return\n }\n }\n }"},"badBins":{"map":"function (doc) {\n if (!doc || !doc.versions || !doc[\"dist-tags\"]) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var v = doc[\"dist-tags\"].latest\n if (!doc.versions[v]) return\n v = doc.versions[v]\n var b = v.bin\n , d = v.directories && v.directories.bin\n if (!b && !d) return\n if (b && (typeof b === \"string\" || Object.keys(b).length === 1)) {\n // it's ok.\n return\n }\n emit(doc._id, {binHash:b, binDir:d})\n }"},"orphanAttachments":{"map":"function (doc) {\n if (!doc || !doc._attachments) return\n var orphans = []\n , size = 0\n for (var i in doc._attachments) {\n var n = i.substr(doc._id.length + 1).replace(/\\.tgz$/, \"\")\n .replace(/^v/, \"\")\n if (!doc.versions[n] && i.match(/\\.tgz$/)) {\n orphans.push(i)\n size += doc._attachments[i].length\n }\n }\n if (orphans.length) emit(doc._id, {size:size, orphans:orphans})\n }"},"starredByUser":{"map":"function (doc) {\n if (!doc || !doc.users) return\n if (doc._id.match(/^npm-test-.+$/) && doc.maintainers[0].name === 'isaacs')\n return\n Object.keys(doc.users).forEach(function (m) {\n if (!doc.users[m]) return\n emit(m, doc._id)\n })\n}"},"starredByPackage":{"map":"function (doc) {\n if (!doc || !doc.users) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n Object.keys(doc.users).forEach(function (m) {\n if (!doc.users[m]) return\n emit(doc._id, m)\n })\n}"},"byUser":{"map":"function (doc) {\n if (!doc || !doc.maintainers) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n doc.maintainers.forEach(function (m) {\n emit(m.name, doc._id)\n })\n}"},"browseAuthorsRecent":{"map":"function (doc) {\n if (!doc || !doc.maintainers || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n l = l && doc.versions && doc.versions[l]\n if (!l) return\n var t = doc.time && doc.time[l.version]\n if (!t) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n doc.maintainers.forEach(function (m) {\n // Have to sum it up by the author name in the app.\n // couchdb makes me sad sometimes.\n emit([t, m.name, doc._id, desc, readme], 1)\n })\n}","reduce":"_sum"},"npmTop":{"map":"function (doc) {\n if (!doc || !doc.maintainers || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n l = l && doc.versions && doc.versions[l]\n if (!l) return\n var t = doc.time && doc.time[l.version]\n if (!t) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n doc.maintainers.forEach(function (m) {\n emit([m.name, doc._id, desc, t, readme], 1)\n })\n}","reduce":"_sum"},"browseAuthors":{"map":"function (doc) {\n if (!doc || !doc.maintainers || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n l = l && doc.versions && doc.versions[l]\n if (!l) return\n var t = doc.time && doc.time[l.version]\n if (!t) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n doc.maintainers.forEach(function (m) {\n emit([m.name, doc._id, desc, t, readme], 1)\n })\n}","reduce":"_sum"},"browseUpdated":{"map":"function (doc) {\n if (!doc || !doc.versions || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n if (!l) return\n var t = doc.time && doc.time[l]\n if (!t) return\n var v = doc.versions[l]\n if (!v) return\n var d = new Date(t)\n if (!d.getTime()) return\n emit([ d.toISOString(),\n doc._id,\n v.description,\n v.readme ], 1)\n}","reduce":"_sum"},"browseAll":{"map":"function (doc) {\n if (!doc || !doc.versions || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n if (!l) return\n l = doc.versions && doc.versions[l]\n if (!l) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n emit([doc.name, desc, readme], 1)\n}","reduce":"_sum"},"analytics":{"map":"function (doc) {\n if (!doc || !doc.time || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n for (var i in doc.time) {\n var t = doc.time[i]\n var d = new Date(t)\n if (!d.getTime()) return\n var type = i === 'modified' ? 'latest'\n : i === 'created' ? 'created'\n : 'update'\n emit([ type,\n d.getUTCFullYear(),\n d.getUTCMonth() + 1,\n d.getUTCDate(),\n doc._id ], 1)\n }\n}","reduce":"_sum"},"dependedUpon":{"map":"function (doc) {\n if (!doc || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n if (!l) return\n l = doc.versions && doc.versions[l]\n if (!l) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n var d = l.dependencies\n if (!d) return\n for (var dep in d) {\n emit([dep, doc._id, desc, readme], 1)\n }\n}","reduce":"_sum"},"dependentVersions":{"map":"function (doc) {\n if (!doc || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n if (!l) return\n l = doc.versions && doc.versions[l]\n if (!l) return\n var deps = l.dependencies\n if (!deps) return\n for (var dep in deps)\n emit([dep, deps[dep], doc._id], 1)\n}","reduce":"_sum"},"browseStarUser":{"map":"function (doc) {\n if (!doc) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n if (!l) return\n l = doc.versions && doc.versions[l]\n if (!l) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n var d = doc.users\n if (!d) return\n for (var user in d) {\n emit([user, doc._id, desc, readme], 1)\n }\n}","reduce":"_sum"},"browseStarPackage":{"map":"function (doc) {\n if (!doc || doc.deprecated) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var l = doc['dist-tags'] && doc['dist-tags'].latest\n if (!l) return\n l = doc.versions && doc.versions[l]\n if (!l) return\n var desc = doc.description || l.description || ''\n var readme = doc.readme || l.readme || ''\n var d = doc.users\n if (!d) return\n for (var user in d) {\n emit([doc._id, desc, user, readme], 1)\n }\n}","reduce":"_sum"},"fieldsInUse":{"map":"function (doc) {\n if (!doc.versions || !doc[\"dist-tags\"] || !doc[\"dist-tags\"].latest || doc.deprecated) {\n return\n }\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var d = doc.versions[doc[\"dist-tags\"].latest]\n if (!d) return\n for (var f in d) {\n emit(f, 1)\n if (d[f] && typeof d[f] === \"object\" &&\n (f === \"scripts\" || f === \"directories\")) {\n for (var i in d[f]) emit(f+\".\"+i, 1)\n }\n }\n}","reduce":"_sum"},"howBigIsYourPackage":{"map":"function (doc) {\n if (!doc) return\n if (doc._id.match(/^npm-test-.+$/) &&\n doc.maintainers &&\n doc.maintainers[0].name === 'isaacs')\n return\n var s = 0\n , c = 0\n for (var i in doc._attachments) {\n s += doc._attachments[i].length\n c ++\n }\n if (s === 0) return\n emit(doc._id, {_id: doc._id, size: s, count: c, avg: s/c})\n }"}},"lists":{"first":"function (head, req) {\n var row = getRow()\n send(toJSON([row, row.id, row.doc]))\n}","short":"function (head, req) {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n\n var out = {}\n , row\n , show = (req.query.show || \"\").split(\",\")\n , v = show.indexOf(\"version\") !== -1\n , t = show.indexOf(\"tag\") !== -1\n while (row = getRow()) {\n if (!row.id) continue\n if (!t && !v) {\n out[row.id] = true\n continue\n }\n var val = row.value\n if (t) Object.keys(val[\"dist-tags\"] || {}).forEach(function (t) {\n out[row.id + \"@\" + t] = true\n })\n if (v) Object.keys(val.versions || {}).forEach(function (v) {\n out[row.id + \"@\" + v] = true\n })\n }\n send(toJSON(Object.keys(out)))\n}","rss":"function (head, req) {\n var limit = +req.query.limit\n , desc = req.query.descending\n if (!desc || !limit || limit > 50 || limit < 0) {\n start({ code: 403\n , headers: { 'Content-type': 'text/xml' }})\n send('<error><![CDATA[Please retry your request with '\n + '?descending=true&limit=50 query params]]></error>')\n return\n }\n\n start({ code: 200\n // application/rss+xml is correcter, but also annoyinger\n , headers: { \"Content-Type\": \"text/xml\" } })\n send('<?xml version=\"1.0\" encoding=\"UTF-8\"?>'\n +'\\n<!DOCTYPE rss PUBLIC \"-//Netscape Communications//DTD RSS 0.91//EN\" '\n +'\"http://my.netscape.com/publish/formats/rss-0.91.dtd\">'\n +'\\n<rss version=\"0.91\">'\n +'\\n <channel>'\n +'\\n <title>npm recent updates</title>'\n +'\\n <link>http://search.npmjs.org/</link>'\n +'\\n <description>Updates to the npm package registry</description>'\n +'\\n <language>en</language>')\n\n var row\n while (row = getRow()) {\n if (!row.value || !row.value[\"dist-tags\"]) continue\n\n var doc = row.value\n var authors = doc.maintainers.map(function (m) {\n return '<author>' + m.name + '</author>'\n }).join('\\n ')\n\n var latest = doc[\"dist-tags\"].latest\n var time = doc.time && doc.time[latest]\n var date = new Date(time)\n doc = doc.versions[latest]\n if (!doc || !time || !date) continue\n\n var url = \"https://npmjs.org/package/\" + doc.name\n\n send('\\n <item>'\n +'\\n <title>' + doc._id + '</title>'\n +'\\n <link>' + url + '</link>'\n +'\\n ' + authors\n +'\\n <description><![CDATA['\n + (doc.description || '').trim() + ']]></description>'\n +'\\n <pubDate>' + date.toISOString() + '</pubDate>'\n +'\\n </item>')\n }\n send('\\n </channel>'\n +'\\n</rss>')\n}","index":"function (head, req) {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n var basePath = req.requested_path\n if (basePath.indexOf(\"_list\") === -1) basePath = \"\"\n else {\n basePath = basePath.slice(0, basePath.indexOf(\"_list\"))\n .concat([\"_rewrite\", \"\"]).join(\"/\")\n }\n\n var row\n , semver = require(\"semver\")\n , res = []\n\n if (req.query.jsonp) send(req.query.jsonp + \"(\")\n send('{\"_updated\":' + Date.now())\n while (row = getRow()) {\n if (!row.id) continue\n\n var doc = row.value\n if (!doc.name || !doc._id ||\n encodeURIComponent(doc._id) !== doc._id) continue\n\n var p = {}\n\n // legacy kludge\n delete doc.mtime\n delete doc.ctime\n if (doc.versions) for (var v in doc.versions) {\n var clean = semver.clean(v)\n delete doc.versions[v].ctime\n delete doc.versions[v].mtime\n if (clean !== v) {\n var x = doc.versions[v]\n delete doc.versions[v]\n x.version = v = clean\n doc.versions[clean] = x\n }\n }\n if (doc[\"dist-tags\"]) for (var tag in doc[\"dist-tags\"]) {\n var clean = semver.clean(doc[\"dist-tags\"][tag])\n if (!clean) delete doc[\"dist-tags\"][tag]\n else doc[\"dist-tags\"][tag] = clean\n }\n // end kludge\n\n for (var i in doc) {\n if (i === \"versions\" || i.charAt(0) === \"_\" || i === 'readme' ||\n i === 'time') continue\n p[i] = doc[i]\n }\n if (doc.time) {\n p.time = { modified: doc.time.modified }\n }\n if (p['dist-tags'] && typeof p['dist-tags'] === 'object') {\n p.versions = Object.keys(p['dist-tags']).reduce(function (ac, v) {\n ac[ p['dist-tags'][v] ] = v\n return ac\n }, {})\n }\n if (doc.repositories && Array.isArray(doc.repositories)) {\n doc.repository = doc.repositories[0]\n delete doc.repositories\n }\n if (doc.repository) p.repository = doc.repository\n if (doc.description) p.description = doc.description\n for (var i in doc.versions) {\n if (doc.versions[i].repository && !doc.repository) {\n p.repository = doc.versions[i].repository\n }\n if (doc.versions[i].keywords) p.keywords = doc.versions[i].keywords\n }\n send(',' + JSON.stringify(doc._id) + ':' + JSON.stringify(p))\n }\n send('}')\n if (req.query.jsonp) send(')')\n\n}","byField":"function (head, req) {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n\n if (!req.query.field) {\n start({\"code\":\"400\", \"headers\": {\"Content-Type\": \"application/json\"}})\n send('{\"error\":\"Please specify a field parameter\"}')\n return\n }\n\n start({\"code\": 200, \"headers\": {\"Content-Type\": \"application/json\"}})\n var row\n , out = {}\n , field = req.query.field\n , not = field.charAt(0) === \"!\"\n if (not) field = field.substr(1)\n while (row = getRow()) {\n if (!row.id) continue\n var has = row.value.hasOwnProperty(field)\n if (!not && !has || not && has) continue\n out[row.key] = { \"maintainers\": row.value.maintainers.map(function (m) {\n return m.name + \" <\" + m.email + \">\"\n }) }\n if (has) out[row.key][field] = row.value[field]\n }\n send(JSON.stringify(out))\n}","preBuilt":"function (head, req) {\n start({\"code\": 200, \"headers\": {\"Content-Type\": \"text/plain\"}});\n var row\n , out = []\n while (row = getRow()) {\n if (!row.id) continue\n if (!(req.query.bindist && row.value[req.query.bindist])) continue\n out.push(row.key)\n }\n send(out.join(\"\\n\"))\n}","needBuild":"function (head, req) {\n start({\"code\": 200, \"headers\": {\"Content-Type\": \"text/plain\"}});\n var row\n , first = true\n while (row = getRow()) {\n if (!row.id) continue\n if (req.query.bindist && row.value[req.query.bindist]) continue\n // out.push(row.key)\n send((first ? \"{\" : \",\")\n + JSON.stringify(row.key)\n + \":\"\n + JSON.stringify(Object.keys(row.value))\n + \"\\n\")\n first = false\n }\n send(\"}\\n\")\n}","scripts":"function (head, req) {\n var row\n , out = {}\n , scripts = req.query.scripts && req.query.scripts.split(\",\")\n , match = req.query.match\n\n if (match) match = new RegExp(match)\n\n while (row = getRow()) {\n inc = true\n if (!row.id) continue\n if (req.query.package && row.id !== req.query.package) continue\n if (scripts && scripts.length) {\n var inc = false\n for (var s = 0, l = scripts.length; s < l && !inc; s ++) {\n inc = row.value[scripts[s]]\n if (match) inc = inc && row.value[scripts[s]].match(match)\n }\n if (!inc) continue\n }\n out[row.id] = row.value\n }\n send(toJSON(out))\n}","rowdump":"function (head, req) {\n var rows = []\n while (row = getRow()) rows.push(row)\n send(toJSON(rows))\n}","passthrough":"function (head, req) {\n var out = {}\n , row\n while (row = getRow()) {\n if (!row.id) continue\n out[row.id] = row.value\n }\n send(toJSON(out))\n}","byUser":"function (head, req) {\n var out = {}\n , user = req.query.user && req.query.user !== \"-\" ? req.query.user : null\n , users = user && user.split(\"|\")\n while (row = getRow()) {\n if (!user || users.indexOf(row.key) !== -1) {\n var l = out[row.key] = out[row.key] || []\n l.push(row.value)\n }\n }\n send(toJSON(out))\n}","sortCount":"function (head, req) {\n var out = []\n while (row = getRow()) {\n out.push([row.key, row.value])\n }\n out = out.sort(function (a, b) {\n return a[1] === b[1] ? 0\n : a[1] < b[1] ? 1 : -1\n })\n var outObj = {}\n for (var i = 0, l = out.length; i < l; i ++) {\n outObj[out[i][0]] = out[i][1]\n }\n send(toJSON(outObj))\n}","size":"function (head, req) {\n var row\n , out = []\n , max = 0\n while (row = getRow()) {\n if (!row.id) continue\n out.push(row.value)\n }\n var list = []\n out = out.sort(function (a, b) {\n max = Math.max(max, a.size, b.size)\n return a.size > b.size ? -1 : 1\n })\n .reduce(function (l, r) {\n var stars = new Array(Math.ceil(80 * (r.size/max)) + 1).join(\"\\u25FE\")\n l[r._id] = { size: r.size\n , count: r.count\n , avg: r.avg\n , rel: r.size / max\n , s: stars\n }\n return l\n }, {})\n send(JSON.stringify(out))\n}","histogram":"function (head, req) {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n start({\"code\": 200, \"headers\": {\"Content-Type\": \"text/plain\"}});\n var row\n , out = []\n , max = {}\n , field = req.query.field\n , sort = req.query.sort\n , doAll = !field\n\n while (row = getRow()) {\n if (!row.id) continue\n out.push(row.value)\n }\n\n if (!doAll) out.sort(function (a, b) {\n max[field] = Math.max(max[field] || -Infinity, a[field], b[field])\n return a[field] > b[field] ? -1 : 1\n })\n else out.sort(function (a, b) {\n for (var field in a) if (field.charAt(0) !== \"_\" && !isNaN(a[field])) {\n max[field] = Math.max(max[field] || -Infinity, a[field])\n }\n for (var field in b) if (field.charAt(0) !== \"_\" && !isNaN(b[field])) {\n max[field] = Math.max(max[field] || -Infinity, b[field])\n }\n if (sort) {\n return Number(a[sort]) > Number(b[sort]) ? -1 : 1\n } else {\n return 0\n }\n })\n if (doAll) {\n // sort the fields by the max sizes.\n var m = {}\n Object.keys(max).sort(function (a, b) {\n return max[a] > max[b] ? -1 : 1\n }).forEach(function (k) { m[k] = max[k] })\n max = m\n }\n out = out.map(function (a) {\n var o = {}\n for (var f in max) {\n var blk = new Array(Math.ceil(80*(a[f] / max[f])+1)).join(\"#\")\n , spc = new Array(80 - blk.length + 1).join(\" \")\n o[f] = spc + blk + \" \" + a[f]\n }\n o._id = a._id\n return o\n }).reduce(function (l, r) {\n l[r._id] = r\n return l\n }, {})\n\n var spc = new Array(82).join(\" \")\n send(Object.keys(out).map(function (i) {\n if (doAll) return [spc + i].concat(Object.keys(max).map(function (f) {\n return out[i][f] + \" \" + f\n })).join(\"\\n\") + \"\\n\"\n return out[i][field] + \" \" + i\n }).join(\"\\n\"))\n}"},"validate_doc_update":"function (doc, oldDoc, user, dbCtx) {\n function assert (ok, message) {\n if (!ok) throw {forbidden:message}\n }\n\n // can't write to the db without logging in.\n if (!user) {\n throw { unauthorized: \"Please log in before writing to the db\" }\n }\n\n try {\n require(\"monkeypatch\").patch(Object, Date, Array, String)\n } catch (er) {\n assert(false, \"failed monkeypatching\")\n }\n\n try {\n var semver = require(\"semver\")\n var valid = require(\"valid\")\n var deep = require(\"deep\")\n var deepEquals = deep.deepEquals\n } catch (er) {\n assert(false, \"failed loading modules\")\n }\n\n try {\n if (oldDoc) oldDoc.users = oldDoc.users || {}\n doc.users = doc.users || {}\n } catch (er) {\n assert(false, \"failed checking users\")\n }\n\n\n // admins can do ANYTHING (even break stuff)\n try {\n if (isAdmin()) return\n } catch (er) {\n assert(false, \"failed checking admin-ness\")\n }\n\n // figure out what changed in the doc.\n function diffObj (o, n, p) {\n p = p || \"\"\n var d = []\n var seenKeys = []\n\n for (var i in o) {\n seenKeys.push(i)\n if (n[i] === undefined) {\n d.push(\"Deleted: \"+p+i)\n }\n else if (typeof o[i] !== typeof n[i]) {\n d.push(\"Changed Type: \"+p+i)\n }\n else if (typeof o[i] === \"object\") {\n if (o[i]) {\n if (n[i]) {\n d = d.concat(diffObj(o[i], n[i], p + i + \".\"))\n } else {\n d.push(\"Nulled: \"+p+i)\n }\n } else {\n if (n[i]) {\n d.push(\"Un-nulled: \"+p+i)\n } else {\n // they're both null, and thus equal. do nothing.\n }\n }\n }\n // non-object, non-null\n else if (o[i] !== n[i]) {\n d.push(\"Changed: \"+p+i+\" \"+JSON.stringify(o[i]) + \" -> \"\n +JSON.stringify(n[i]))\n }\n }\n\n for (var i in n) {\n if (-1 === seenKeys.indexOf(i)) {\n d.push(\"Added: \"+p+i)\n }\n }\n return d\n }\n\n // if the doc is an {error:\"blerg\"}, then throw that right out.\n // something detected in the _updates/package script.\n // XXX: Make this not ever happen ever. Validation belongs here,\n // not in the update function.\n try {\n assert(!doc.forbidden || doc._deleted, doc.forbidden)\n } catch (er) {\n assert(false, \"failed checking doc.forbidden or doc._deleted\")\n }\n\n // everyone may alter his \"starred\" status on any package\n try {\n if (oldDoc &&\n !doc._deleted &&\n deepEquals(doc, oldDoc,\n [[\"users\", user.name], [\"time\", \"modified\"]])) {\n return\n }\n } catch (er) {\n assert(false, \"failed checking starred stuff\")\n }\n\n\n // check if the user is allowed to write to this package.\n function validUser () {\n if ( !oldDoc || !oldDoc.maintainers ) return true\n if (isAdmin()) return true\n if (typeof oldDoc.maintainers !== \"object\") return true\n for (var i = 0, l = oldDoc.maintainers.length; i < l; i ++) {\n if (oldDoc.maintainers[i].name === user.name) return true\n }\n return false\n }\n\n function isAdmin () {\n if (dbCtx &&\n dbCtx.admins) {\n if (dbCtx.admins.names &&\n dbCtx.admins.roles &&\n dbCtx.admins.names.indexOf(user.name) !== -1) return true\n for (var i=0;i<user.roles.length;i++) {\n if (dbCtx.admins.roles.indexOf(user.roles[i]) !== -1) return true\n }\n }\n return user && user.roles.indexOf(\"_admin\") >= 0\n }\n\n try {\n var vu = validUser()\n } catch (er) {\n assert(false, \"problem checking user validity\");\n }\n\n if (!vu) {\n assert(vu, \"user: \" + user.name + \" not authorized to modify \"\n + oldDoc.name + \"\\n\"\n + diffObj(oldDoc, doc).join(\"\\n\"))\n }\n\n // deleting a document entirely *is* allowed.\n if (doc._deleted) return\n\n // sanity checks.\n assert(valid.name(doc.name), \"name invalid: \"+doc.name)\n\n // New documents may only be created with all lowercase names.\n // At some point, existing docs will be migrated to lowercase names\n // as well.\n if (!oldDoc && doc.name !== doc.name.toLowerCase()) {\n assert(false, \"New packages must have all-lowercase names\")\n }\n\n assert(doc.name === doc._id, \"name must match _id\")\n assert(!doc.mtime, \"doc.mtime is deprecated\")\n assert(!doc.ctime, \"doc.ctime is deprecated\")\n assert(typeof doc.time === \"object\", \"time must be object\")\n\n assert(typeof doc[\"dist-tags\"] === \"object\", \"dist-tags must be object\")\n\n var versions = doc.versions\n assert(typeof versions === \"object\", \"versions must be object\")\n\n var latest = doc[\"dist-tags\"].latest\n if (latest) {\n assert(versions[latest], \"dist-tags.latest must be valid version\")\n }\n\n // the 'latest' version must have a dist and shasum\n // I'd like to also require this of all past versions, but that\n // means going back and cleaning up about 2000 old package versions,\n // or else *new* versions of those packages can't be published.\n // Until that time, do this instead:\n var version = versions[latest]\n if (version) {\n if (!version.dist)\n assert(false, \"no dist object in \" + latest + \" version\")\n if (!version.dist.tarball)\n assert(false, \"no tarball in \" + latest + \" version\")\n if (!version.dist.shasum)\n assert(false, \"no shasum in \" + latest + \" version\")\n }\n\n for (var v in doc[\"dist-tags\"]) {\n var ver = doc[\"dist-tags\"][v]\n assert(semver.valid(ver, true),\n v + \" version invalid version: \" + ver)\n assert(versions[ver],\n v + \" version missing: \" + ver)\n }\n\n var depCount = 0\n var maxDeps = 5000\n function ridiculousDeps() {\n if (++depCount > maxDeps)\n assert(false, \"too many deps. please be less ridiculous.\")\n }\n for (var ver in versions) {\n var version = versions[ver]\n assert(semver.valid(ver, true),\n \"invalid version: \" + ver)\n assert(typeof version === \"object\",\n \"version entries must be objects\")\n assert(version.version === ver,\n \"version must match: \"+ver)\n assert(version.name === doc._id,\n \"version \"+ver+\" has incorrect name: \"+version.name)\n\n depCount = 0\n for (var dep in version.dependencies || {}) ridiculousDeps()\n for (var dep in version.devDependencies || {}) ridiculousDeps()\n for (var dep in version.optionalDependencies || {}) ridiculousDeps()\n }\n\n assert(Array.isArray(doc.maintainers),\n \"maintainers should be a list of owners\")\n doc.maintainers.forEach(function (m) {\n assert(m.name && m.email,\n \"Maintainer should have name and email: \" + JSON.stringify(m))\n })\n\n var time = doc.time\n var c = new Date(Date.parse(time.created))\n , m = new Date(Date.parse(time.modified))\n assert(c.toString() !== \"Invalid Date\",\n \"invalid created time: \" + JSON.stringify(time.created))\n\n assert(m.toString() !== \"Invalid Date\",\n \"invalid modified time: \" + JSON.stringify(time.modified))\n\n if (oldDoc &&\n oldDoc.time &&\n oldDoc.time.created &&\n Date.parse(oldDoc.time.created)) {\n assert(Date.parse(oldDoc.time.created) === Date.parse(time.created),\n \"created time cannot be changed\")\n }\n\n if (oldDoc && oldDoc.users) {\n assert(deepEquals(doc.users,\n oldDoc.users, [[user.name]]),\n \"you may only alter your own 'star' setting\")\n }\n\n if (doc.url) {\n assert(false,\n \"Package redirection has been removed. \"+\n \"Please update your publish scripts.\")\n }\n\n if (doc.description) {\n assert(typeof doc.description === 'string',\n '\"description\" field must be a string')\n }\n\n // at this point, we've passed the basic sanity tests.\n // Time to dig into more details.\n // Valid operations:\n // 1. Add a version\n // 2. Remove a version\n // 3. Modify a version\n // 4. Add or remove onesself from the \"users\" hash (already done)\n //\n // If a version is being added or changed, make sure that the\n // _npmUser field matches the current user, and that the\n // time object has the proper entry, and that the \"maintainers\"\n // matches the current \"maintainers\" field.\n //\n // Things that must not change:\n //\n // 1. More than one version being modified.\n // 2. Removing keys from the \"time\" hash\n //\n // Later, once we are off of the update function 3-stage approach,\n // these things should also be errors:\n //\n // 1. Lacking an attachment for any published version.\n // 2. Having an attachment for any version not published.\n\n var oldVersions = oldDoc ? oldDoc.versions || {} : {}\n var oldTime = oldDoc ? oldDoc.time || {} : {}\n\n var versions = Object.keys(doc.versions)\n , modified = null\n\n for (var i = 0, l = versions.length; i < l; i ++) {\n var v = versions[i]\n if (!v) continue\n assert(doc.time[v], \"must have time entry for \"+v)\n\n if (!deepEquals(doc.versions[v], oldVersions[v], [[\"directories\"], [\"deprecated\"]]) &&\n doc.versions[v]) {\n // this one was modified\n // if it's more than a few minutes off, then something is wrong.\n var t = Date.parse(doc.time[v])\n , n = Date.now()\n // assert(doc.time[v] !== oldTime[v] &&\n // Math.abs(n - t) < 1000 * 60 * 60,\n // v + \" time needs to be updated\\n\" +\n // \"new=\" + JSON.stringify(doc.versions[v]) + \"\\n\" +\n // \"old=\" + JSON.stringify(oldVersions[v]))\n\n // var mt = Date.parse(doc.time.modified).getTime()\n // , vt = t.getTime()\n // assert(Math.abs(mt - vt) < 1000 * 60 * 60,\n // v + \" is modified, should match modified time\")\n\n // XXX Remove the guard these once old docs have been found and\n // fixed. It's too big of a pain to have to manually fix\n // each one every time someone complains.\n if (typeof doc.versions[v]._npmUser !== \"object\") continue\n\n\n assert(typeof doc.versions[v]._npmUser === \"object\",\n \"_npmUser field must be object\\n\"+\n \"(You probably need to upgrade your npm version)\")\n assert(doc.versions[v]._npmUser.name === user.name,\n \"_npmUser.name must === user.name\")\n assert(deepEquals(doc.versions[v].maintainers,\n doc.maintainers),\n \"modified version 'maintainers' must === doc.maintainers\")\n\n // make sure that the _npmUser is one of the maintainers\n var found = false\n for (var j = 0, lm = doc.maintainers.length; j < lm; j ++) {\n var m = doc.maintainers[j]\n if (m.name === doc.versions[v]._npmUser.name) {\n found = true\n break\n }\n }\n assert(found, \"_npmUser must be a current maintainer.\\n\"+\n \"maintainers=\" + JSON.stringify(doc.maintainers)+\"\\n\"+\n \"current user=\" + JSON.stringify(doc.versions[v]._npmUser))\n\n } else if (oldTime[v]) {\n assert(oldTime[v] === doc.time[v],\n v + \" time should not be modified 1\")\n }\n }\n\n // now go through all the time settings that weren't covered\n for (var v in oldTime) {\n if (doc.versions[v] || !oldVersions[v]) continue\n assert(doc.time[v] === oldTime[v],\n v + \" time should not be modified 2\")\n }\n\n}","language":"javascript","deep":"exports.deepEquals = deepEquals\nexports.extend = deepExtend\nfunction deepExtend(o1, o2) {\n // extend o1 with o2 (in-place)\n for (var prop in o2) {\n if (hOP(o2, prop)) {\n if (hOP(o1, prop)) {\n if (typeof o1[prop] === \"object\") {\n deepExtend(o1[prop], o2[prop])\n }\n } else {\n o1[prop] = o2[prop]\n }\n }\n }\n return o1\n }\nfunction fullPath(pathPrefix, p){\n return pathPrefix.concat([p])\n }\nfunction isObject(v){\n return typeof v === 'object'\n }\nfunction arrayInArray(v, arr) {\n // Check whether `arr` contains an array that's shallowly equal to `v`.\n return arr.some(function(e) {\n if (e.length !== v.length) return false\n for (var i=0; i<e.length; i++) {\n if (e[i] !== v[i]) {\n return false\n }\n }\n return true\n })\n }\nfunction deepEquals(o1, o2, ignoreKeys, pathPrefix){\n pathPrefix = pathPrefix || []\n ignoreKeys = ignoreKeys || []\n function hOP (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop)\n }\n if (typeof o1 !== typeof o2) {\n return false\n } else if (!isObject(o1)) {\n return o1 === o2\n }\n for (var prop in o1) {\n if (hOP(o1, prop) &&\n !arrayInArray(fullPath(pathPrefix, prop), ignoreKeys)) {\n if (!hOP(o2, prop) ||\n !deepEquals(o1[prop],\n o2[prop],\n ignoreKeys,\n fullPath(pathPrefix, prop))) {\n return false\n }\n }\n }\n for (var prop in o2) {\n if (hOP(o2, prop) &&\n !hOP(o1, prop) &&\n !arrayInArray(fullPath(pathPrefix, prop), ignoreKeys)) {\n return false\n }\n }\n return true\n }","semver":";(function (exports) { // nothing in here is node-specific.\n\n// See http://semver.org/\n// This implementation is a *hair* less strict in that it allows\n// v1.2.3 things, and also tags that don't begin with a char.\n\nvar semver = \"\\\\s*[v=]*\\\\s*([0-9]+)\" // major\n + \"\\\\.([0-9]+)\" // minor\n + \"\\\\.([0-9]+)\" // patch\n + \"(-[0-9]+-?)?\" // build\n + \"([a-zA-Z-][a-zA-Z0-9-\\.:]*)?\" // tag\n , exprComparator = \"^((<|>)?=?)\\s*(\"+semver+\")$|^$\"\n , xRangePlain = \"[v=]*([0-9]+|x|X|\\\\*)\"\n + \"(?:\\\\.([0-9]+|x|X|\\\\*)\"\n + \"(?:\\\\.([0-9]+|x|X|\\\\*)\"\n + \"([a-zA-Z-][a-zA-Z0-9-\\.:]*)?)?)?\"\n , xRange = \"((?:<|>)=?)?\\\\s*\" + xRangePlain\n , exprSpermy = \"(?:~>?)\"+xRange\n , expressions = exports.expressions =\n { parse : new RegExp(\"^\\\\s*\"+semver+\"\\\\s*$\")\n , parsePackage : new RegExp(\"^\\\\s*([^\\/]+)[-@](\" +semver+\")\\\\s*$\")\n , parseRange : new RegExp(\n \"^\\\\s*(\" + semver + \")\\\\s+-\\\\s+(\" + semver + \")\\\\s*$\")\n , validComparator : new RegExp(\"^\"+exprComparator+\"$\")\n , parseXRange : new RegExp(\"^\"+xRange+\"$\")\n , parseSpermy : new RegExp(\"^\"+exprSpermy+\"$\")\n }\n\n\nObject.getOwnPropertyNames(expressions).forEach(function (i) {\n exports[i] = function (str) {\n return (\"\" + (str || \"\")).match(expressions[i])\n }\n})\n\nexports.rangeReplace = \">=$1 <=$7\"\nexports.clean = clean\nexports.compare = compare\nexports.rcompare = rcompare\nexports.satisfies = satisfies\nexports.gt = gt\nexports.gte = gte\nexports.lt = lt\nexports.lte = lte\nexports.eq = eq\nexports.neq = neq\nexports.cmp = cmp\nexports.inc = inc\n\nexports.valid = valid\nexports.validPackage = validPackage\nexports.validRange = validRange\nexports.maxSatisfying = maxSatisfying\n\nexports.replaceStars = replaceStars\nexports.toComparators = toComparators\n\nfunction stringify (version) {\n var v = version\n return [v[1]||'', v[2]||'', v[3]||''].join(\".\") + (v[4]||'') + (v[5]||'')\n}\n\nfunction clean (version) {\n version = exports.parse(version)\n if (!version) return version\n return stringify(version)\n}\n\nfunction valid (version) {\n if (typeof version !== \"string\") return null\n return exports.parse(version) && version.trim().replace(/^[v=]+/, '')\n}\n\nfunction validPackage (version) {\n if (typeof version !== \"string\") return null\n return version.match(expressions.parsePackage) && version.trim()\n}\n\n// range can be one of:\n// \"1.0.3 - 2.0.0\" range, inclusive, like \">=1.0.3 <=2.0.0\"\n// \">1.0.2\" like 1.0.3 - 9999.9999.9999\n// \">=1.0.2\" like 1.0.2 - 9999.9999.9999\n// \"<2.0.0\" like 0.0.0 - 1.9999.9999\n// \">1.0.2 <2.0.0\" like 1.0.3 - 1.9999.9999\nvar starExpression = /(<|>)?=?\\s*\\*/g\n , starReplace = \"\"\n , compTrimExpression = new RegExp(\"((<|>)?=?)\\\\s*(\"\n +semver+\"|\"+xRangePlain+\")\", \"g\")\n , compTrimReplace = \"$1$3\"\n\nfunction toComparators (range) {\n var ret = (range || \"\").trim()\n .replace(expressions.parseRange, exports.rangeReplace)\n .replace(compTrimExpression, compTrimReplace)\n .split(/\\s+/)\n .join(\" \")\n .split(\"||\")\n .map(function (orchunk) {\n return orchunk\n .split(\" \")\n .map(replaceXRanges)\n .map(replaceSpermies)\n .map(replaceStars)\n .join(\" \").trim()\n })\n .map(function (orchunk) {\n return orchunk\n .trim()\n .split(/\\s+/)\n .filter(function (c) { return c.match(expressions.validComparator) })\n })\n .filter(function (c) { return c.length })\n return ret\n}\n\nfunction replaceStars (stars) {\n return stars.trim().replace(starExpression, starReplace)\n}\n\n// \"2.x\",\"2.x.x\" --> \">=2.0.0- <2.1.0-\"\n// \"2.3.x\" --> \">=2.3.0- <2.4.0-\"\nfunction replaceXRanges (ranges) {\n return ranges.split(/\\s+/)\n .map(replaceXRange)\n .join(\" \")\n}\n\nfunction replaceXRange (version) {\n return version.trim().replace(expressions.parseXRange,\n function (v, gtlt, M, m, p, t) {\n var anyX = !M || M.toLowerCase() === \"x\" || M === \"*\"\n || !m || m.toLowerCase() === \"x\" || m === \"*\"\n || !p || p.toLowerCase() === \"x\" || p === \"*\"\n , ret = v\n\n if (gtlt && anyX) {\n // just replace x'es with zeroes\n ;(!M || M === \"*\" || M.toLowerCase() === \"x\") && (M = 0)\n ;(!m || m === \"*\" || m.toLowerCase() === \"x\") && (m = 0)\n ;(!p || p === \"*\" || p.toLowerCase() === \"x\") && (p = 0)\n ret = gtlt + M+\".\"+m+\".\"+p+\"-\"\n } else if (!M || M === \"*\" || M.toLowerCase() === \"x\") {\n ret = \"*\" // allow any\n } else if (!m || m === \"*\" || m.toLowerCase() === \"x\") {\n // append \"-\" onto the version, otherwise\n // \"1.x.x\" matches \"2.0.0beta\", since the tag\n // *lowers* the version value\n ret = \">=\"+M+\".0.0- <\"+(+M+1)+\".0.0-\"\n } else if (!p || p === \"*\" || p.toLowerCase() === \"x\") {\n ret = \">=\"+M+\".\"+m+\".0- <\"+M+\".\"+(+m+1)+\".0-\"\n }\n //console.error(\"parseXRange\", [].slice.call(arguments), ret)\n return ret\n })\n}\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0\nfunction replaceSpermies (version) {\n return version.trim().replace(expressions.parseSpermy,\n function (v, gtlt, M, m, p, t) {\n if (gtlt) throw new Error(\n \"Using '\"+gtlt+\"' with ~ makes no sense. Don't do it.\")\n\n if (!M || M.toLowerCase() === \"x\") {\n return \"\"\n }\n // ~1 == >=1.0.0- <2.0.0-\n if (!m || m.toLowerCase() === \"x\") {\n return \">=\"+M+\".0.0- <\"+(+M+1)+\".0.0-\"\n }\n // ~1.2 == >=1.2.0- <1.3.0-\n if (!p || p.toLowerCase() === \"x\") {\n return \">=\"+M+\".\"+m+\".0- <\"+M+\".\"+(+m+1)+\".0-\"\n }\n // ~1.2.3 == >=1.2.3- <1.3.0-\n t = t || \"-\"\n return \">=\"+M+\".\"+m+\".\"+p+t+\" <\"+M+\".\"+(+m+1)+\".0-\"\n })\n}\n\nfunction validRange (range) {\n range = replaceStars(range)\n var c = toComparators(range)\n return (c.length === 0)\n ? null\n : c.map(function (c) { return c.join(\" \") }).join(\"||\")\n}\n\n// returns the highest satisfying version in the list, or undefined\nfunction maxSatisfying (versions, range) {\n return versions\n .filter(function (v) { return satisfies(v, range) })\n .sort(compare)\n .pop()\n}\nfunction satisfies (version, range) {\n version = valid(version)\n if (!version) return false\n range = toComparators(range)\n for (var i = 0, l = range.length ; i < l ; i ++) {\n var ok = false\n for (var j = 0, ll = range[i].length ; j < ll ; j ++) {\n var r = range[i][j]\n , gtlt = r.charAt(0) === \">\" ? gt\n : r.charAt(0) === \"<\" ? lt\n : false\n , eq = r.charAt(!!gtlt) === \"=\"\n , sub = (!!eq) + (!!gtlt)\n if (!gtlt) eq = true\n r = r.substr(sub)\n r = (r === \"\") ? r : valid(r)\n ok = (r === \"\") || (eq && r === version) || (gtlt && gtlt(version, r))\n if (!ok) break\n }\n if (ok) return true\n }\n return false\n}\n\n// return v1 > v2 ? 1 : -1\nfunction compare (v1, v2) {\n var g = gt(v1, v2)\n return g === null ? 0 : g ? 1 : -1\n}\n\nfunction rcompare (v1, v2) {\n return compare(v2, v1)\n}\n\nfunction lt (v1, v2) { return gt(v2, v1) }\nfunction gte (v1, v2) { return !lt(v1, v2) }\nfunction lte (v1, v2) { return !gt(v1, v2) }\nfunction eq (v1, v2) { return gt(v1, v2) === null }\nfunction neq (v1, v2) { return gt(v1, v2) !== null }\nfunction cmp (v1, c, v2) {\n switch (c) {\n case \">\": return gt(v1, v2)\n case \"<\": return lt(v1, v2)\n case \">=\": return gte(v1, v2)\n case \"<=\": return lte(v1, v2)\n case \"==\": return eq(v1, v2)\n case \"!=\": return neq(v1, v2)\n case \"===\": return v1 === v2\n case \"!==\": return v1 !== v2\n default: throw new Error(\"Y U NO USE VALID COMPARATOR!? \"+c)\n }\n}\n\n// return v1 > v2\nfunction num (v) {\n return v === undefined ? -1 : parseInt((v||\"0\").replace(/[^0-9]+/g, ''), 10)\n}\nfunction gt (v1, v2) {\n v1 = exports.parse(v1)\n v2 = exports.parse(v2)\n if (!v1 || !v2) return false\n\n for (var i = 1; i < 5; i ++) {\n v1[i] = num(v1[i])\n v2[i] = num(v2[i])\n if (v1[i] > v2[i]) return true\n else if (v1[i] !== v2[i]) return false\n }\n // no tag is > than any tag, or use lexicographical order.\n var tag1 = v1[5] || \"\"\n , tag2 = v2[5] || \"\"\n\n // kludge: null means they were equal. falsey, and detectable.\n // embarrassingly overclever, though, I know.\n return tag1 === tag2 ? null\n : !tag1 ? true\n : !tag2 ? false\n : tag1 > tag2\n}\n\nfunction inc (version, release) {\n version = exports.parse(version)\n if (!version) return null\n\n var parsedIndexLookup =\n { 'major': 1\n , 'minor': 2\n , 'patch': 3\n , 'build': 4 }\n var incIndex = parsedIndexLookup[release]\n if (incIndex === undefined) return null\n\n var current = num(version[incIndex])\n version[incIndex] = current === -1 ? 1 : current + 1\n\n for (var i = incIndex + 1; i < 5; i ++) {\n if (num(version[i]) !== -1) version[i] = \"0\"\n }\n\n if (version[4]) version[4] = \"-\" + version[4]\n version[5] = \"\"\n\n return stringify(version)\n}\n})(typeof exports === \"object\" ? exports : semver = {})\n","valid":"var semver = require(\"semver\")\nexports.name = validName\nexports.package = validPackage\nfunction validName(name) {\n if (!name) return false\n var n = name.trim()\n if (!n || n.charAt(0) === \".\"\n || !n.match(/^[a-zA-Z0-9]/)\n || n.match(/[\\/\\(\\)&\\?#\\|<>@:%\\s\\\\\\*'\"!~`]/)\n || n.toLowerCase() === \"node_modules\"\n || n !== encodeURIComponent(n)\n || n.toLowerCase() === \"favicon.ico\") {\n return false\n }\n return n\n }\nfunction validPackage(pkg) {\n return validName(pkg.name) && semver.valid(pkg.version)\n }","Date":"exports.parse = parse\nexports.toISOString = toISOString\nexports.now = now\nfunction now() {\n return new Date().getTime()\n }\nfunction parse(s) {\n // s is something like \"2010-12-29T07:31:06Z\"\n s = s.split(\"T\")\n var ds = s[0]\n , ts = s[1]\n , d = new Date()\n ds = ds.split(\"-\")\n ts = ts.split(\":\")\n var tz = ts[2].substr(2)\n ts[2] = ts[2].substr(0, 2)\n d.setUTCFullYear(+ds[0])\n d.setUTCMonth(+ds[1]-1)\n d.setUTCDate(+ds[2])\n d.setUTCHours(+ts[0])\n d.setUTCMinutes(+ts[1])\n d.setUTCSeconds(+ts[2])\n d.setUTCMilliseconds(0)\n return d.getTime()\n }\nexports.toISOString = toISOString\nfunction toISOString() { return ISODateString(this) }\nfunction pad(n){return n<10 ? '0'+n : n}\nfunction ISODateString(d){\n return d.getUTCFullYear()+'-'\n + pad(d.getUTCMonth()+1)+'-'\n + pad(d.getUTCDate())+'T'\n + pad(d.getUTCHours())+':'\n + pad(d.getUTCMinutes())+':'\n + pad(d.getUTCSeconds())+'Z'}","Object":"exports.keys = keys\nfunction keys(o) {\n var a = []\n for (var i in o) a.push(i)\n return a }","Array":"exports.isArray = isArray\nexports.forEach = forEach\n\nexports.reduce = reduce\n\nfunction forEach(fn) {\n for (var i = 0, l = this.length; i < l; i ++) {\n if (this.hasOwnProperty(i)) {\n fn(this[i], i, this)\n }\n }\n }\nfunction reduce(callback, initialValue) {\n var previousValue = initialValue || this[0];\n for (var i = initialValue ? 0 : 1; i < this.length; i++) {\n previousValue = callback(previousValue, this[i], i, this);\n }\n return previousValue;\n }\nfunction isArray(a) {\n return a instanceof Array\n || Object.prototype.toString.call(a) === \"[object Array]\"\n || (typeof a === \"object\" && typeof a.length === \"number\") }","String":"exports.trim = trim\nfunction trim() {\n return this.replace(/^\\s+|\\s+$/g, \"\")\n }","monkeypatch":"exports.patch = patch\nfunction patch(Object, Date, Array, String) {\n if (!Date.parse || isNaN(Date.parse(\"2010-12-29T07:31:06Z\"))) {\n Date.parse = require(\"Date\").parse\n }\n\n Date.prototype.toISOString = Date.prototype.toISOString\n || require(\"Date\").toISOString\n\n Date.now = Date.now\n || require(\"Date\").now\n\n Object.keys = Object.keys\n || require(\"Object\").keys\n\n Array.prototype.forEach = Array.prototype.forEach\n || require(\"Array\").forEach\n\n Array.prototype.reduce = Array.prototype.reduce\n || require(\"Array\").reduce\n\n Array.isArray = Array.isArray\n || require(\"Array\").isArray\n\n String.prototype.trim = String.prototype.trim\n || require(\"String\").trim\n }","attachments_md5":{}}},
{"id":"_design/ui","key":"_design/ui","value":{"rev":"11-72238ebbf93c034d42138992292bf120"},"doc":{"_id":"_design/ui","_rev":"11-72238ebbf93c034d42138992292bf120","rewrites":[{"from":"/","to":"index.html"},{"from":"/favicon.ico","to":"../../npm/favicon.ico"},{"from":"/api","to":"../../"},{"from":"/api/*","to":"../../*"},{"from":"/*","to":"*"}],"lists":{"dependencies_limit":"function (head, req) {\n var deps = [];\n while(row = getRow()) {\n deps.push(row);\n }\n var sorted = deps.sort(function(a,b) { return req.query.descending !== \"true\" ? a.value - b.value : b.value - a.value; }); \n // using list_Limit rather than limit because limit appears to limit the initial view set\n // assuming there's a supported convention but using this for now\n var limit = req.query.list_limit && parseInt(req.query.list_limit);\n send(JSON.stringify({ total_rows: deps.length, rows: limit ? sorted.splice(0, limit) : sorted}));\n}","search":"function (head, req) {\n Object.keys = Object.keys\n || function (o) { var a = []\n for (var i in o) a.push(i)\n return a }\n var set = {};\n var rows = [];\n while(row = getRow()) {\n set[row.id] = { key: row.id, count: set[row.id] ? set[row.id].count + 1 : 1, value: row.value };\n }\n var keys = Object.keys(set);\n for(var i=0; i<keys.length; i++) {\n rows.push(set[keys[i]]);\n }\n send(JSON.stringify({ rows: rows} ));\n}"},"views":{"search":{"map":"function (doc) {\n var descriptionBlacklist =\n [ \"for\"\n , \"and\"\n , \"in\"\n , \"are\"\n , \"is\"\n , \"it\"\n , \"do\"\n , \"of\"\n , \"on\"\n , \"the\"\n , \"to\"\n , \"as\"\n ]\n\n if (doc.name) { // There aren't any better attributes for check if isPackage()\n if (doc.name) {\n var names = [doc.name];\n if (doc.name.indexOf('-') !== -1) doc.name.split('-').forEach(function (n) {names.push(n)});\n if (doc.name.indexOf('_') !== -1) doc.name.split('_').forEach(function (n) {names.push(n)});\n names.forEach(function (n) {\n if (n.length > 1) emit(n.toLowerCase(), doc);\n });\n }\n if (doc['dist-tags'] && doc['dist-tags'].latest && (\n doc.versions[doc['dist-tags'].latest].keywords || doc.versions[doc['dist-tags'].latest].tags\n )) {\n var tags = (doc.versions[doc['dist-tags'].latest].keywords || doc.versions[doc['dist-tags'].latest].tags)\n tags.forEach(function (tag) {\n tag.split(' ').forEach(function (t) {\n if (t.length > 0) emit(t.toLowerCase(), doc);\n });\n })\n }\n if (doc.description) {\n doc.description.split(' ').forEach(function (d) {\n d = d.toLowerCase();\n while (d.indexOf('.') !== -1) d = d.replace('.', '');\n while (d.indexOf('\\n') !== -1) d = d.replace('\\n', '');\n while (d.indexOf('\\r') !== -1) d = d.replace('\\n', '');\n while (d.indexOf('`') !== -1) d = d.replace('`', '');\n while (d.indexOf('_') !== -1) d = d.replace('_', '');\n while (d.indexOf('\"') !== -1) d = d.replace('\"', '');\n while (d.indexOf('\\'') !== -1) d = d.replace('\\'', '');\n while (d.indexOf('(') !== -1) d = d.replace('(', '');\n while (d.indexOf(')') !== -1) d = d.replace(')', '');\n while (d.indexOf('[') !== -1) d = d.replace('[', '');\n while (d.indexOf(']') !== -1) d = d.replace(']', '');\n while (d.indexOf('{') !== -1) d = d.replace('{', '');\n while (d.indexOf('}') !== -1) d = d.replace('}', '');\n while (d.indexOf('*') !== -1) d = d.replace('*', '');\n while (d.indexOf('%') !== -1) d = d.replace('%', '');\n while (d.indexOf('+') !== -1) d = d.replace('+', '');\n if (descriptionBlacklist.indexOf(d) !== -1) d = '';\n if (d.length > 1) emit(d, doc);\n })\n }\n }\n}"},"dependencies":{"map":"function (doc) {\n if (doc['dist-tags'] && doc['dist-tags'].latest) {\n var dist = doc.versions[doc['dist-tags'].latest];\n for (i in dist.dependencies) {\n emit(i, dist.dependencies[i])\n }\n }\n}","reduce":"_count"},"updated":{"map":"function (doc) {\n var l = doc[\"dist-tags\"].latest\n , t = doc.time && doc.time[l]\n if (t) emit(t, 1)\n }"},"tags":{"map":"function (doc) {\n if (doc['dist-tags'] && doc['dist-tags'].latest) {\n doc.versions[doc['dist-tags'].latest].tags.forEach(function (t) {emit(t, 1)})\n }\n }","reduce":"_sum"},"author":{"map":"function (doc) {\n if (doc.author && doc.author.name) {\n emit(doc.author.name, 1);\n }\n }","reduce":"_sum"},"analytics":{"map":"function (doc) {\n if (doc.time) {\n if (doc.time.modified) {\n emit(['latest', doc.time.modified], 1);\n }\n if (doc.time.created) {\n emit(['created', doc.time.created], 1);\n }\n for (i in doc.time) {\n emit(['update', doc.time[i]], 1);\n }\n }\n }","reduce":"_sum"}},"attachments_md5":{"index.html":{"revpos":11,"md5":"f16240ceb6d5616ae1be91fa6fbdf017"},"install.html":{"revpos":1,"md5":"55bf441135b94b8b35c45a57e2f7e319"},"layout.css":{"revpos":4,"md5":"a234123b423709a4c43877ab2acb1cf1"},"jquery-1.4.4.min.js":{"revpos":1,"md5":"b98dc4a66b80cce329d9127809a2ff2a"},"layout.less":{"revpos":4,"md5":"b9ba76ae0cda33ff5bef167c25367e33"},"more.html":{"revpos":8,"md5":"9cb4a92e10884700d508349e71600286"},"publish.html":{"revpos":1,"md5":"d41d8cd98f00b204e9800998ecf8427e"},"site.js":{"revpos":8,"md5":"73c24d091924c7663e05bdaaaf441181"},"font/lte-ie7.js":{"revpos":1,"md5":"8c4c685f89a7a74bd8d3a0cbb6f60b4d"},"font/style.css":{"revpos":1,"md5":"4a84319933131d34edaff48289363c46"},"highcharts/highcharts.js":{"revpos":1,"md5":"4aa9e4f9a6ef342833ada17a18c890bf"},"highcharts/highcharts.src.js":{"revpos":1,"md5":"034471e80b5823580cadec6d34921eba"},"images/grid.png":{"revpos":1,"md5":"3dd68c817f16fda945d20f92edc3c147"},"font/fonts/icomoon.dev.svg":{"revpos":1,"md5":"0f84ee962786e36dd9b3c408ad16a1ba"},"sammy/sammy.js":{"revpos":1,"md5":"c5a398f8a0cc398aa3b5dfe286faf96b"},"font/fonts/icomoon.eot":{"revpos":1,"md5":"9467b6a127a8951bdbd627d4f13a2c71"},"font/fonts/icomoon.svg":{"revpos":1,"md5":"00a67d2bf8b106611299271b9aefd09e"},"font/fonts/icomoon.ttf":{"revpos":1,"md5":"bc5cbab341253b940496b955246a6fb9"},"font/fonts/icomoon.woff":{"revpos":1,"md5":"558b14a6e20053e0f0a1d91dcd7fe902"},"highcharts/adapters/mootools-adapter.js":{"revpos":1,"md5":"0f93b25be20fc3fa78e4591c3d6db2ac"},"highcharts/adapters/mootools-adapter.src.js":{"revpos":1,"md5":"28fbba0705ca9e5f77bc88cd2dfe904f"},"highcharts/adapters/prototype-adapter.js":{"revpos":1,"md5":"892cba203fb03cd5ab7aef6e06d01ea6"},"highcharts/adapters/prototype-adapter.src.js":{"revpos":1,"md5":"8823ff4ca87229d2b27377856d30d0ef"},"highcharts/modules/exporting.js":{"revpos":1,"md5":"f40bf4f0939bfa9ea00d26e3f469ba4d"},"highcharts/modules/exporting.src.js":{"revpos":1,"md5":"1ba845a6d6271eac3c7a62364f97fbd2"},"highcharts/themes/dark-blue.js":{"revpos":1,"md5":"920aa8bbc20f7b8545afde3c13692b07"},"highcharts/themes/dark-green.js":{"revpos":1,"md5":"7764fb23c1061ac47d1a9c28856691df"},"highcharts/themes/gray.js":{"revpos":1,"md5":"0152e6188239e1ee9c99690ee5fd5389"},"highcharts/themes/grid.js":{"revpos":1,"md5":"8cd17310daf08b230fe4f2a8d510c9af"},"sammy/plugins/sammy.cache.js":{"revpos":1,"md5":"a5efb3f6502d5b92a318cb4cfdcc8ded"},"sammy/plugins/sammy.data_location_proxy.js":{"revpos":1,"md5":"c0a63ef0f53fdb99db36279065ab659c"},"sammy/plugins/sammy.ejs.js":{"revpos":1,"md5":"b8fb0aa404893fc3c4251553fd9fc134"},"sammy/plugins/sammy.form.js":{"revpos":1,"md5":"cf989e817d60ea28bc09d7295326e25b"},"sammy/plugins/sammy.haml.js":{"revpos":1,"md5":"5da014e7fd1a6c9c37e4fe04113b6f19"},"sammy/plugins/sammy.json.js":{"revpos":1,"md5":"ad0025eebda6b01c4f512610b5a7b5f1"},"sammy/plugins/sammy.meld.js":{"revpos":1,"md5":"4b57aa753265ad1d7f6d5e8e42a98806"},"sammy/plugins/sammy.mustache.js":{"revpos":1,"md5":"7860637317f506763a48abae53e0fb78"},"sammy/plugins/sammy.nested_params.js":{"revpos":1,"md5":"9dba27635b4762c94fb110cbc112940f"},"sammy/plugins/sammy.path_location_proxy.js":{"revpos":1,"md5":"5b2586d7b05490634549a9b06a681a39"},"sammy/plugins/sammy.pure.js":{"revpos":1,"md5":"3f1efe82b6732fb1e10bfd1c5cc67549"},"sammy/plugins/sammy.template.js":{"revpos":1,"md5":"7c15f08d4f545fd42b7cb9e4ba0b2d64"},"sammy/plugins/sammy.storage.js":{"revpos":1,"md5":"e7f6a9c824955371d00baef68c84ec88"},"sammy/plugins/sammy.title.js":{"revpos":1,"md5":"f922abe81d6aa903d6d8dfd9c26e54dd"},"images/favicon.ico":{"revpos":7,"md5":"b5e444cbda88cbd173b469322f798e6a"},"stats.html":{"revpos":11,"md5":"b22c5c664db3019a181f07a3a292b62b"},"stats.js":{"revpos":11,"md5":"e2e092c1ae0018fb5320f4aa2dbf7211"}},"_attachments":{"index.html":{"content_type":"text/html","revpos":11,"digest":"md5-RQJyxPiInnGNdNq8aJQwZQ==","length":2040,"stub":true},"install.html":{"content_type":"text/html","revpos":1,"digest":"md5-Ye7ZVxZ2++K6BLsfS/xZBw==","length":645,"stub":true},"layout.css":{"content_type":"text/css","revpos":4,"digest":"md5-9wtyBBCSMXAQbSAWDifaJQ==","length":6380,"stub":true},"jquery-1.4.4.min.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-egtmAvWRoXGzczgUgIjhIw==","length":78601,"stub":true},"layout.less":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-vrogd1iO8Q1lllJzD2cmgA==","length":7020,"stub":true},"more.html":{"content_type":"text/html","revpos":8,"digest":"md5-z2yuH0iU+x/35CNg595UQg==","length":106,"stub":true},"publish.html":{"content_type":"text/html","revpos":1,"digest":"md5-cCkGbCesb17xjWYNV0GXmg==","length":0,"stub":true},"site.js":{"content_type":"text/javascript","revpos":8,"digest":"md5-xff4oLlysAz5YwW+U+HNDA==","length":33680,"stub":true},"font/lte-ie7.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-tdWn8k5BsKO3AZqe16D93g==","length":651,"stub":true},"font/style.css":{"content_type":"text/css","revpos":1,"digest":"md5-cP6ufpM5VJ4LVeWMN9r6+g==","length":1067,"stub":true},"highcharts/highcharts.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-L5iin5UfmurqDXuEu/7t7Q==","length":78273,"stub":true},"highcharts/highcharts.src.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-RFNQp9bnRimBLnbjx8lEow==","length":257630,"stub":true},"images/grid.png":{"content_type":"image/png","revpos":1,"digest":"md5-YX/hNKckpmvojDXBEKWrpg==","length":1169,"stub":true},"font/fonts/icomoon.dev.svg":{"content_type":"image/svg+xml","revpos":1,"digest":"md5-XZJtVMOJr2CjBOE/bOIWnQ==","length":1334,"stub":true},"sammy/sammy.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-OE0/hQeoRVcCTYJvHGwlGg==","length":61422,"stub":true},"font/fonts/icomoon.eot":{"content_type":"application/octet-stream","revpos":1,"digest":"md5-RbwWBUruH2i/r7PAfZBH7A==","length":1644,"stub":true},"font/fonts/icomoon.svg":{"content_type":"image/svg+xml","revpos":1,"digest":"md5-HK9W+zW0lzKp20Qq6NNa5A==","length":1315,"stub":true},"font/fonts/icomoon.ttf":{"content_type":"application/octet-stream","revpos":1,"digest":"md5-/7gnS/PMLkeQ0XsFJr3qbg==","length":1480,"stub":true},"font/fonts/icomoon.woff":{"content_type":"application/octet-stream","revpos":1,"digest":"md5-6bpQk5EYg5kSd+llzVxLyw==","length":1216,"stub":true},"highcharts/adapters/mootools-adapter.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-dAG6kXnGolUxMLQGodYVww==","length":1436,"stub":true},"highcharts/adapters/mootools-adapter.src.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-eTWK8TeR1sE8ZazuUb1ubw==","length":4952,"stub":true},"highcharts/adapters/prototype-adapter.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-r9T+jlUuk3a318P5hN/clw==","length":2627,"stub":true},"highcharts/adapters/prototype-adapter.src.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-Me7yZazv1jhKKma7SyicwA==","length":6301,"stub":true},"highcharts/modules/exporting.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-KNM34N6fMaNb3PC9LN6Yzg==","length":6540,"stub":true},"highcharts/modules/exporting.src.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-CO+SMUg7cs8kONJ/4jr9VQ==","length":16390,"stub":true},"highcharts/themes/dark-blue.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-GvivXPORn0iCi9uX9agD9g==","length":3011,"stub":true},"highcharts/themes/dark-green.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-vwnH2bHRUlV8rS0aKrFy4Q==","length":3011,"stub":true},"highcharts/themes/gray.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-tXGEcnhAdr4P9urlnq3OhA==","length":2830,"stub":true},"highcharts/themes/grid.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-sswnXWJN2OF8AYi7jW7t/Q==","length":1812,"stub":true},"sammy/plugins/sammy.cache.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-PqoP0C+fEHigkmb3xxw5eg==","length":3546,"stub":true},"sammy/plugins/sammy.data_location_proxy.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-qyK3xW+7b7tMsKk9OX+FLQ==","length":2775,"stub":true},"sammy/plugins/sammy.ejs.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-6L4n9EAVJcz40jgBbCz+3Q==","length":23304,"stub":true},"sammy/plugins/sammy.form.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-Sg60GLaecqCieE39D7hMAA==","length":9974,"stub":true},"sammy/plugins/sammy.haml.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-ea9RqVNgQqYnwujoAvwmpw==","length":16127,"stub":true},"sammy/plugins/sammy.json.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-0hSBTiIHeoEm4nF1PRjLOQ==","length":12582,"stub":true},"sammy/plugins/sammy.meld.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-7FrZ74iKXTLiGMshMk6EYw==","length":4394,"stub":true},"sammy/plugins/sammy.mustache.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-dxYxEUy12L6fXjuMTRiniA==","length":13681,"stub":true},"sammy/plugins/sammy.nested_params.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-2rUVh3ypoLJ0YoxZ39w2Bw==","length":3578,"stub":true},"sammy/plugins/sammy.path_location_proxy.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-FYdivUlAEqkIMl+lzzEZKg==","length":795,"stub":true},"sammy/plugins/sammy.pure.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-MO9Z/F/+yEP3RJfvp9EEcQ==","length":23731,"stub":true},"sammy/plugins/sammy.template.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-tEtVElZrNHvmmmJaIDBnCg==","length":4143,"stub":true},"sammy/plugins/sammy.storage.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-qYIuvNJcCwMoOWg76ArwsA==","length":20830,"stub":true},"sammy/plugins/sammy.title.js":{"content_type":"text/javascript","revpos":1,"digest":"md5-Hv1mXAzxIO1Q5itp6AaOug==","length":1704,"stub":true},"images/favicon.ico":{"content_type":"image/x-icon","revpos":7,"digest":"md5-YPjO/DTF2BQXW+2e8TlqmQ==","length":1150,"stub":true},"stats.html":{"content_type":"text/html","revpos":11,"digest":"md5-SCTRWTNLYTJYJdcR8igfYg==","length":913,"stub":true},"stats.js":{"content_type":"text/javascript","revpos":11,"digest":"md5-Rooj6Aj+qKDFHubIGQfAOw==","length":2300,"stub":true}}}},
{"id":"com.ankamagames.plugins.sysinfo","key":"com.ankamagames.plugins.sysinfo","value":{"rev":"3-99c60ebf0269654ae82cdc50aafc69b5"},"doc":{"_id":"com.ankamagames.plugins.sysinfo","_rev":"3-99c60ebf0269654ae82cdc50aafc69b5","name":"com.ankamagames.plugins.sysinfo","description":"\n\t\tThis plugin allows you to get various system information like memory, cpu...\n\t","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"version":"0.1.0","name":"com.ankamagames.plugins.sysinfo","cordova_name":"Sysinfo","description":"\n\t\tThis plugin allows you to get various system information like memory, cpu...\n\t","license":"MIT","engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"# Sysinfo\n\n> Sysinfo plugin for android (iOS and WP in progress) allow you to get information about memory available, total... and number of CPU Cores, max frequency for each cores\n\n## Installation:\n\n### local\n\nAdd the following feature tag in your config.xml\n\n\t<feature name=\"Sysinfo\" >\n\t\t< param name=\"android-package\" value=\"com.ankamagames.plugins.sysinfo.Sysinfo\"/>\n\t</feature>\n\nThis plugin is based on [plugman](https://github.com/apache/cordova-plugman). to install it to your app,\nsimply execute plugman as follows;\n\n\tplugman install --platform [PLATFORM] --project [TARGET-PATH] --plugin [PLUGIN-PATH]\n\n\twhere\n\t\t[PLATFORM] = android\n\t\t[TARGET-PATH] = path to folder containing your project\n\t\t[PLUGIN-PATH] = path to folder containing this plugin\n\t\t\nFor additional info, take a look at the [Plugman Documentation](https://github.com/apache/cordova-plugman/blob/master/README.md)\n\n### PhoneGap Build\n\nTo use this plugin with PhoneGap Build, add the following plugin reference to your config.xml\n\n\t<gap:plugin name=\"com.ankamagames.plugins.sysinfo\" />\n\n## Usage\nThe plugin creates the object `window.Sysinfo\n\nAfter onDeviceReady, you can access to Sysinfo global variable\n\n\tfunction onDeviceReady() {\n\t\tconsole.log(Sysinfo);\n\t}\n\n## License ##\n\nThe MIT License\n\nCopyright (c) 2012 Bob Easterday, Adobe Systems\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies 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,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.","readmeFilename":"README.md","_id":"com.ankamagames.plugins.sysinfo@0.1.0","dist":{"shasum":"c2ff18980aa9e5d7c55e4a2c6ff7d7ca8622cd87","tarball":"http://registry.cordova.io/com.ankamagames.plugins.sysinfo/-/com.ankamagames.plugins.sysinfo-0.1.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"fryckoort","email":"fryckoort@ankama.com"},"maintainers":[{"name":"fryckoort","email":"fryckoort@ankama.com"}]}},"readme":"# Sysinfo\n\n> Sysinfo plugin for android (iOS and WP in progress) allow you to get information about memory available, total... and number of CPU Cores, max frequency for each cores\n\n## Installation:\n\n### local\n\nAdd the following feature tag in your config.xml\n\n\t<feature name=\"Sysinfo\" >\n\t\t< param name=\"android-package\" value=\"com.ankamagames.plugins.sysinfo.Sysinfo\"/>\n\t</feature>\n\nThis plugin is based on [plugman](https://github.com/apache/cordova-plugman). to install it to your app,\nsimply execute plugman as follows;\n\n\tplugman install --platform [PLATFORM] --project [TARGET-PATH] --plugin [PLUGIN-PATH]\n\n\twhere\n\t\t[PLATFORM] = android\n\t\t[TARGET-PATH] = path to folder containing your project\n\t\t[PLUGIN-PATH] = path to folder containing this plugin\n\t\t\nFor additional info, take a look at the [Plugman Documentation](https://github.com/apache/cordova-plugman/blob/master/README.md)\n\n### PhoneGap Build\n\nTo use this plugin with PhoneGap Build, add the following plugin reference to your config.xml\n\n\t<gap:plugin name=\"com.ankamagames.plugins.sysinfo\" />\n\n## Usage\nThe plugin creates the object `window.Sysinfo\n\nAfter onDeviceReady, you can access to Sysinfo global variable\n\n\tfunction onDeviceReady() {\n\t\tconsole.log(Sysinfo);\n\t}\n\n## License ##\n\nThe MIT License\n\nCopyright (c) 2012 Bob Easterday, Adobe Systems\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies 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,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.","maintainers":[{"name":"fryckoort","email":"fryckoort@ankama.com"}],"time":{"modified":"2013-12-10T13:32:13.601Z","created":"2013-12-10T13:32:12.649Z","0.1.0":"2013-12-10T13:32:13.601Z"},"_attachments":{"com.ankamagames.plugins.sysinfo-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-EFbUvrTsq6JFZC8lL1Crvw==","length":27270,"stub":true}}}},
{"id":"com.blackberry.app","key":"com.blackberry.app","value":{"rev":"3-3d52392d9d6340229df9d4193fb427d7"},"doc":{"_id":"com.blackberry.app","_rev":"3-3d52392d9d6340229df9d4193fb427d7","name":"com.blackberry.app","description":"BlackBerry 10 Application APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.app","description":"BlackBerry 10 Application APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.app@1.0.0","dist":{"shasum":"2209f78c9a09b14c3a26cfb58257eaeaf3eacf34","tarball":"http://registry.cordova.io/com.blackberry.app/-/com.blackberry.app-1.0.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T13:53:05.737Z","created":"2013-10-22T13:53:05.304Z","1.0.0":"2013-10-22T13:53:05.737Z"},"_attachments":{"com.blackberry.app-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-+T/zBehX7XTARNkw52s81g==","length":3498,"stub":true}}}},
{"id":"com.blackberry.bbm.platform","key":"com.blackberry.bbm.platform","value":{"rev":"3-38a04b708dbd33f0f32b907f6589c583"},"doc":{"_id":"com.blackberry.bbm.platform","_rev":"3-38a04b708dbd33f0f32b907f6589c583","name":"com.blackberry.bbm.platform","description":"BlackBerry 10 BBM Platform APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.bbm.platform","description":"BlackBerry 10 BBM Platform APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.bbm.platform@1.0.0","dist":{"shasum":"f258f735bf78d693530707f7c7e601fd5f427877","tarball":"http://registry.cordova.io/com.blackberry.bbm.platform/-/com.blackberry.bbm.platform-1.0.0.tgz"},"_from":"com.blackberry.bbm.platform/","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T14:17:32.133Z","created":"2013-10-22T14:17:31.436Z","1.0.0":"2013-10-22T14:17:32.133Z"},"_attachments":{"com.blackberry.bbm.platform-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-AWO5rwmlsyahSwNLKUVg5g==","length":323190,"stub":true}}}},
{"id":"com.blackberry.community.barcodescanner","key":"com.blackberry.community.barcodescanner","value":{"rev":"3-0e085796a5f3e284bd0c5c0c51ac92ce"},"doc":{"_id":"com.blackberry.community.barcodescanner","_rev":"3-0e085796a5f3e284bd0c5c0c51ac92ce","name":"com.blackberry.community.barcodescanner","description":"BlackBerry 10 Community Contributed API to scan barcodes","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.community.barcodescanner","cordova_name":"Barcode Scanner","description":"BlackBerry 10 Community Contributed API to scan barcodes","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.community.barcodescanner@1.0.0","dist":{"shasum":"254a91b775049b5a9fe82d31bad853011be4cfcb","tarball":"http://registry.cordova.io/com.blackberry.community.barcodescanner/-/com.blackberry.community.barcodescanner-1.0.0.tgz"},"_from":"C:\\Users\\twindsor\\Documents\\Github\\WebWorks-Community-APIs\\BB10-Cordova\\BarcodeScanner\\plugin","_npmVersion":"1.3.4","_npmUser":{"name":"timwindsor","email":"timothy.windsor@gmail.com"},"maintainers":[{"name":"timwindsor","email":"timothy.windsor@gmail.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"timwindsor","email":"timothy.windsor@gmail.com"}],"time":{"modified":"2014-01-10T20:11:33.670Z","created":"2014-01-10T20:11:32.005Z","1.0.0":"2014-01-10T20:11:33.670Z"},"_attachments":{"com.blackberry.community.barcodescanner-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-+GdSns6LeaUGnLAc7AMCuA==","length":1031093,"stub":true}}}},
{"id":"com.blackberry.community.clipboard","key":"com.blackberry.community.clipboard","value":{"rev":"3-981f00aec16dfa48310512edc93e7b63"},"doc":{"_id":"com.blackberry.community.clipboard","_rev":"3-981f00aec16dfa48310512edc93e7b63","name":"com.blackberry.community.clipboard","description":"BlackBerry 10 Community Contributed API to access the system clipboard","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.community.clipboard","cordova_name":"Clipboard","description":"BlackBerry 10 Community Contributed API to access the system clipboard","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.community.clipboard@1.0.0","dist":{"shasum":"0c57bd90ba9b66d73f63f422a07a5dc886216af0","tarball":"http://registry.cordova.io/com.blackberry.community.clipboard/-/com.blackberry.community.clipboard-1.0.0.tgz"},"_from":"C:\\Users\\twindsor\\Documents\\Github\\WebWorks-Community-APIs\\BB10-Cordova\\Clipboard\\plugin","_npmVersion":"1.3.4","_npmUser":{"name":"timwindsor","email":"timothy.windsor@gmail.com"},"maintainers":[{"name":"timwindsor","email":"timothy.windsor@gmail.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"timwindsor","email":"timothy.windsor@gmail.com"}],"time":{"modified":"2014-01-10T20:23:07.214Z","created":"2014-01-10T20:23:05.878Z","1.0.0":"2014-01-10T20:23:07.214Z"},"_attachments":{"com.blackberry.community.clipboard-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-9CAuuJL3vON4k6Z7zwrfqw==","length":663651,"stub":true}}}},
{"id":"com.blackberry.community.curl","key":"com.blackberry.community.curl","value":{"rev":"3-5faa0ad64930c9ab689fbf88294a34fe"},"doc":{"_id":"com.blackberry.community.curl","_rev":"3-5faa0ad64930c9ab689fbf88294a34fe","name":"com.blackberry.community.curl","description":"BlackBerry 10 Community Contributed API to make network calls with CURL","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.community.curl","cordova_name":"Curl","description":"BlackBerry 10 Community Contributed API to make network calls with CURL","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.community.curl@1.0.0","dist":{"shasum":"93fc0a6c1b2141f1b9eaad62318f2ae9a70ad966","tarball":"http://registry.cordova.io/com.blackberry.community.curl/-/com.blackberry.community.curl-1.0.0.tgz"},"_from":"C:\\Users\\twindsor\\Documents\\Github\\WebWorks-Community-APIs\\BB10-Cordova\\Curl\\plugin","_npmVersion":"1.3.4","_npmUser":{"name":"timwindsor","email":"timothy.windsor@gmail.com"},"maintainers":[{"name":"timwindsor","email":"timothy.windsor@gmail.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"timwindsor","email":"timothy.windsor@gmail.com"}],"time":{"modified":"2014-01-10T20:22:53.933Z","created":"2014-01-10T20:22:52.529Z","1.0.0":"2014-01-10T20:22:53.933Z"},"_attachments":{"com.blackberry.community.curl-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-wJXwvYsPiSyAwQRRWPoDnA==","length":665061,"stub":true}}}},
{"id":"com.blackberry.community.extractzipfile","key":"com.blackberry.community.extractzipfile","value":{"rev":"3-09cfe0b164dbff8936fee3e681cb737c"},"doc":{"_id":"com.blackberry.community.extractzipfile","_rev":"3-09cfe0b164dbff8936fee3e681cb737c","name":"com.blackberry.community.extractzipfile","description":"BlackBerry 10 Community Contributed API to unzip files","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.community.extractzipfile","cordova_name":"ExtractZipFile","description":"BlackBerry 10 Community Contributed API to unzip files","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.community.extractzipfile@1.0.0","dist":{"shasum":"157233d78b7d6127aabd5bbfc0fb040c741cef94","tarball":"http://registry.cordova.io/com.blackberry.community.extractzipfile/-/com.blackberry.community.extractzipfile-1.0.0.tgz"},"_from":"C:\\Users\\twindsor\\Documents\\Github\\WebWorks-Community-APIs\\BB10-Cordova\\ExtractZipFile\\plugin","_npmVersion":"1.3.4","_npmUser":{"name":"timwindsor","email":"timothy.windsor@gmail.com"},"maintainers":[{"name":"timwindsor","email":"timothy.windsor@gmail.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"timwindsor","email":"timothy.windsor@gmail.com"}],"time":{"modified":"2014-01-10T20:23:20.576Z","created":"2014-01-10T20:23:19.954Z","1.0.0":"2014-01-10T20:23:20.576Z"},"_attachments":{"com.blackberry.community.extractzipfile-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-9fo1PxtFmS+jSGEW4BaiOA==","length":259917,"stub":true}}}},
{"id":"com.blackberry.community.preventsleep","key":"com.blackberry.community.preventsleep","value":{"rev":"3-21df9b62a76a32010239bbc07ca2fb67"},"doc":{"_id":"com.blackberry.community.preventsleep","_rev":"3-21df9b62a76a32010239bbc07ca2fb67","name":"com.blackberry.community.preventsleep","description":"BlackBerry 10 Community Contributed API to keep the screen on","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.community.preventsleep","cordova_name":"Prevent Sleep","description":"BlackBerry 10 Community Contributed API to keep the screen on","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.community.preventsleep@1.0.0","dist":{"shasum":"a53d46b60ccc56d9181ba95c9063dea1dfe46397","tarball":"http://registry.cordova.io/com.blackberry.community.preventsleep/-/com.blackberry.community.preventsleep-1.0.0.tgz"},"_from":"C:\\Users\\twindsor\\Documents\\Github\\WebWorks-Community-APIs\\BB10-Cordova\\PreventSleep\\plugin","_npmVersion":"1.3.4","_npmUser":{"name":"timwindsor","email":"timothy.windsor@gmail.com"},"maintainers":[{"name":"timwindsor","email":"timothy.windsor@gmail.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"timwindsor","email":"timothy.windsor@gmail.com"}],"time":{"modified":"2014-01-10T20:03:55.526Z","created":"2014-01-10T20:03:54.170Z","1.0.0":"2014-01-10T20:03:55.526Z"},"_attachments":{"com.blackberry.community.preventsleep-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-U70R0cZF1C86gZzypfWpwA==","length":669837,"stub":true}}}},
{"id":"com.blackberry.connection","key":"com.blackberry.connection","value":{"rev":"3-4749eb6357e4a2b56eb2b20c594d6626"},"doc":{"_id":"com.blackberry.connection","_rev":"3-4749eb6357e4a2b56eb2b20c594d6626","name":"com.blackberry.connection","description":"BlackBerry 10 Connection APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.connection","description":"BlackBerry 10 Connection APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.connection@1.0.0","dist":{"shasum":"57de2de0914f2dd321ba7501d7b4bfe62c08bfc4","tarball":"http://registry.cordova.io/com.blackberry.connection/-/com.blackberry.connection-1.0.0.tgz"},"_from":"com.blackberry.connection","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T14:51:11.772Z","created":"2013-10-22T14:51:11.459Z","1.0.0":"2013-10-22T14:51:11.772Z"},"_attachments":{"com.blackberry.connection-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-DeZnj2gPJeJcblZd2sVegA==","length":2562,"stub":true}}}},
{"id":"com.blackberry.identity","key":"com.blackberry.identity","value":{"rev":"3-df523ea9249719671379afb7971cd349"},"doc":{"_id":"com.blackberry.identity","_rev":"3-df523ea9249719671379afb7971cd349","name":"com.blackberry.identity","description":"BlackBerry 10 Identity APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.identity","description":"BlackBerry 10 Identity APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.identity@1.0.0","dist":{"shasum":"a55e485bdf94818aecd3a6e922410ed39d2e3e1b","tarball":"http://registry.cordova.io/com.blackberry.identity/-/com.blackberry.identity-1.0.0.tgz"},"_from":"com.blackberry.identity/","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T14:57:46.433Z","created":"2013-10-22T14:57:46.122Z","1.0.0":"2013-10-22T14:57:46.433Z"},"_attachments":{"com.blackberry.identity-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-FC+Et8ktZTk4/vuyu4CAMQ==","length":1788,"stub":true}}}},
{"id":"com.blackberry.invoke","key":"com.blackberry.invoke","value":{"rev":"3-56f0bae0d45d4f6e168b26d854a2d7b9"},"doc":{"_id":"com.blackberry.invoke","_rev":"3-56f0bae0d45d4f6e168b26d854a2d7b9","name":"com.blackberry.invoke","description":"BlackBerry 10 Invoke APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.invoke","description":"BlackBerry 10 Invoke APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.invoke@1.0.0","dist":{"shasum":"52a82ccf4e16e55e160e802424820e1fe261c579","tarball":"http://registry.cordova.io/com.blackberry.invoke/-/com.blackberry.invoke-1.0.0.tgz"},"_from":"com.blackberry.invoke","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T14:59:38.061Z","created":"2013-10-22T14:59:37.761Z","1.0.0":"2013-10-22T14:59:38.061Z"},"_attachments":{"com.blackberry.invoke-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-eeIlH2+2Z4ihzM+BQ+HGQQ==","length":3399,"stub":true}}}},
{"id":"com.blackberry.invoke.card","key":"com.blackberry.invoke.card","value":{"rev":"3-33e8f59af253f2dd1ccaa476021915a9"},"doc":{"_id":"com.blackberry.invoke.card","_rev":"3-33e8f59af253f2dd1ccaa476021915a9","name":"com.blackberry.invoke.card","description":"BlackBerry 10 Invoke Card APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.invoke.card","description":"BlackBerry 10 Invoke Card APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.invoke.card@1.0.0","dist":{"shasum":"a9d70c307d9d0f44b51e834f32c363d40d0cb5ca","tarball":"http://registry.cordova.io/com.blackberry.invoke.card/-/com.blackberry.invoke.card-1.0.0.tgz"},"_from":"com.blackberry.invoke.card","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T15:01:58.119Z","created":"2013-10-22T15:01:57.795Z","1.0.0":"2013-10-22T15:01:58.119Z"},"_attachments":{"com.blackberry.invoke.card-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-caf6+RcZ31QMnGp5XXmAJQ==","length":3724,"stub":true}}}},
{"id":"com.blackberry.invoked","key":"com.blackberry.invoked","value":{"rev":"3-b4119c6e68afa0e6efa7f36d19a7b4d7"},"doc":{"_id":"com.blackberry.invoked","_rev":"3-b4119c6e68afa0e6efa7f36d19a7b4d7","name":"com.blackberry.invoked","description":"BlackBerry 10 Invoked APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.invoked","description":"BlackBerry 10 Invoked APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.invoked@1.0.0","dist":{"shasum":"49c00fc47a9e6e66a63beb8b54ca669be6460a38","tarball":"http://registry.cordova.io/com.blackberry.invoked/-/com.blackberry.invoked-1.0.0.tgz"},"_from":"com.blackberry.invoked","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T15:04:05.950Z","created":"2013-10-22T15:04:05.340Z","1.0.0":"2013-10-22T15:04:05.950Z"},"_attachments":{"com.blackberry.invoked-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-vcbyn4AKp5LuEUQqqEpqmw==","length":2435,"stub":true}}}},
{"id":"com.blackberry.io","key":"com.blackberry.io","value":{"rev":"3-56150f4157c5c86349e87605d9329f9d"},"doc":{"_id":"com.blackberry.io","_rev":"3-56150f4157c5c86349e87605d9329f9d","name":"com.blackberry.io","description":"BlackBerry 10 I/O APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.io","description":"BlackBerry 10 I/O APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.io@1.0.0","dist":{"shasum":"e8f594b0c86cdc9a8724f19d0dbabe90e19e6808","tarball":"http://registry.cordova.io/com.blackberry.io/-/com.blackberry.io-1.0.0.tgz"},"_from":"com.blackberry.io","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T15:06:14.575Z","created":"2013-10-22T15:06:14.212Z","1.0.0":"2013-10-22T15:06:14.575Z"},"_attachments":{"com.blackberry.io-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-1oJwqkOCZrziq46gwF57LA==","length":1895,"stub":true}}}},
{"id":"com.blackberry.io.filetransfer","key":"com.blackberry.io.filetransfer","value":{"rev":"3-8e97acc76383640ce48620f9e3665d4f"},"doc":{"_id":"com.blackberry.io.filetransfer","_rev":"3-8e97acc76383640ce48620f9e3665d4f","name":"com.blackberry.io.filetransfer","description":"BlackBerry 10 File Transfer APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.io.filetransfer","description":"BlackBerry 10 File Transfer APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.io.filetransfer@1.0.0","dist":{"shasum":"c613969cfc0cccc09a4c0a51873dffef5b3ab518","tarball":"http://registry.cordova.io/com.blackberry.io.filetransfer/-/com.blackberry.io.filetransfer-1.0.0.tgz"},"_from":"com.blackberry.io.filetransfer/","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T15:08:33.121Z","created":"2013-10-22T15:08:32.396Z","1.0.0":"2013-10-22T15:08:33.121Z"},"_attachments":{"com.blackberry.io.filetransfer-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-Wd0V+EK8KnW+EgAMJFlnXQ==","length":524130,"stub":true}}}},
{"id":"com.blackberry.jpps","key":"com.blackberry.jpps","value":{"rev":"3-c8895650bf64426d6aa02b286f63e873"},"doc":{"_id":"com.blackberry.jpps","_rev":"3-c8895650bf64426d6aa02b286f63e873","name":"com.blackberry.jpps","description":"BlackBerry 10 JPPS Library","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.jpps","description":"BlackBerry 10 JPPS Library","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.jpps@1.0.0","dist":{"shasum":"f195509760d204fa8357974049533d0eac4988ec","tarball":"http://registry.cordova.io/com.blackberry.jpps/-/com.blackberry.jpps-1.0.0.tgz"},"_from":"plugin/com.blackberry.jpps","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-11-05T19:48:57.575Z","created":"2013-11-05T19:48:56.661Z","1.0.0":"2013-11-05T19:48:57.574Z"},"_attachments":{"com.blackberry.jpps-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-YBgpPnoWXTJ/vpa5hSCqVg==","length":1482113,"stub":true}}}},
{"id":"com.blackberry.notification","key":"com.blackberry.notification","value":{"rev":"3-a999dff7b5c5aec0b5551e08801f4452"},"doc":{"_id":"com.blackberry.notification","_rev":"3-a999dff7b5c5aec0b5551e08801f4452","name":"com.blackberry.notification","description":"BlackBerry 10 Notification APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.notification","description":"BlackBerry 10 Notification APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.notification@1.0.0","dist":{"shasum":"44d4680940901ed0d1070a1393ff0a77450342a6","tarball":"http://registry.cordova.io/com.blackberry.notification/-/com.blackberry.notification-1.0.0.tgz"},"_from":"com.blackberry.notification/","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T15:09:22.012Z","created":"2013-10-22T15:09:21.707Z","1.0.0":"2013-10-22T15:09:22.012Z"},"_attachments":{"com.blackberry.notification-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-MNFXDflCX93Kyo5eKt1etQ==","length":2544,"stub":true}}}},
{"id":"com.blackberry.payment","key":"com.blackberry.payment","value":{"rev":"3-9a1bd472770ccf40ffa65213968bde8b"},"doc":{"_id":"com.blackberry.payment","_rev":"3-9a1bd472770ccf40ffa65213968bde8b","name":"com.blackberry.payment","description":"BlackBerry 10 Payment APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.payment","description":"BlackBerry 10 Payment APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.payment@1.0.0","dist":{"shasum":"d2eb5b4e0ea25a01b49eb71cb0d31a565175d4ef","tarball":"http://registry.cordova.io/com.blackberry.payment/-/com.blackberry.payment-1.0.0.tgz"},"_from":"plugin/com.blackberry.payment/","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-12-09T14:56:26.397Z","created":"2013-12-09T14:56:25.712Z","1.0.0":"2013-12-09T14:56:26.397Z"},"_attachments":{"com.blackberry.payment-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-lTQju1CHtMa8aY3+0kPDZA==","length":391667,"stub":true}}}},
{"id":"com.blackberry.pim.calendar","key":"com.blackberry.pim.calendar","value":{"rev":"3-06057d8e2c90e2cc48ee936fd100d664"},"doc":{"_id":"com.blackberry.pim.calendar","_rev":"3-06057d8e2c90e2cc48ee936fd100d664","name":"com.blackberry.pim.calendar","description":"BlackBerry 10 Calendar APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.pim.calendar","description":"BlackBerry 10 Calendar APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.pim.calendar@1.0.0","dist":{"shasum":"490f25d78fc4200c6c4d5f6a7244745ccacf3f1f","tarball":"http://registry.cordova.io/com.blackberry.pim.calendar/-/com.blackberry.pim.calendar-1.0.0.tgz"},"_from":"com.blackberry.pim.calendar","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T15:23:10.136Z","created":"2013-10-22T15:23:09.403Z","1.0.0":"2013-10-22T15:23:10.136Z"},"_attachments":{"com.blackberry.pim.calendar-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-2sj7TFR9hpU1YXheIWDswQ==","length":622204,"stub":true}}}},
{"id":"com.blackberry.pim.contacts","key":"com.blackberry.pim.contacts","value":{"rev":"3-1d45844324af86ef7a3700b388f27046"},"doc":{"_id":"com.blackberry.pim.contacts","_rev":"3-1d45844324af86ef7a3700b388f27046","name":"com.blackberry.pim.contacts","description":"BlackBerry 10 Contacts APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.pim.contacts","description":"BlackBerry 10 Contacts APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.pim.contacts@1.0.0","dist":{"shasum":"be1097114e09f149fafd21f9dc9e4d87c05da4c8","tarball":"http://registry.cordova.io/com.blackberry.pim.contacts/-/com.blackberry.pim.contacts-1.0.0.tgz"},"_from":"com.blackberry.pim.contacts/","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T15:26:10.933Z","created":"2013-10-22T15:26:09.700Z","1.0.0":"2013-10-22T15:26:10.933Z"},"_attachments":{"com.blackberry.pim.contacts-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-wnWkZ6Q0Bbn+Mwkh9w0DrQ==","length":855220,"stub":true}}}},
{"id":"com.blackberry.pim.lib","key":"com.blackberry.pim.lib","value":{"rev":"3-b7542b0d3eb61a5b0d65b659133d042d"},"doc":{"_id":"com.blackberry.pim.lib","_rev":"3-b7542b0d3eb61a5b0d65b659133d042d","name":"com.blackberry.pim.lib","description":"BlackBerry 10 PIM Library","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.pim.lib","description":"BlackBerry 10 PIM Library","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.pim.lib@1.0.0","dist":{"shasum":"9aa1e5e1a7666a18eb1fcc1d1eed7648adddf10f","tarball":"http://registry.cordova.io/com.blackberry.pim.lib/-/com.blackberry.pim.lib-1.0.0.tgz"},"_from":"com.blackberry.pim.lib","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T14:15:30.714Z","created":"2013-10-22T14:15:28.899Z","1.0.0":"2013-10-22T14:15:30.714Z"},"_attachments":{"com.blackberry.pim.lib-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-GIeyNwt++KyTi8yN+LCelA==","length":189540,"stub":true}}}},
{"id":"com.blackberry.push","key":"com.blackberry.push","value":{"rev":"5-7ac81a57668b482ca4f5c6d66f70580e"},"doc":{"_id":"com.blackberry.push","_rev":"5-7ac81a57668b482ca4f5c6d66f70580e","name":"com.blackberry.push","description":"BlackBerry 10 Push APIs","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.push","description":"BlackBerry 10 Push APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.push@1.0.0","dist":{"shasum":"d6dee25e07ffdda012ea0441b67536eb5ef85ee4","tarball":"http://registry.cordova.io/com.blackberry.push/-/com.blackberry.push-1.0.0.tgz"},"_from":"com.blackberry.push","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]},"1.0.1":{"version":"1.0.1","name":"com.blackberry.push","description":"BlackBerry 10 Push APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.push@1.0.1","dist":{"shasum":"645c753bf5c0866d7af92910aa134dec6e6bc10f","tarball":"http://registry.cordova.io/com.blackberry.push/-/com.blackberry.push-1.0.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-12-12T14:54:59.804Z","created":"2013-10-22T15:38:46.275Z","1.0.0":"2013-10-22T15:38:47.179Z","1.0.1":"2013-12-12T14:54:59.804Z"},"_attachments":{"com.blackberry.push-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-4ipdihNUPGf5R5LkBijtPQ==","length":410887,"stub":true},"com.blackberry.push-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-cD1xrcBXW/mlGuVEvoF+/Q==","length":374186,"stub":true}}}},
{"id":"com.blackberry.sensors","key":"com.blackberry.sensors","value":{"rev":"3-9be60262b18330ad13f8bc02a02369bb"},"doc":{"_id":"com.blackberry.sensors","_rev":"3-9be60262b18330ad13f8bc02a02369bb","name":"com.blackberry.sensors","description":"BlackBerry 10 Sensors APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.sensors","description":"BlackBerry 10 Sensors APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.sensors@1.0.0","dist":{"shasum":"f0951a04eda53cb8791e88785107147ffdf5df72","tarball":"http://registry.cordova.io/com.blackberry.sensors/-/com.blackberry.sensors-1.0.0.tgz"},"_from":"com.blackberry.sensors","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T15:41:32.384Z","created":"2013-10-22T15:41:31.729Z","1.0.0":"2013-10-22T15:41:32.384Z"},"_attachments":{"com.blackberry.sensors-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-dnJ20vIdXCwGgFaIU18LVA==","length":286907,"stub":true}}}},
{"id":"com.blackberry.system","key":"com.blackberry.system","value":{"rev":"3-ae180774983f0fbc5894ae365a601c09"},"doc":{"_id":"com.blackberry.system","_rev":"3-ae180774983f0fbc5894ae365a601c09","name":"com.blackberry.system","description":"BlackBerry 10 System APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.system","description":"BlackBerry 10 System APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.system@1.0.0","dist":{"shasum":"cc7ac302d1447df4bc48000b062cc0adad6aad9c","tarball":"http://registry.cordova.io/com.blackberry.system/-/com.blackberry.system-1.0.0.tgz"},"_from":"com.blackberry.system","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T15:43:30.842Z","created":"2013-10-22T15:43:30.539Z","1.0.0":"2013-10-22T15:43:30.842Z"},"_attachments":{"com.blackberry.system-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-1b05JkIw42CfaRsCL3xvzw==","length":3358,"stub":true}}}},
{"id":"com.blackberry.ui.contextmenu","key":"com.blackberry.ui.contextmenu","value":{"rev":"3-7fc4726e469187b71e26d979b41d3678"},"doc":{"_id":"com.blackberry.ui.contextmenu","_rev":"3-7fc4726e469187b71e26d979b41d3678","name":"com.blackberry.ui.contextmenu","description":"BlackBerry 10 Context Menu APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.ui.contextmenu","description":"BlackBerry 10 Context Menu APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.ui.contextmenu@1.0.0","dist":{"shasum":"4fe613ddf67efee9a850365a1529d464d5feda79","tarball":"http://registry.cordova.io/com.blackberry.ui.contextmenu/-/com.blackberry.ui.contextmenu-1.0.0.tgz"},"_from":"com.blackberry.ui.contextmenu/","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T15:45:45.922Z","created":"2013-10-22T15:45:45.639Z","1.0.0":"2013-10-22T15:45:45.922Z"},"_attachments":{"com.blackberry.ui.contextmenu-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-6oOcQm7cl86Yu9esxLOZSQ==","length":2495,"stub":true}}}},
{"id":"com.blackberry.ui.cover","key":"com.blackberry.ui.cover","value":{"rev":"3-ffea3500ab9a22ed1383cc45e7924482"},"doc":{"_id":"com.blackberry.ui.cover","_rev":"3-ffea3500ab9a22ed1383cc45e7924482","name":"com.blackberry.ui.cover","description":"BlackBerry 10 Cover APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.ui.cover","description":"BlackBerry 10 Cover APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.ui.cover@1.0.0","dist":{"shasum":"f6324dfb82d05f6f4bbc2244a735f12e8d4ba8a3","tarball":"http://registry.cordova.io/com.blackberry.ui.cover/-/com.blackberry.ui.cover-1.0.0.tgz"},"_from":"com.blackberry.ui.cover/","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T15:50:12.564Z","created":"2013-10-22T15:50:12.268Z","1.0.0":"2013-10-22T15:50:12.564Z"},"_attachments":{"com.blackberry.ui.cover-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-M+puePNpLT9Guz+hz9BWYQ==","length":2710,"stub":true}}}},
{"id":"com.blackberry.ui.dialog","key":"com.blackberry.ui.dialog","value":{"rev":"3-6e602eda96642ddc0dbf7a43ace12ab9"},"doc":{"_id":"com.blackberry.ui.dialog","_rev":"3-6e602eda96642ddc0dbf7a43ace12ab9","name":"com.blackberry.ui.dialog","description":"BlackBerry 10 Dialog APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.ui.dialog","description":"BlackBerry 10 Dialog APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.ui.dialog@1.0.0","dist":{"shasum":"28e1f7889ece9c6d2e8920c05bb93d1c0866e48a","tarball":"http://registry.cordova.io/com.blackberry.ui.dialog/-/com.blackberry.ui.dialog-1.0.0.tgz"},"_from":"com.blackberry.ui.dialog/","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T15:57:51.536Z","created":"2013-10-22T15:57:51.251Z","1.0.0":"2013-10-22T15:57:51.536Z"},"_attachments":{"com.blackberry.ui.dialog-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-QCsJToidnpkf9hvAC6y8xg==","length":2316,"stub":true}}}},
{"id":"com.blackberry.ui.toast","key":"com.blackberry.ui.toast","value":{"rev":"3-d9007a5c54e165459d343e3dd3edb626"},"doc":{"_id":"com.blackberry.ui.toast","_rev":"3-d9007a5c54e165459d343e3dd3edb626","name":"com.blackberry.ui.toast","description":"BlackBerry 10 Toast APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.ui.toast","description":"BlackBerry 10 Toast APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.ui.toast@1.0.0","dist":{"shasum":"1cff0a8f20457e277bf0bd6aa55e28dd62e040fc","tarball":"http://registry.cordova.io/com.blackberry.ui.toast/-/com.blackberry.ui.toast-1.0.0.tgz"},"_from":"com.blackberry.ui.toast","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T16:04:25.338Z","created":"2013-10-22T16:04:25.056Z","1.0.0":"2013-10-22T16:04:25.338Z"},"_attachments":{"com.blackberry.ui.toast-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-LnNdHo5kGODSvvhctYmfrw==","length":1730,"stub":true}}}},
{"id":"com.blackberry.user.identity","key":"com.blackberry.user.identity","value":{"rev":"3-c811305d332b4ed58edae9d634835e65"},"doc":{"_id":"com.blackberry.user.identity","_rev":"3-c811305d332b4ed58edae9d634835e65","name":"com.blackberry.user.identity","description":"BlackBerry 10 User Identity APIs","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.user.identity","description":"BlackBerry 10 User Identity APIs","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.user.identity@1.0.0","dist":{"shasum":"1c06726013a16c537ef2c64b6dbf8f953f2d8ebc","tarball":"http://registry.cordova.io/com.blackberry.user.identity/-/com.blackberry.user.identity-1.0.0.tgz"},"_from":"com.blackberry.user.identity/","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T16:10:44.703Z","created":"2013-10-22T16:10:44.147Z","1.0.0":"2013-10-22T16:10:44.703Z"},"_attachments":{"com.blackberry.user.identity-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-d9B1VKZzevGrRUf4wLxASA==","length":109792,"stub":true}}}},
{"id":"com.blackberry.utils","key":"com.blackberry.utils","value":{"rev":"3-b5b33537f16d0e1c0ca4d6b41b51e08a"},"doc":{"_id":"com.blackberry.utils","_rev":"3-b5b33537f16d0e1c0ca4d6b41b51e08a","name":"com.blackberry.utils","description":"BlackBerry 10 Utilities Library","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.blackberry.utils","description":"BlackBerry 10 Utilities Library","license":"Apache 2.0","engines":[],"readme":"ERROR: No README data found!","_id":"com.blackberry.utils@1.0.0","dist":{"shasum":"0d53cf8edfec66800489bb437aeb2d5ca3ba8e79","tarball":"http://registry.cordova.io/com.blackberry.utils/-/com.blackberry.utils-1.0.0.tgz"},"_from":"com.blackberry.utils/","_npmVersion":"1.3.4","_npmUser":{"name":"blackberry","email":"bhiggins@blackberry.com"},"maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"blackberry","email":"bhiggins@blackberry.com"}],"time":{"modified":"2013-10-22T13:57:43.234Z","created":"2013-10-22T13:57:42.192Z","1.0.0":"2013-10-22T13:57:43.234Z"},"_attachments":{"com.blackberry.utils-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-D9aWt8R9EOoKSpNUTLZzgA==","length":771941,"stub":true}}}},
{"id":"com.byhook.cordova.chromelauncher","key":"com.byhook.cordova.chromelauncher","value":{"rev":"8-d6b0b60b15f4eed2bdf2f7f32b2bb01b"},"doc":{"_id":"com.byhook.cordova.chromelauncher","_rev":"8-d6b0b60b15f4eed2bdf2f7f32b2bb01b","name":"com.byhook.cordova.chromelauncher","description":"Launches the Chrome web browser in iOS and Android.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"version":"0.0.1","name":"com.byhook.cordova.chromelauncher","cordova_name":"ChromeLauncher","description":"Launches the Chrome web browser in iOS and Android.","license":"Apache 2.0","keywords":["google","chrome","launcher","browser"],"engines":[],"readme":"cordova-wifilauncher\r\n====================\r\n\r\nCordova Wifi Settings Menu Launcher\r\n","readmeFilename":"README.md","_id":"com.byhook.cordova.chromelauncher@0.0.1","dist":{"shasum":"31e680eb8d4a6b5dda93f5944da3608b1fc51b59","tarball":"http://cordova.iriscouch.com/registry/_design/scratch/_rewrite/com.byhook.cordova.chromelauncher/-/com.byhook.cordova.chromelauncher-0.0.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"normmcgarry","email":"norm.mcgarry@gmail.com"},"maintainers":[{"name":"normmcgarry","email":"norm.mcgarry@gmail.com"}],"directories":{}},"0.0.2":{"version":"0.0.2","name":"com.byhook.cordova.chromelauncher","cordova_name":"ChromeLauncher","description":"Launches the Chrome web browser in iOS and Android.","license":"Apache 2.0","keywords":["google","chrome","launcher","browser"],"engines":[],"readme":"cordova-wifilauncher\r\n====================\r\n\r\nCordova Wifi Settings Menu Launcher\r\n","readmeFilename":"README.md","_id":"com.byhook.cordova.chromelauncher@0.0.2","dist":{"shasum":"1b109d80e870accde02a87ff6a50475e254c5a54","tarball":"http://registry.cordova.io/com.byhook.cordova.chromelauncher/-/com.byhook.cordova.chromelauncher-0.0.2.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"normmcgarry","email":"norm.mcgarry@gmail.com"},"maintainers":[{"name":"normmcgarry","email":"norm.mcgarry@gmail.com"}]}},"readme":"cordova-wifilauncher\r\n====================\r\n\r\nCordova Wifi Settings Menu Launcher\r\n","maintainers":[{"name":"normmcgarry","email":"norm.mcgarry@gmail.com"}],"time":{"modified":"2013-11-12T22:59:33.545Z","created":"2013-11-12T22:37:53.426Z","0.0.1":"2013-11-12T22:37:54.007Z","0.0.2":"2013-11-12T22:59:33.545Z"},"_attachments":{"com.byhook.cordova.chromelauncher-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-kuPuCSv/cGwTVQNw65LdJw==","length":7037,"stub":true},"com.byhook.cordova.chromelauncher-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-RB8aD/qjWGztLuY2k7zGLg==","length":7017,"stub":true}}}},
{"id":"com.byhook.cordova.wifilauncher","key":"com.byhook.cordova.wifilauncher","value":{"rev":"13-b24979e600dabfbaece15fb79c8e9ba8"},"doc":{"_id":"com.byhook.cordova.wifilauncher","_rev":"13-b24979e600dabfbaece15fb79c8e9ba8","name":"com.byhook.cordova.wifilauncher","description":"Wifi Launcher Plugin","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"version":"0.0.1","name":"com.byhook.cordova.wifilauncher","cordova_name":"WifiLauncher","description":"Wifi Launcher Plugin","license":"Apache 2.0","keywords":["wifi","launcher","settings","menu"],"engines":[],"readme":"cordova-wifilauncher\r\n====================\r\n\r\nCordova Wifi Settings Menu Launcher\r\n","readmeFilename":"README.md","_id":"com.byhook.cordova.wifilauncher@0.0.1","dist":{"shasum":"8de76e9bbd293efbde8abb1b782c0d1363ea553d","tarball":"http://cordova.iriscouch.com/registry/_design/scratch/_rewrite/com.byhook.cordova.wifilauncher/-/com.byhook.cordova.wifilauncher-0.0.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"normmcgarry","email":"norm.mcgarry@gmail.com"},"maintainers":[{"name":"normmcgarry","email":"norm.mcgarry@gmail.com"}],"directories":{}},"0.0.2":{"version":"0.0.2","name":"com.byhook.cordova.wifilauncher","cordova_name":"WifiLauncher","description":"Wifi Launcher Plugin","license":"Apache 2.0","keywords":["wifi","launcher","settings","menu"],"engines":[],"readme":"cordova-wifilauncher\r\n====================\r\n\r\nCordova Wifi Settings Menu Launcher\r\n","readmeFilename":"README.md","_id":"com.byhook.cordova.wifilauncher@0.0.2","dist":{"shasum":"d1f7660dbfa37d2d16f7dc4e13e12bdcabb58aaf","tarball":"http://cordova.iriscouch.com/registry/_design/scratch/_rewrite/com.byhook.cordova.wifilauncher/-/com.byhook.cordova.wifilauncher-0.0.2.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"normmcgarry","email":"norm.mcgarry@gmail.com"},"maintainers":[{"name":"normmcgarry","email":"norm.mcgarry@gmail.com"}],"directories":{}},"0.0.3":{"version":"0.0.3","name":"com.byhook.cordova.wifilauncher","cordova_name":"WifiLauncher","description":"Wifi Launcher Plugin","license":"Apache 2.0","keywords":["wifi","launcher","settings","menu"],"engines":[],"readme":"cordova-wifilauncher\r\n====================\r\n\r\nCordova Wifi Settings Menu Launcher\r\n","readmeFilename":"README.md","_id":"com.byhook.cordova.wifilauncher@0.0.3","dist":{"shasum":"dac85b2177a3253b8a857e4b23cecf04d3dc2071","tarball":"http://registry.cordova.io/com.byhook.cordova.wifilauncher/-/com.byhook.cordova.wifilauncher-0.0.3.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"normmcgarry","email":"norm.mcgarry@gmail.com"},"maintainers":[{"name":"normmcgarry","email":"norm.mcgarry@gmail.com"}]}},"readme":"cordova-wifilauncher\r\n====================\r\n\r\nCordova Wifi Settings Menu Launcher\r\n","maintainers":[{"name":"normmcgarry","email":"norm.mcgarry@gmail.com"}],"time":{"modified":"2013-11-12T22:37:40.988Z","created":"2013-11-12T15:34:06.890Z","0.0.1":"2013-11-12T15:34:07.375Z","0.0.2":"2013-11-12T15:39:56.055Z","0.0.3":"2013-11-12T22:37:40.988Z"},"_attachments":{"com.byhook.cordova.wifilauncher-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-U90L41XJLpPX04yGINhXkw==","length":6021,"stub":true},"com.byhook.cordova.wifilauncher-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-XRvNNBmHRFzXf/0AgSMlYQ==","length":6044,"stub":true},"com.byhook.cordova.wifilauncher-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-ZvM2W8Q2TEmvtlEl0fjlow==","length":6036,"stub":true}}}},
{"id":"com.ccsoft.plugin.cordovafacebook","key":"com.ccsoft.plugin.cordovafacebook","value":{"rev":"3-14559274979704c41ec3ecb92055c5c9"},"doc":{"_id":"com.ccsoft.plugin.cordovafacebook","_rev":"3-14559274979704c41ec3ecb92055c5c9","name":"com.ccsoft.plugin.cordovafacebook","description":"Cordova plugin that handles Facebook integration in mobile apps.","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.ccsoft.plugin.cordovafacebook","cordova_name":"CordovaFacebook","description":"Cordova plugin that handles Facebook integration in mobile apps.","license":"Apache 2.0 License","keywords":["facebook","cordova","ccsoft"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"cordova-facebook\r\n================\r\n\r\n[Cordova](http://cordova.apache.org/) plugin that handles Facebook integration for mobile (iOS and Android) apps.\r\n\r\nProject uses mobile native platform FacebookSDK for iOS and Android to utilize basic operations for a mobile app that uses Cordova. \r\n\r\nWe also provide [TypeScript](http://www.typescriptlang.org/) source file together with the JavaScript for the client side with this plugin.\r\n\r\n##Why?\r\n- Why do we implement another plugin since there is already an official [phonegap-facebook-plugin](https://github.com/phonegap/phonegap-facebook-plugin)?\r\n\t1. As of today (16.01.2014), [official cordova facebook plugin](https://github.com/phonegap/phonegap-facebook-plugin) project on GitHub has 985 stars (including mine), 118 watchers, 218 open issues, 29 pull requests and 5 branches.\r\n\t2. Last commit as of today to master branch was 3 months ago, we don't have time to wait for fixes and new updates.\r\n\t3. Official plugin tries to retain the same interface for the Facebook JavaScript SDK, which we believe an unnecessary burden. \r\n\t4. We have some live apps that uses the official plugin, and we are scared to update our app to new Cordova version, scared to break things in Facebook side. \r\n\t5. Well, it was not that hard to do it, so we did it.\r\n\r\n##Versions\r\nWe support only Cordova version > 3.0\r\n\r\nWe currently tested FacebookSDK for following platforms and versions:\r\n\r\n- [FacebookSDK iOS 3.11](https://developers.facebook.com/docs/ios/)\r\n\r\n- [FacebookSDK Android 3.6](https://developers.facebook.com/docs/android/)\r\n\r\n##Prerequisites\r\n\r\n###iOS\r\nDownload the latest [FacebookSDK](https://developers.facebook.com/docs/ios/), and follow the [getting started guideline](https://developers.facebook.com/docs/ios/getting-started/). \r\n\r\nThe guideline is well documented and people at Facebook may change stuff in the future, so we stick to that instead of fancy cordova plugin hacks (well, cordova people also modify plugin flow too).\r\n\r\n###Android\r\n\r\nUnlike iOS, Android [getting started guideline](https://developers.facebook.com/docs/android/getting-started/) is pretty long and scary. \r\nFor Android we rely on [Android Simple Facebook](https://github.com/sromku/android-simple-facebook) by [Roman Kushnarenko](https://github.com/sromku), many thanks for that project. \r\nWe are using our own [fork](https://github.com/koraybalci/android-simple-facebook) (but it's in sync for now) for this plugin. We distribute the compiled version of the library with the plugin, so you don't have to worry about anything. \r\n\r\nHere is what to do for Android before installing our plugin.\r\n\r\n1. Clone [Facebook SDK 3.6](https://github.com/facebook/facebook-android-sdk) or [download](https://developers.facebook.com/android/) it. Then, import the project to your workspace.\r\n\r\n2. Add reference from your project to `FacebookSDK` project.\r\n\r\n ![Screenshot](https://raw.github.com/sromku/android-simple-facebook/master/Refs/reference_to_sdk.png)\r\n\r\n##Installing the plugin\r\nTo add this plugin just type:\r\n```cordova plugin add https://github.com/ccsoft/cordova-facebook.git```\r\n\r\nTo remove this plugin type:\r\n```cordova plugin remove com.ccsoft.plugin.CordovaFacebook```\r\n\r\n##Usage\r\n\t\t\r\n\t// Get a reference to the plugin first\r\n var plugin = new CC.CordovaFacebook();\r\n\r\nThe plugin has the following methods:\r\n\r\n* [init](#init)\r\n* [login](#login)\r\n* [logout](#logout)\r\n* [info](#info)\r\n* [share](#share)\r\n* [feed](#feed)\r\n\r\n*** \r\n\r\n###init\r\nInitializes the plugin. Must be called before calling any other function.\r\n\r\n>####parameters\r\n\r\n>> *appId*: string: Your FB app id.\r\n\r\n>> *appName*: string: Your FB app name.\r\n\r\n>> *appPermissions*: array: Your FB app permissions as an array of strings. \r\n\r\n>> *successCallback*: function: Called with an fb access_token if already logged in to FB.\r\n\r\n>> *failureCallback*: function: Called with failure reason string.\r\n \r\n>####example\r\n\r\n\tplugin.init('YOUR_FB_APP_ID', 'YOUR_FB_APP_NAME', \r\n\t\t['basic_info', 'email', 'publish_actions'], \r\n\t\tsuccessCallback, failureCallback);\r\n\r\n***\r\n\r\n###login\r\n\r\n>####parameters\r\n\t\r\n>>*successCallback*: function: Called with an fb access_token if login successful.\r\n \r\n>>*failureCallback*: function: Called with failure reason string.\r\n \r\n>####example\r\n\r\n\tplugin.login(function(token) {\r\n\t\tconsole.log(\"Access token is: \" + token);\r\n\t}), failureCallback);\r\n\r\n***\r\n\r\n###logout\r\n\r\n>####parameters\r\n\t\r\n>>*successCallback*: function: Called with no params.\r\n\r\n>####example\r\n\r\n\tplugin.logout(successCallback);\r\n\r\n***\r\n\r\n###info\r\nRetrieves user info.\r\nSee [FBGraphUser](https://developers.facebook.com/docs/reference/ios/current/protocol/FBGraphUser/) documentation for successCallback parameter in iOS. \r\nSee the example below for Android. (They must be equiavelent, let us know if there are differences.)\r\n\r\n>####parameters\r\n\t\r\n>>*successCallback*: function: Called with user info data\r\n\r\n>>*failureCallback*: function: Called with failure reason string.\r\n\r\n>####example\r\n \r\n\tplugin.info(function(data) {\r\n\t\tconsole.log(\"User Id: \"\t\t+ data.id);\r\n\t\tconsole.log(\"Name: \"\t\t\t+ data.name);\r\n\t\tconsole.log(\"Email: \"\t\t+ data.email); // if asked for it in permissions\r\n\t\tconsole.log(\"First Name: \"\t+ data.first_name);\r\n\t\tconsole.log(\"Last Name: \"\t+ data.last_name);\r\n\t\tconsole.log(\"Link: \"\t\t\t+ data.link);\r\n\t\tconsole.log(\"Locale: \"\t\t+ data.locale);\r\n\t}, \r\n\tfunction(err) {console.log(err););\r\n\r\n***\r\n\r\n###share\r\n* iOS: share call tries to open share dialog via official Facebook app. If Facebook app is not installed on device, we fallback to [feed](#feed) call.\r\n* Android: share behaves exactly the same as [feed](#feed).\r\n\r\n>####parameters\r\n\t\t\r\n>>*name*: string\r\n\r\n>>*url*: string\r\n\r\n>>*logoUrl*: string\r\n\r\n>>*caption*: string\r\n\r\n>>*description*: string\r\n\r\n>>*successCallback*: function: post_id (on iOS, if Facebook app is installed and used for share, pass no parameters to callback on success)\r\n\r\n>>*failureCallback*: function: Called with failure reason string.\r\n\r\n>####example\r\n\r\n\tplugin.share('Name', 'http://www.example.com', 'http://www.example.com/test.png', \r\n\t\t'Test caption', 'Test description.', successCallback, failureCallback);\r\n\r\n***\r\n\r\n###feed\r\nfeed call requires an active session. Shows facebook web dialog as a popup on iOS and uses open graph on Android. On Android, we will support dialog whem *Simple Facebook* library supports it.\r\n\r\n>####parameters\r\n\t\t\r\n>>*name*: string\r\n\r\n>>*url*: string\r\n\r\n>>*logoUrl*: string\r\n\r\n>>*caption*: string\r\n\r\n>>*description*: string\r\n\r\n>>*successCallback*: function: post_id (on iOS, if Facebook app is installed and used for share, pass no parameters to callback on success)\r\n\r\n>>*failureCallback*: function: Called with failure reason string.\r\n\r\n>####example\r\n\r\n\tplugin.feed('Name', 'http://www.example.com', 'http://www.example.com/test.png', \r\n\t\t'Test caption', 'Test description.', successCallback, failureCallback);\r\n\r\n***\r\n\r\n##Sample App\r\nWe have a sample cordova app to test the plugin that you can find [here](https://github.com/ccsoft/cordova-sample/tree/facebook). Please note that the link takes you to a dedicated branch named facebook, please use that branch to test this plugin. We use separate branches for each plugin we implement.\r\n\r\nOnce you download/clone and run the app, you are going to be using a sample Facebook app in sandbox. \r\nYou can change your app settings (in index.html), you can also test the features with the following Facebook tester user credentials:\r\n> User: joe_kxpligh_tester@tfbnw.net\r\n\r\n> Pass: 123456\r\n\r\n\r\n\r\n##License\r\n[Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0.html)\r\n\r\n","readmeFilename":"README.md","_id":"com.ccsoft.plugin.cordovafacebook@1.0.0","dist":{"shasum":"047a05edcaf26ac6c03f71e4ff269503dacf9795","tarball":"http://registry.cordova.io/com.ccsoft.plugin.cordovafacebook/-/com.ccsoft.plugin.cordovafacebook-1.0.0.tgz"},"_from":".\\cordova-facebook","_npmVersion":"1.3.4","_npmUser":{"name":"koraybalci","email":"koray.balci@ccsoft.com.tr"},"maintainers":[{"name":"koraybalci","email":"koray.balci@ccsoft.com.tr"}]}},"readme":"cordova-facebook\r\n================\r\n\r\n[Cordova](http://cordova.apache.org/) plugin that handles Facebook integration for mobile (iOS and Android) apps.\r\n\r\nProject uses mobile native platform FacebookSDK for iOS and Android to utilize basic operations for a mobile app that uses Cordova. \r\n\r\nWe also provide [TypeScript](http://www.typescriptlang.org/) source file together with the JavaScript for the client side with this plugin.\r\n\r\n##Why?\r\n- Why do we implement another plugin since there is already an official [phonegap-facebook-plugin](https://github.com/phonegap/phonegap-facebook-plugin)?\r\n\t1. As of today (16.01.2014), [official cordova facebook plugin](https://github.com/phonegap/phonegap-facebook-plugin) project on GitHub has 985 stars (including mine), 118 watchers, 218 open issues, 29 pull requests and 5 branches.\r\n\t2. Last commit as of today to master branch was 3 months ago, we don't have time to wait for fixes and new updates.\r\n\t3. Official plugin tries to retain the same interface for the Facebook JavaScript SDK, which we believe an unnecessary burden. \r\n\t4. We have some live apps that uses the official plugin, and we are scared to update our app to new Cordova version, scared to break things in Facebook side. \r\n\t5. Well, it was not that hard to do it, so we did it.\r\n\r\n##Versions\r\nWe support only Cordova version > 3.0\r\n\r\nWe currently tested FacebookSDK for following platforms and versions:\r\n\r\n- [FacebookSDK iOS 3.11](https://developers.facebook.com/docs/ios/)\r\n\r\n- [FacebookSDK Android 3.6](https://developers.facebook.com/docs/android/)\r\n\r\n##Prerequisites\r\n\r\n###iOS\r\nDownload the latest [FacebookSDK](https://developers.facebook.com/docs/ios/), and follow the [getting started guideline](https://developers.facebook.com/docs/ios/getting-started/). \r\n\r\nThe guideline is well documented and people at Facebook may change stuff in the future, so we stick to that instead of fancy cordova plugin hacks (well, cordova people also modify plugin flow too).\r\n\r\n###Android\r\n\r\nUnlike iOS, Android [getting started guideline](https://developers.facebook.com/docs/android/getting-started/) is pretty long and scary. \r\nFor Android we rely on [Android Simple Facebook](https://github.com/sromku/android-simple-facebook) by [Roman Kushnarenko](https://github.com/sromku), many thanks for that project. \r\nWe are using our own [fork](https://github.com/koraybalci/android-simple-facebook) (but it's in sync for now) for this plugin. We distribute the compiled version of the library with the plugin, so you don't have to worry about anything. \r\n\r\nHere is what to do for Android before installing our plugin.\r\n\r\n1. Clone [Facebook SDK 3.6](https://github.com/facebook/facebook-android-sdk) or [download](https://developers.facebook.com/android/) it. Then, import the project to your workspace.\r\n\r\n2. Add reference from your project to `FacebookSDK` project.\r\n\r\n ![Screenshot](https://raw.github.com/sromku/android-simple-facebook/master/Refs/reference_to_sdk.png)\r\n\r\n##Installing the plugin\r\nTo add this plugin just type:\r\n```cordova plugin add https://github.com/ccsoft/cordova-facebook.git```\r\n\r\nTo remove this plugin type:\r\n```cordova plugin remove com.ccsoft.plugin.CordovaFacebook```\r\n\r\n##Usage\r\n\t\t\r\n\t// Get a reference to the plugin first\r\n var plugin = new CC.CordovaFacebook();\r\n\r\nThe plugin has the following methods:\r\n\r\n* [init](#init)\r\n* [login](#login)\r\n* [logout](#logout)\r\n* [info](#info)\r\n* [share](#share)\r\n* [feed](#feed)\r\n\r\n*** \r\n\r\n###init\r\nInitializes the plugin. Must be called before calling any other function.\r\n\r\n>####parameters\r\n\r\n>> *appId*: string: Your FB app id.\r\n\r\n>> *appName*: string: Your FB app name.\r\n\r\n>> *appPermissions*: array: Your FB app permissions as an array of strings. \r\n\r\n>> *successCallback*: function: Called with an fb access_token if already logged in to FB.\r\n\r\n>> *failureCallback*: function: Called with failure reason string.\r\n \r\n>####example\r\n\r\n\tplugin.init('YOUR_FB_APP_ID', 'YOUR_FB_APP_NAME', \r\n\t\t['basic_info', 'email', 'publish_actions'], \r\n\t\tsuccessCallback, failureCallback);\r\n\r\n***\r\n\r\n###login\r\n\r\n>####parameters\r\n\t\r\n>>*successCallback*: function: Called with an fb access_token if login successful.\r\n \r\n>>*failureCallback*: function: Called with failure reason string.\r\n \r\n>####example\r\n\r\n\tplugin.login(function(token) {\r\n\t\tconsole.log(\"Access token is: \" + token);\r\n\t}), failureCallback);\r\n\r\n***\r\n\r\n###logout\r\n\r\n>####parameters\r\n\t\r\n>>*successCallback*: function: Called with no params.\r\n\r\n>####example\r\n\r\n\tplugin.logout(successCallback);\r\n\r\n***\r\n\r\n###info\r\nRetrieves user info.\r\nSee [FBGraphUser](https://developers.facebook.com/docs/reference/ios/current/protocol/FBGraphUser/) documentation for successCallback parameter in iOS. \r\nSee the example below for Android. (They must be equiavelent, let us know if there are differences.)\r\n\r\n>####parameters\r\n\t\r\n>>*successCallback*: function: Called with user info data\r\n\r\n>>*failureCallback*: function: Called with failure reason string.\r\n\r\n>####example\r\n \r\n\tplugin.info(function(data) {\r\n\t\tconsole.log(\"User Id: \"\t\t+ data.id);\r\n\t\tconsole.log(\"Name: \"\t\t\t+ data.name);\r\n\t\tconsole.log(\"Email: \"\t\t+ data.email); // if asked for it in permissions\r\n\t\tconsole.log(\"First Name: \"\t+ data.first_name);\r\n\t\tconsole.log(\"Last Name: \"\t+ data.last_name);\r\n\t\tconsole.log(\"Link: \"\t\t\t+ data.link);\r\n\t\tconsole.log(\"Locale: \"\t\t+ data.locale);\r\n\t}, \r\n\tfunction(err) {console.log(err););\r\n\r\n***\r\n\r\n###share\r\n* iOS: share call tries to open share dialog via official Facebook app. If Facebook app is not installed on device, we fallback to [feed](#feed) call.\r\n* Android: share behaves exactly the same as [feed](#feed).\r\n\r\n>####parameters\r\n\t\t\r\n>>*name*: string\r\n\r\n>>*url*: string\r\n\r\n>>*logoUrl*: string\r\n\r\n>>*caption*: string\r\n\r\n>>*description*: string\r\n\r\n>>*successCallback*: function: post_id (on iOS, if Facebook app is installed and used for share, pass no parameters to callback on success)\r\n\r\n>>*failureCallback*: function: Called with failure reason string.\r\n\r\n>####example\r\n\r\n\tplugin.share('Name', 'http://www.example.com', 'http://www.example.com/test.png', \r\n\t\t'Test caption', 'Test description.', successCallback, failureCallback);\r\n\r\n***\r\n\r\n###feed\r\nfeed call requires an active session. Shows facebook web dialog as a popup on iOS and uses open graph on Android. On Android, we will support dialog whem *Simple Facebook* library supports it.\r\n\r\n>####parameters\r\n\t\t\r\n>>*name*: string\r\n\r\n>>*url*: string\r\n\r\n>>*logoUrl*: string\r\n\r\n>>*caption*: string\r\n\r\n>>*description*: string\r\n\r\n>>*successCallback*: function: post_id (on iOS, if Facebook app is installed and used for share, pass no parameters to callback on success)\r\n\r\n>>*failureCallback*: function: Called with failure reason string.\r\n\r\n>####example\r\n\r\n\tplugin.feed('Name', 'http://www.example.com', 'http://www.example.com/test.png', \r\n\t\t'Test caption', 'Test description.', successCallback, failureCallback);\r\n\r\n***\r\n\r\n##Sample App\r\nWe have a sample cordova app to test the plugin that you can find [here](https://github.com/ccsoft/cordova-sample/tree/facebook). Please note that the link takes you to a dedicated branch named facebook, please use that branch to test this plugin. We use separate branches for each plugin we implement.\r\n\r\nOnce you download/clone and run the app, you are going to be using a sample Facebook app in sandbox. \r\nYou can change your app settings (in index.html), you can also test the features with the following Facebook tester user credentials:\r\n> User: joe_kxpligh_tester@tfbnw.net\r\n\r\n> Pass: 123456\r\n\r\n\r\n\r\n##License\r\n[Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0.html)\r\n\r\n","maintainers":[{"name":"koraybalci","email":"koray.balci@ccsoft.com.tr"}],"time":{"modified":"2014-01-16T17:40:42.214Z","created":"2014-01-16T17:40:39.720Z","1.0.0":"2014-01-16T17:40:42.214Z"},"_attachments":{"com.ccsoft.plugin.cordovafacebook-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-ytpwjuh68YhlIjGH0Xw7ng==","length":88786,"stub":true}}}},
{"id":"com.chariotsolutions.cordova.plugin.keyboard_toolbar_remover","key":"com.chariotsolutions.cordova.plugin.keyboard_toolbar_remover","value":{"rev":"3-2e344d7ee798030685ba9f0925b3adb2"},"doc":{"_id":"com.chariotsolutions.cordova.plugin.keyboard_toolbar_remover","_rev":"3-2e344d7ee798030685ba9f0925b3adb2","name":"com.chariotsolutions.cordova.plugin.keyboard_toolbar_remover","description":"Allows the Previous, Next and Done buttons in an iOS web view to be hidden","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.2":{"version":"0.0.2","name":"com.chariotsolutions.cordova.plugin.keyboard_toolbar_remover","cordova_name":"Keyboard Toolbar Remover","description":"Allows the Previous, Next and Done buttons in an iOS web view to be hidden","license":"MIT","engines":[{"name":"cordova","version":">=2.9.0"}],"readme":"# Keyboard Toolbar Remover Cordova Plugin \n\nThe keyboard in an iOS web view has an InputAccessoryView with Previous, Next and Done buttons. This plugin allows the toolbar to be hidden.\n\n![with_toolbar](https://github.com/don/KeyboardToolbarRemover/raw/master/ios7_with_toolbar.png) &nbsp; ![toolbar_removed](https://github.com/don/KeyboardToolbarRemover/raw/master/ios7_toolbar_removed.png)\n\n![with_toolbar](https://github.com/don/KeyboardToolbarRemover/raw/master/with_toolbar.png) &nbsp; ![toolbar_removed](https://github.com/don/KeyboardToolbarRemover/raw/master/toolbar_removed.png)\n\n# Installation\n\nAssuming you're running Cordova 2.9+ and using the command line interface\n\n $ cd /path/to/project\n $ cordova plugin add https://github.com/don/KeyboardToolbarRemover\n \n# Usage\n\nThe plugin creates a global variable called `toolbar` when it is installed.\n\nTo disable the toolbar \n\n\ttoolbar.hide()\n\nTo re-enable the toolbar\n\n\ttoolbar.show()\n\t\n## Troubleshooting\n\nIf you see a bar above the keyboard with iOS7, try adding `height=device-height` to the viewport meta tag. See [Issue 9](https://github.com/don/KeyboardToolbarRemover/issues/9) for more details.\n\n# Credits\n\nThe original code to hide the toolbar is based on the [Josh Garnham](http://twitter.com/jgarnham)'s code in a [blog post](http://ios-blog.co.uk/tutorials/rich-text-editing-a-simple-start-part-1/). (Scroll down to the Bonus Code section.)\n\n[Steve Smith](https://github.com/stevenpsmith)'s iOS 7 fix was influenced by [a stack overflow post](http://stackoverflow.com/questions/18837551/remove-keyboard-form-toolbar-on-ios7-leaves-a-blur-behind/19042392#19042392).\n\n[Michael Scholz](https://github.com/MichaelRando) and [Shinichi Hosokawa](https://github.com/shosokawa) provided patches for Cordova 3.0 compatibility.\n\n# License\n\nThe MIT License\n\nCopyright (c) 2012-3 Chariot Solutions\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies 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,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n","readmeFilename":"README.md","_id":"com.chariotsolutions.cordova.plugin.keyboard_toolbar_remover@0.0.2","dist":{"shasum":"a6493cd010e709dfbcc50df6a74f5a366c453ad8","tarball":"http://registry.cordova.io/com.chariotsolutions.cordova.plugin.keyboard_toolbar_remover/-/com.chariotsolutions.cordova.plugin.keyboard_toolbar_remover-0.0.2.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"don","email":"don.coleman@gmail.com"},"maintainers":[{"name":"don","email":"don.coleman@gmail.com"}]}},"readme":"# Keyboard Toolbar Remover Cordova Plugin \n\nThe keyboard in an iOS web view has an InputAccessoryView with Previous, Next and Done buttons. This plugin allows the toolbar to be hidden.\n\n![with_toolbar](https://github.com/don/KeyboardToolbarRemover/raw/master/ios7_with_toolbar.png) &nbsp; ![toolbar_removed](https://github.com/don/KeyboardToolbarRemover/raw/master/ios7_toolbar_removed.png)\n\n![with_toolbar](https://github.com/don/KeyboardToolbarRemover/raw/master/with_toolbar.png) &nbsp; ![toolbar_removed](https://github.com/don/KeyboardToolbarRemover/raw/master/toolbar_removed.png)\n\n# Installation\n\nAssuming you're running Cordova 2.9+ and using the command line interface\n\n $ cd /path/to/project\n $ cordova plugin add https://github.com/don/KeyboardToolbarRemover\n \n# Usage\n\nThe plugin creates a global variable called `toolbar` when it is installed.\n\nTo disable the toolbar \n\n\ttoolbar.hide()\n\nTo re-enable the toolbar\n\n\ttoolbar.show()\n\t\n## Troubleshooting\n\nIf you see a bar above the keyboard with iOS7, try adding `height=device-height` to the viewport meta tag. See [Issue 9](https://github.com/don/KeyboardToolbarRemover/issues/9) for more details.\n\n# Credits\n\nThe original code to hide the toolbar is based on the [Josh Garnham](http://twitter.com/jgarnham)'s code in a [blog post](http://ios-blog.co.uk/tutorials/rich-text-editing-a-simple-start-part-1/). (Scroll down to the Bonus Code section.)\n\n[Steve Smith](https://github.com/stevenpsmith)'s iOS 7 fix was influenced by [a stack overflow post](http://stackoverflow.com/questions/18837551/remove-keyboard-form-toolbar-on-ios7-leaves-a-blur-behind/19042392#19042392).\n\n[Michael Scholz](https://github.com/MichaelRando) and [Shinichi Hosokawa](https://github.com/shosokawa) provided patches for Cordova 3.0 compatibility.\n\n# License\n\nThe MIT License\n\nCopyright (c) 2012-3 Chariot Solutions\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies 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,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n","maintainers":[{"name":"don","email":"don.coleman@gmail.com"}],"time":{"modified":"2013-10-29T21:32:57.585Z","created":"2013-10-29T21:32:56.832Z","0.0.2":"2013-10-29T21:32:57.585Z"},"_attachments":{"com.chariotsolutions.cordova.plugin.keyboard_toolbar_remover-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-ho0M+a0o02Fnq39Hmadzmg==","length":151553,"stub":true}}}},
{"id":"com.chariotsolutions.nfc.plugin","key":"com.chariotsolutions.nfc.plugin","value":{"rev":"7-572c2309171503864f28fee67dc9a08f"},"doc":{"_id":"com.chariotsolutions.nfc.plugin","_rev":"7-572c2309171503864f28fee67dc9a08f","name":"com.chariotsolutions.nfc.plugin","description":"Near Field Communication (NFC) Plugin. Read and write NDEF messages to tags or share NDEF messages with peers.","dist-tags":{"latest":"0.4.7"},"versions":{"0.4.5":{"version":"0.4.5","name":"com.chariotsolutions.nfc.plugin","description":"Near Field Communication (NFC) Plugin. Read and write NDEF messages to tags or share with peers.","license":"MIT","readme":"PhoneGap NFC Plugin\n==========================\n\nThe PhoneGap NFC Plugin provides access to Near Field Communication (NFC) functionality, allowing applications to read NDEF message in NFC tags. A \"tag\" may actually be another device that appears as a tag.\n\nSupported Platforms\n-------------------\n* Android\n* BlackBerry 7\n* BlackBerry 10\n* Windows Phone 8\n\n## Contents\n\n* [Installing](#installing)\n* [NFC](#nfc)\n* [NDEF](#ndef)\n - [NdefMessage](#ndefmessage)\n - [NdefRecord](#ndefrecord)\n* [Events](#events)\n* [Platform Differences](#platform-differences)\n* [Launching Application when Scanning a Tag](#launching-your-application-when-scanning-a-tag)\n* [Sample Projects](#sample-projects)\n* [License](#license)\n \n# Installing\n\nSee [INSTALL.md](INSTALL.md) for details on how to install the nfc-plugin into your PhoneGap project.\n\nPhonegap 2.8.0 is required for Android and recommended for other platforms. BlackBerry and Windows Phone *should* work with Corodva 2.5 and greater.\n\nSee the [doc](doc) directory for additional documentation.\n\n# NFC\n\n> The nfc object provides access to the device's NFC sensor.\n\n## Methods\n\n- [nfc.addTagDiscoveredListener](#nfcaddtagdiscoveredlistener)\n- [nfc.addMimeTypeListener](#nfcaddmimetypelistener)\n- [nfc.addNdefListener](#nfcaddndeflistener)\n- [nfc.addNdefFormatableListener](#nfcaddndefformatablelistener)\n- [nfc.write](#nfcwrite)\n- [nfc.share](#nfcshare)\n- [nfc.unshare](#nfcunshare)\n- [nfc.erase](#nfcerase)\n\n## nfc.addTagDiscoveredListener\n\nRegisters an event listener for tags matching any tag type.\n\n nfc.addTagDiscoveredListener(callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __callback__: The callback that is called when a tag is detected.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addTagDiscoveredListener` registers the callback for tag events.\n\nThis event occurs when any tag is detected by the phone.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n\n## nfc.addMimeTypeListener\n\nRegisters an event listener for NDEF tags matching a specified MIME type.\n\n nfc.addMimeTypeListener(mimeType, callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __mimeType__: The MIME type to filter for messages.\n- __callback__: The callback that is called when an NDEF tag matching the MIME type is read.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addMimeTypeListener` registers the callback for ndef-mime events.\n\nA ndef-mime event occurs when a `Ndef.TNF_MIME_MEDIA` tag is read and matches the specified MIME type.\n\nThis function can be called multiple times to register different MIME types.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n\n## nfc.addNdefListener\n\nRegisters an event listener for any NDEF tag.\n\n nfc.addNdefListener(callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __callback__: The callback that is called when an NDEF tag is read.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addNdefListener` registers the callback for ndef events.\n\nA ndef event occurs when a NDEF tag is read.\n\nNOTE: Registered mimeTypeListeners takes precedence over the more generic NDEF listener.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- BlackBerry 10\n- Windows Phone 8\n\n\n## nfc.addNdefFormatableListener\n\nRegisters an event listener for formatable NDEF tags.\n\n nfc.addNdefFormatableListener(callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __callback__: The callback that is called when NDEF formatable tag is read.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addNdefFormatableListener` registers the callback for ndef-formatable events.\n\nA ndef-formatable event occurs when a tag is read that can be NDEF formatted. This is not fired for tags that are already formatted as NDEF. The ndef-formatable event will not contain an NdefMessage.\n\n### Supported Platforms\n\n- Android\n\n## nfc.write\n\nWrites an NDEF Message to a NFC tag.\n\nA NDEF Message is an array of one or more NDEF Records\n \n var message = [\n ndef.textRecord(\"hello, world\"),\n ndef.uriRecord(\"http://github.com/chariotsolutions/phonegap-nfc\")\n ];\n \n nfc.write(message, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __ndefMessage__: An array of NDEF Records.\n- __onSuccess__: (Optional) The callback that is called when the tag is written.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.write` writes an NdefMessage to a NFC tag.\n\nThis method *must* be called from within an NDEF Event Handler. \n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- Windows Phone 8\n\n## nfc.share\n\nShares an NDEF Message via peer-to-peer.\n\nA NDEF Message is an array of one or more NDEF Records\n\n var message = [\n ndef.textRecord(\"hello, world\")\n ];\n\n nfc.share(message, [onSuccess], [onFailure]);\n \n### Parameters\n\n- __ndefMessage__: An array of NDEF Records.\n- __onSuccess__: (Optional) The callback that is called when the message is pushed.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.share` writes an NdefMessage via peer-to-peer. This should appear as an NFC tag to another device.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- BlackBerry 10\n- Windows Phone 8\n\n### Platform differences\n\n Android - shares message until unshare is called\n BlackBerry 10 - shares the message one time or until unshare is called \n Windows Phone 8 - must be called from within a NFC event handler like nfc.write \n\n## nfc.unshare\n\nStop sharing NDEF data via peer-to-peer.\n\n nfc.unshare([onSuccess], [onFailure]);\n\n### Parameters\n\n- __onSuccess__: (Optional) The callback that is called when sharing stops.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.unshare` stops sharing data via peer-to-peer.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- BlackBerry 10\n\n## nfc.erase\n\nErase a NDEF tag\n\n nfc.erase([onSuccess], [onFailure]);\n\n### Parameters\n\n- __onSuccess__: (Optional) The callback that is called when sharing stops.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.erase` erases a tag by writing an empty message. Will format unformatted tags before writing.\n\nThis method *must* be called from within an NDEF Event Handler.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n\n# NDEF\n\n> The `ndef` object provides NDEF constants, functions for creating NdefRecords, and functions for converting data.\n> See [android.nfc.NdefRecord](http://developer.android.com/reference/android/nfc/NdefRecord.html) for documentation about constants\n\n## NdefMessage\n\nRepresents an NDEF (NFC Data Exchange Format) data message that contains one or more NdefRecords.\nThis plugin uses an array of NdefRecords to represent an NdefMessage.\n\n## NdefRecord\n\nRepresents a logical (unchunked) NDEF (NFC Data Exchange Format) record.\n\n### Properties\n\n- __tnf__: 3-bit TNF (Type Name Format) - use one of the TNF_* constants\n- __type__: byte array, containing zero to 255 bytes, must not be null\n- __id__: byte array, containing zero to 255 bytes, must not be null\n- __payload__: byte array, containing zero to (2 ** 32 - 1) bytes, must not be null\n\nThe `ndef` object has a function for creating NdefRecords\n \n var type = \"text/pg\",\n \tid = [],\n \tpayload = ndef.stringToBytes(\"Hello World\"),\n \trecord = ndef.record(ndef.TNF_MIME_MEDIA, type, id, payload);\n \nThere are also helper functions for some types of records\n\nCreate a URI record\n\n var record = ndef.uriRecord(\"http://chariotsolutions.com\");\n\nCreate a plain text record\n\n var record = ndef.textRecord(\"Plain text message\");\n\nCreate a mime type record\n\n var mimeType = \"text/pg\",\n payload = \"Hello Phongap\",\n record = ndef.mimeMediaRecord(mimeType, nfc.stringToBytes(payload));\n \nCreate an Empty record\n\n var record = ndef.emptyRecord();\n\nSee `ndef.record`, `ndef.textRecord`, `ndef.mimeMediaRecord`, and `ndef.uriRecord`.\n\nThe Ndef object has functions to convert some data types to and from byte arrays. \n\nSee the [phonegap-nfc.js](https://github.com/chariotsolutions/phonegap-nfc/blob/master/www/phonegap-nfc.js) source for more documentation.\n\n# Events\n\nEvents are fired when NFC tags are read. Listeners are added by registering callback functions with the `nfc` object. For example ` nfc.addNdefListener(myNfcListener, win, fail);`\n\n## NfcEvent\n\n### Properties\n\n- __type__: event type \n- __tag__: Ndef tag\n \n### Types\n\n- tag\n- ndef-mime\n- ndef\n- ndef-formatable\n\nThe tag contents are platform dependent.\n\n`id` and `techTypes` may be included when scanning a tag on Android. `serialNumber` may be included on BlackBerry.\n\n`id` and `serialNumber` are different names for the same value. `id` is typically displayed as a hex string `ndef.bytesToHexString(tag.id)`.\n\nWindows Phone 8 and BlackBerry 10 read the NDEF information from a tag, but do not have access to the tag id or other meta data like capacity, read-only status or tag technologies.\n\nAssuming the following NDEF message is written to a tag, it will produce the following events when read.\n\n\tvar ndefMessage = [\n\t\tndef.createMimeRecord('text/pg', 'Hello PhoneGap')\t\t\n\t];\n\n#### Sample Event on Android\n\n\t{\n\t type: 'ndef',\n\t tag: {\n\t \"isWritable\": true,\n\t \"id\": [4, 96, 117, 74, -17, 34, -128],\n\t \"techTypes\": [\"android.nfc.tech.IsoDep\", \"android.nfc.tech.NfcA\", \"android.nfc.tech.Ndef\"],\n\t \"type\": \"NFC Forum Type 4\",\n\t \"canMakeReadOnly\": false,\n\t \"maxSize\": 2046,\n\t \"ndefMessage\": [{\n\t \"id\": [],\n\t \"type\": [116, 101, 120, 116, 47, 112, 103],\n\t \"payload\": [72, 101, 108, 108, 111, 32, 80, 104, 111, 110, 101, 71, 97, 112],\n\t \"tnf\": 2\n\t }]\n\t }\n\t}\n\n#### Sample Event on BlackBerry 7\n\n\t{\n\t type: 'ndef',\n\t tag: {\n\t \"tagType\": \"4\",\n\t \"isLocked\": false,\n\t \"isLockable\": false,\n\t \"freeSpaceSize\": \"2022\",\n\t \"serialNumberLength\": \"7\",\n\t \"serialNumber\": [4, 96, 117, 74, -17, 34, -128],\n\t \"name\": \"Desfire EV1 2K\",\n\t \"ndefMessage\": [{\n\t \"tnf\": 2,\n\t \"type\": [116, 101, 120, 116, 47, 112, 103],\n\t \"id\": [],\n\t \"payload\": [72, 101, 108, 108, 111, 32, 80, 104, 111, 110, 101, 71, 97, 112]\n\t }]\n\t }\n\t}\n\t\n#### Sample Event on BlackBerry 10 or Windows Phone 8\n\n\t{\n\t type: 'ndef',\n\t tag: {\n\t \"ndefMessage\": [{\n\t \"tnf\": 2,\n\t \"type\": [116, 101, 120, 116, 47, 112, 103],\n\t \"id\": [],\n\t \"payload\": [72, 101, 108, 108, 111, 32, 80, 104, 111, 110, 101, 71, 97, 112]\n\t }]\n\t }\n\t}\n\t\n## Getting Details about Events\n\t\nThe raw contents of the scanned tags are written to the log before the event is fired. Use `adb logcat` on Android and Event Log (hold alt + lglg) on BlackBerry. \n\nYou can also log the tag contents in your event handlers. `console.log(JSON.stringify(nfcEvent.tag))` Note that you want to stringify the tag not the event to avoid a circular reference.\n\n# Platform Differences\n\n## Non-NDEF Tags\n\nOnly Android and BlackBerry 7 can read Non-NDEF NFC tags.\n\n## Mifare Classic Tags\n\nBlackBerry 7 and BlackBerry 10 will not read Mifare Classic tags. Mifare Ultralight tags will work since they are NFC Forum Type 2 tags.\n\n## Tag Id and Meta Data\n\nWindows Phone 8 and BlackBerry 10 read the NDEF information from a tag, but do not have access to the tag id or other meta data like capacity, read-only status or tag technologies.\n\n## Multiple Listeners\n\nMultiple listeners can be registered in JavaScript. e.g. addTagDiscoveredListener, addNdefListener, addMimeTypeListener.\n\nOn Android, only the most specific event will fire. If a Mime Media Tag is scanned, only the addMimeTypeListener callback is called.\n\nOn BlackBerry 10, all the events fire if a Mime Media Tag is scanned.\n\n## addTagDiscoveredListener on Android and BlackBerry 7.\n\nOn Android, addTagDiscoveredListener scans non-NDEF tags and NDEF tags. The tag event does NOT contain an ndefMessage even if there are NDEF messages on the tag. Use addNdefListener or addMimeTypeListener to get the NDEF information.\n\nOn BlackBerry 7, addTagDiscoveredListener does NOT scan non-NDEF tags. Webworks returns the ndefMessage in the event.\n\t\n### Non-NDEF tag scanned with addTagDiscoveredListener on *Android*\n\n\t{\n\t type: 'tag',\n\t tag: {\n\t \"id\": [ - 81, 105, -4, 64],\n\t \"techTypes\": [\"android.nfc.tech.MifareClassic\", \"android.nfc.tech.NfcA\", \"android.nfc.tech.NdefFormatable\"]\n\t }\n\t}\n\n### NDEF tag scanned with addTagDiscoveredListener on *Android*\n\n\t{\n\t type: 'tag',\n\t tag: {\n\t \"id\": [4, 96, 117, 74, -17, 34, -128],\n\t \"techTypes\": [\"android.nfc.tech.IsoDep\", \"android.nfc.tech.NfcA\", \"android.nfc.tech.Ndef\"]\n\t }\n\t}\n\t\n\n# Launching your Application when Scanning a Tag\n\n On Android, intents can be used to launch your application when a NFC tag is read. This is optional and configured in AndroidManifest.xml.\n\n <intent-filter>\n <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n <data android:mimeType=\"text/pg\" />\n <category android:name=\"android.intent.category.DEFAULT\" />\n </intent-filter>\n \nNote: `data android:mimeType=\"text/pg\"` should match the data type you specified in JavaScript\n\n We have found it necessary to add `android:noHistory=\"true\"` to the activity element so that scanning a tag launches the application after the user has pressed the home button.\n\n\nSample Projects\n================\n\n- [NFC Reader](https://github.com/don/phonegap-nfc-reader)\n- [NFC Writer](https://github.com/don/phonegap-nfc-writer)\n- [NFC Peer to Peer](https://github.com/don/phonegap-p2p)\n- [Rock Paper Scissors](https://github.com/don/rockpaperscissors)\n\nLicense\n================\n\nThe MIT License\n\nCopyright (c) 2011-2012 Chariot Solutions\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies 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,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","readmeFilename":"README.md","_id":"com.chariotsolutions.nfc.plugin@0.4.5","dist":{"shasum":"dad3d4cf5c14fcd412596ffcab6f1a7d56a5c7d1","tarball":"http://registry.cordova.io/com.chariotsolutions.nfc.plugin/-/com.chariotsolutions.nfc.plugin-0.4.5.tgz"},"_from":"./phonegap-nfc","_npmVersion":"1.3.4","_npmUser":{"name":"don","email":"don.coleman@gmail.com"},"maintainers":[{"name":"don","email":"don.coleman@gmail.com"}]},"0.4.6":{"version":"0.4.6","name":"com.chariotsolutions.nfc.plugin","cordova_name":"NFC","description":"Near Field Communication (NFC) Plugin. Read and write NDEF messages to tags or share NDEF messages with peers.","license":"MIT","engines":[{"name":"cordova","version":">=2.8.0"}],"readme":"PhoneGap NFC Plugin\n==========================\n\nThe PhoneGap NFC Plugin provides access to Near Field Communication (NFC) functionality, allowing applications to read NDEF message in NFC tags. A \"tag\" may actually be another device that appears as a tag.\n\nSupported Platforms\n-------------------\n* Android\n* BlackBerry 7\n* BlackBerry 10\n* Windows Phone 8\n\n## Contents\n\n* [Installing](#installing)\n* [NFC](#nfc)\n* [NDEF](#ndef)\n - [NdefMessage](#ndefmessage)\n - [NdefRecord](#ndefrecord)\n* [Events](#events)\n* [Platform Differences](#platform-differences)\n* [Launching Application when Scanning a Tag](#launching-your-application-when-scanning-a-tag)\n* [Sample Projects](#sample-projects)\n* [License](#license)\n \n# Installing\n\n<!-- See [INSTALL.md](INSTALL.md) for details on how to install the nfc-plugin into your PhoneGap project. -->\n\nPhonegap 2.9.0+ is required for Android and recommended for other platforms. BlackBerry and Windows Phone *should* work with Corodva 2.5 and greater.\n\n**Cordova 3.0 is the recommended way to use phonegap-nfc, see [Getting Started Cordova CLI](https://github.com/chariotsolutions/phonegap-nfc/blob/master/doc/GettingStartedCLI.md).**\n\n[INSTALL.md](INSTALL.md) has **older** instructions for installing the nfc-plugin into your PhoneGap project.\n\nSee the [doc](doc) directory for additional documentation.\n\n# NFC\n\n> The nfc object provides access to the device's NFC sensor.\n\n## Methods\n\n- [nfc.addTagDiscoveredListener](#nfcaddtagdiscoveredlistener)\n- [nfc.addMimeTypeListener](#nfcaddmimetypelistener)\n- [nfc.addNdefListener](#nfcaddndeflistener)\n- [nfc.addNdefFormatableListener](#nfcaddndefformatablelistener)\n- [nfc.write](#nfcwrite)\n- [nfc.share](#nfcshare)\n- [nfc.unshare](#nfcunshare)\n- [nfc.erase](#nfcerase)\n- [nfc.handover](#nfchandover)\n- [nfc.stopHandover](#nfcstophandover)\n\n## nfc.addTagDiscoveredListener\n\nRegisters an event listener for tags matching any tag type.\n\n nfc.addTagDiscoveredListener(callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __callback__: The callback that is called when a tag is detected.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addTagDiscoveredListener` registers the callback for tag events.\n\nThis event occurs when any tag is detected by the phone.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n\n## nfc.addMimeTypeListener\n\nRegisters an event listener for NDEF tags matching a specified MIME type.\n\n nfc.addMimeTypeListener(mimeType, callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __mimeType__: The MIME type to filter for messages.\n- __callback__: The callback that is called when an NDEF tag matching the MIME type is read.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addMimeTypeListener` registers the callback for ndef-mime events.\n\nA ndef-mime event occurs when a `Ndef.TNF_MIME_MEDIA` tag is read and matches the specified MIME type.\n\nThis function can be called multiple times to register different MIME types.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n\n## nfc.addNdefListener\n\nRegisters an event listener for any NDEF tag.\n\n nfc.addNdefListener(callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __callback__: The callback that is called when an NDEF tag is read.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addNdefListener` registers the callback for ndef events.\n\nA ndef event occurs when a NDEF tag is read.\n\nNOTE: Registered mimeTypeListeners takes precedence over the more generic NDEF listener.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- BlackBerry 10\n- Windows Phone 8\n\n\n## nfc.addNdefFormatableListener\n\nRegisters an event listener for formatable NDEF tags.\n\n nfc.addNdefFormatableListener(callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __callback__: The callback that is called when NDEF formatable tag is read.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addNdefFormatableListener` registers the callback for ndef-formatable events.\n\nA ndef-formatable event occurs when a tag is read that can be NDEF formatted. This is not fired for tags that are already formatted as NDEF. The ndef-formatable event will not contain an NdefMessage.\n\n### Supported Platforms\n\n- Android\n\n## nfc.write\n\nWrites an NDEF Message to a NFC tag.\n\nA NDEF Message is an array of one or more NDEF Records\n \n var message = [\n ndef.textRecord(\"hello, world\"),\n ndef.uriRecord(\"http://github.com/chariotsolutions/phonegap-nfc\")\n ];\n \n nfc.write(message, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __ndefMessage__: An array of NDEF Records.\n- __onSuccess__: (Optional) The callback that is called when the tag is written.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.write` writes an NdefMessage to a NFC tag.\n\nThis method *must* be called from within an NDEF Event Handler. \n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- Windows Phone 8\n\n## nfc.share\n\nShares an NDEF Message via peer-to-peer.\n\nA NDEF Message is an array of one or more NDEF Records\n\n var message = [\n ndef.textRecord(\"hello, world\")\n ];\n\n nfc.share(message, [onSuccess], [onFailure]);\n \n### Parameters\n\n- __ndefMessage__: An array of NDEF Records.\n- __onSuccess__: (Optional) The callback that is called when the message is pushed.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.share` writes an NdefMessage via peer-to-peer. This should appear as an NFC tag to another device.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- BlackBerry 10\n- Windows Phone 8\n\n### Platform differences\n\n Android - shares message until unshare is called\n BlackBerry 10 - shares the message one time or until unshare is called \n Windows Phone 8 - must be called from within a NFC event handler like nfc.write \n\n## nfc.unshare\n\nStop sharing NDEF data via peer-to-peer.\n\n nfc.unshare([onSuccess], [onFailure]);\n\n### Parameters\n\n- __onSuccess__: (Optional) The callback that is called when sharing stops.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.unshare` stops sharing data via peer-to-peer.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- BlackBerry 10\n\n## nfc.erase\n\nErase a NDEF tag\n\n nfc.erase([onSuccess], [onFailure]);\n\n### Parameters\n\n- __onSuccess__: (Optional) The callback that is called when sharing stops.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.erase` erases a tag by writing an empty message. Will format unformatted tags before writing.\n\nThis method *must* be called from within an NDEF Event Handler.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n\n## nfc.handover\n\nSend a file to another device via NFC handover.\n\n var uri = \"content://media/external/audio/media/175\";\n nfc.handover(uri, [onSuccess], [onFailure]);\n\n\n var uris = [\n \"content://media/external/audio/media/175\",\n \"content://media/external/audio/media/176\",\n \"content://media/external/audio/media/348\" \n ];\n nfc.handover(uris, [onSuccess], [onFailure]);\n\n \n### Parameters\n\n- __uri__: A URI as a String, or an *array* of URIs.\n- __onSuccess__: (Optional) The callback that is called when the message is pushed.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.handover` shares files to a NFC peer using handover. Files are sent by specifying a file:// or context:// URI or a list of URIs. The file transfer is initiated with NFC but the transfer is completed with over Bluetooth or WiFi which is handled by a NFC handover request. The Android code is responsible for building the handover NFC Message.\n\nThis is Android only, but it should be possible to add implementations for other platforms.\n\n### Supported Platforms\n\n- Android\n\n## nfc.stopHandover\n\nStop sharing NDEF data via NFC handover.\n\n nfc.stopHandover([onSuccess], [onFailure]);\n\n### Parameters\n\n- __onSuccess__: (Optional) The callback that is called when sharing stops.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.stopHandover` stops sharing data via peer-to-peer.\n\n### Supported Platforms\n\n- Android\n\n# NDEF\n\n> The `ndef` object provides NDEF constants, functions for creating NdefRecords, and functions for converting data.\n> See [android.nfc.NdefRecord](http://developer.android.com/reference/android/nfc/NdefRecord.html) for documentation about constants\n\n## NdefMessage\n\nRepresents an NDEF (NFC Data Exchange Format) data message that contains one or more NdefRecords.\nThis plugin uses an array of NdefRecords to represent an NdefMessage.\n\n## NdefRecord\n\nRepresents a logical (unchunked) NDEF (NFC Data Exchange Format) record.\n\n### Properties\n\n- __tnf__: 3-bit TNF (Type Name Format) - use one of the TNF_* constants\n- __type__: byte array, containing zero to 255 bytes, must not be null\n- __id__: byte array, containing zero to 255 bytes, must not be null\n- __payload__: byte array, containing zero to (2 ** 32 - 1) bytes, must not be null\n\nThe `ndef` object has a function for creating NdefRecords\n \n var type = \"text/pg\",\n \tid = [],\n \tpayload = ndef.stringToBytes(\"Hello World\"),\n \trecord = ndef.record(ndef.TNF_MIME_MEDIA, type, id, payload);\n \nThere are also helper functions for some types of records\n\nCreate a URI record\n\n var record = ndef.uriRecord(\"http://chariotsolutions.com\");\n\nCreate a plain text record\n\n var record = ndef.textRecord(\"Plain text message\");\n\nCreate a mime type record\n\n var mimeType = \"text/pg\",\n payload = \"Hello Phongap\",\n record = ndef.mimeMediaRecord(mimeType, nfc.stringToBytes(payload));\n \nCreate an Empty record\n\n var record = ndef.emptyRecord();\n\nSee `ndef.record`, `ndef.textRecord`, `ndef.mimeMediaRecord`, and `ndef.uriRecord`.\n\nThe Ndef object has functions to convert some data types to and from byte arrays. \n\nSee the [phonegap-nfc.js](https://github.com/chariotsolutions/phonegap-nfc/blob/master/www/phonegap-nfc.js) source for more documentation.\n\n# Events\n\nEvents are fired when NFC tags are read. Listeners are added by registering callback functions with the `nfc` object. For example ` nfc.addNdefListener(myNfcListener, win, fail);`\n\n## NfcEvent\n\n### Properties\n\n- __type__: event type \n- __tag__: Ndef tag\n \n### Types\n\n- tag\n- ndef-mime\n- ndef\n- ndef-formatable\n\nThe tag contents are platform dependent.\n\n`id` and `techTypes` may be included when scanning a tag on Android. `serialNumber` may be included on BlackBerry.\n\n`id` and `serialNumber` are different names for the same value. `id` is typically displayed as a hex string `ndef.bytesToHexString(tag.id)`.\n\nWindows Phone 8 and BlackBerry 10 read the NDEF information from a tag, but do not have access to the tag id or other meta data like capacity, read-only status or tag technologies.\n\nAssuming the following NDEF message is written to a tag, it will produce the following events when read.\n\n\tvar ndefMessage = [\n\t\tndef.createMimeRecord('text/pg', 'Hello PhoneGap')\t\t\n\t];\n\n#### Sample Event on Android\n\n\t{\n\t type: 'ndef',\n\t tag: {\n\t \"isWritable\": true,\n\t \"id\": [4, 96, 117, 74, -17, 34, -128],\n\t \"techTypes\": [\"android.nfc.tech.IsoDep\", \"android.nfc.tech.NfcA\", \"android.nfc.tech.Ndef\"],\n\t \"type\": \"NFC Forum Type 4\",\n\t \"canMakeReadOnly\": false,\n\t \"maxSize\": 2046,\n\t \"ndefMessage\": [{\n\t \"id\": [],\n\t \"type\": [116, 101, 120, 116, 47, 112, 103],\n\t \"payload\": [72, 101, 108, 108, 111, 32, 80, 104, 111, 110, 101, 71, 97, 112],\n\t \"tnf\": 2\n\t }]\n\t }\n\t}\n\n#### Sample Event on BlackBerry 7\n\n\t{\n\t type: 'ndef',\n\t tag: {\n\t \"tagType\": \"4\",\n\t \"isLocked\": false,\n\t \"isLockable\": false,\n\t \"freeSpaceSize\": \"2022\",\n\t \"serialNumberLength\": \"7\",\n\t \"serialNumber\": [4, 96, 117, 74, -17, 34, -128],\n\t \"name\": \"Desfire EV1 2K\",\n\t \"ndefMessage\": [{\n\t \"tnf\": 2,\n\t \"type\": [116, 101, 120, 116, 47, 112, 103],\n\t \"id\": [],\n\t \"payload\": [72, 101, 108, 108, 111, 32, 80, 104, 111, 110, 101, 71, 97, 112]\n\t }]\n\t }\n\t}\n\t\n#### Sample Event on BlackBerry 10 or Windows Phone 8\n\n\t{\n\t type: 'ndef',\n\t tag: {\n\t \"ndefMessage\": [{\n\t \"tnf\": 2,\n\t \"type\": [116, 101, 120, 116, 47, 112, 103],\n\t \"id\": [],\n\t \"payload\": [72, 101, 108, 108, 111, 32, 80, 104, 111, 110, 101, 71, 97, 112]\n\t }]\n\t }\n\t}\n\t\n## Getting Details about Events\n\t\nThe raw contents of the scanned tags are written to the log before the event is fired. Use `adb logcat` on Android and Event Log (hold alt + lglg) on BlackBerry. \n\nYou can also log the tag contents in your event handlers. `console.log(JSON.stringify(nfcEvent.tag))` Note that you want to stringify the tag not the event to avoid a circular reference.\n\n# Platform Differences\n\n## Non-NDEF Tags\n\nOnly Android and BlackBerry 7 can read Non-NDEF NFC tags.\n\n## Mifare Classic Tags\n\nBlackBerry 7 and BlackBerry 10 will not read Mifare Classic tags. Mifare Ultralight tags will work since they are NFC Forum Type 2 tags.\n\n## Tag Id and Meta Data\n\nWindows Phone 8 and BlackBerry 10 read the NDEF information from a tag, but do not have access to the tag id or other meta data like capacity, read-only status or tag technologies.\n\n## Multiple Listeners\n\nMultiple listeners can be registered in JavaScript. e.g. addTagDiscoveredListener, addNdefListener, addMimeTypeListener.\n\nOn Android, only the most specific event will fire. If a Mime Media Tag is scanned, only the addMimeTypeListener callback is called.\n\nOn BlackBerry 10, all the events fire if a Mime Media Tag is scanned.\n\n## addTagDiscoveredListener on Android and BlackBerry 7.\n\nOn Android, addTagDiscoveredListener scans non-NDEF tags and NDEF tags. The tag event does NOT contain an ndefMessage even if there are NDEF messages on the tag. Use addNdefListener or addMimeTypeListener to get the NDEF information.\n\nOn BlackBerry 7, addTagDiscoveredListener does NOT scan non-NDEF tags. Webworks returns the ndefMessage in the event.\n\t\n### Non-NDEF tag scanned with addTagDiscoveredListener on *Android*\n\n\t{\n\t type: 'tag',\n\t tag: {\n\t \"id\": [ - 81, 105, -4, 64],\n\t \"techTypes\": [\"android.nfc.tech.MifareClassic\", \"android.nfc.tech.NfcA\", \"android.nfc.tech.NdefFormatable\"]\n\t }\n\t}\n\n### NDEF tag scanned with addTagDiscoveredListener on *Android*\n\n\t{\n\t type: 'tag',\n\t tag: {\n\t \"id\": [4, 96, 117, 74, -17, 34, -128],\n\t \"techTypes\": [\"android.nfc.tech.IsoDep\", \"android.nfc.tech.NfcA\", \"android.nfc.tech.Ndef\"]\n\t }\n\t}\n\t\n\n# Launching your Application when Scanning a Tag\n\nOn Android, intents can be used to launch your application when a NFC tag is read. This is optional and configured in AndroidManifest.xml.\n\n <intent-filter>\n <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n <data android:mimeType=\"text/pg\" />\n <category android:name=\"android.intent.category.DEFAULT\" />\n </intent-filter>\n \nNote: `data android:mimeType=\"text/pg\"` should match the data type you specified in JavaScript\n\nWe have found it necessary to add `android:noHistory=\"true\"` to the activity element so that scanning a tag launches the application after the user has pressed the home button.\n\nSee the Android documentation for more information about [filtering for NFC intents](http://developer.android.com/guide/topics/connectivity/nfc/nfc.html#ndef-disc).\n\nSample Projects\n================\n\n- [NFC Reader](https://github.com/don/phonegap-nfc-reader)\n- [NFC Writer](https://github.com/don/phonegap-nfc-writer)\n- [NFC Peer to Peer](https://github.com/don/phonegap-p2p)\n- [Rock Paper Scissors](https://github.com/don/rockpaperscissors)\n\nLicense\n================\n\nThe MIT License\n\nCopyright (c) 2011-2013 Chariot Solutions\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies 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,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","readmeFilename":"README.md","_id":"com.chariotsolutions.nfc.plugin@0.4.6","dist":{"shasum":"5873a021e4fcd50b72fc176dfd0d8f17f3ecb99b","tarball":"http://registry.cordova.io/com.chariotsolutions.nfc.plugin/-/com.chariotsolutions.nfc.plugin-0.4.6.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"don","email":"don.coleman@gmail.com"},"maintainers":[{"name":"don","email":"don.coleman@gmail.com"}]},"0.4.7":{"version":"0.4.7","name":"com.chariotsolutions.nfc.plugin","cordova_name":"NFC","description":"Near Field Communication (NFC) Plugin. Read and write NDEF messages to tags or share NDEF messages with peers.","license":"MIT","engines":[],"readme":"PhoneGap NFC Plugin\n==========================\n\nNear Field Communication (NFC) Plugin. Read and write NDEF messages to tags or share NDEF messages with peers.\n\nSupported Platforms\n-------------------\n* Android\n* Windows Phone 8\n* BlackBerry 10\n* BlackBerry 7\n\n## Contents\n\n* [Installing](#installing)\n* [NFC](#nfc)\n* [NDEF](#ndef)\n - [NdefMessage](#ndefmessage)\n - [NdefRecord](#ndefrecord)\n* [Events](#events)\n* [Platform Differences](#platform-differences)\n* [BlackBerry 10 Invoke Target](#blackberry-10-invoke-target)\n* [Launching Application when Scanning a Tag](#launching-your-android-application-when-scanning-a-tag)\n* [Sample Projects](#sample-projects)\n* [License](#license)\n \n# Installing\n\n**Cordova 3.1+ is the recommended way to use phonegap-nfc, see [Getting Started Cordova CLI](https://github.com/chariotsolutions/phonegap-nfc/blob/master/doc/GettingStartedCLI.md).**\n\n[INSTALL.md](INSTALL.md) has **older** instructions for installing the nfc-plugin into your PhoneGap project.\n\nSee the [doc](doc) directory for additional documentation.\n\nNote: BlackBerry 7 support is only available for Cordova 2.x. For applications targeting BlackBerry 7, you may need to use an older version of phonegap-nfc.\n\n# NFC\n\n> The nfc object provides access to the device's NFC sensor.\n\n## Methods\n\n- [nfc.addNdefListener](#nfcaddndeflistener)\n- [nfc.addTagDiscoveredListener](#nfcaddtagdiscoveredlistener)\n- [nfc.addMimeTypeListener](#nfcaddmimetypelistener)\n- [nfc.addNdefFormatableListener](#nfcaddndefformatablelistener)\n- [nfc.write](#nfcwrite)\n- [nfc.share](#nfcshare)\n- [nfc.unshare](#nfcunshare)\n- [nfc.erase](#nfcerase)\n- [nfc.handover](#nfchandover)\n- [nfc.stopHandover](#nfcstophandover)\n\n## nfc.addNdefListener\n\nRegisters an event listener for any NDEF tag.\n\n nfc.addNdefListener(callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __callback__: The callback that is called when an NDEF tag is read.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addNdefListener` registers the callback for ndef events.\n\nA ndef event is fired when a NDEF tag is read.\n\nFor BlackBerry 10, you must configure the type of tags your application will read with an [invoke-target in config.xml](#blackberry-10-invoke-target).\n\nOn Android registered [mimeTypeListeners](#nfcaddmimetypelistener) takes precedence over this more generic NDEF listener.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- BlackBerry 10\n- Windows Phone 8\n\n## nfc.addTagDiscoveredListener\n\nRegisters an event listener for tags matching any tag type.\n\n nfc.addTagDiscoveredListener(callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __callback__: The callback that is called when a tag is detected.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addTagDiscoveredListener` registers the callback for tag events.\n\nThis event occurs when any tag is detected by the phone.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n\n## nfc.addMimeTypeListener\n\nRegisters an event listener for NDEF tags matching a specified MIME type.\n\n nfc.addMimeTypeListener(mimeType, callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __mimeType__: The MIME type to filter for messages.\n- __callback__: The callback that is called when an NDEF tag matching the MIME type is read.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addMimeTypeListener` registers the callback for ndef-mime events.\n\nA ndef-mime event occurs when a `Ndef.TNF_MIME_MEDIA` tag is read and matches the specified MIME type.\n\nThis function can be called multiple times to register different MIME types.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n\n## nfc.addNdefFormatableListener\n\nRegisters an event listener for formatable NDEF tags.\n\n nfc.addNdefFormatableListener(callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __callback__: The callback that is called when NDEF formatable tag is read.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addNdefFormatableListener` registers the callback for ndef-formatable events.\n\nA ndef-formatable event occurs when a tag is read that can be NDEF formatted. This is not fired for tags that are already formatted as NDEF. The ndef-formatable event will not contain an NdefMessage.\n\n### Supported Platforms\n\n- Android\n\n## nfc.write\n\nWrites an NDEF Message to a NFC tag.\n\nA NDEF Message is an array of one or more NDEF Records\n \n var message = [\n ndef.textRecord(\"hello, world\"),\n ndef.uriRecord(\"http://github.com/chariotsolutions/phonegap-nfc\")\n ];\n \n nfc.write(message, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __ndefMessage__: An array of NDEF Records.\n- __onSuccess__: (Optional) The callback that is called when the tag is written.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.write` writes an NdefMessage to a NFC tag.\n\nOn **Android** this method *must* be called from within an NDEF Event Handler. \n\nOn **Windows Phone** this method should be called outside the NDEF Event Handler, otherwise Windows tries to read the tag contents as you are writing to the tag.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- Windows Phone 8\n\n## nfc.share\n\nShares an NDEF Message via peer-to-peer.\n\nA NDEF Message is an array of one or more NDEF Records\n\n var message = [\n ndef.textRecord(\"hello, world\")\n ];\n\n nfc.share(message, [onSuccess], [onFailure]);\n \n### Parameters\n\n- __ndefMessage__: An array of NDEF Records.\n- __onSuccess__: (Optional) The callback that is called when the message is pushed.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.share` writes an NdefMessage via peer-to-peer. This should appear as an NFC tag to another device.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- BlackBerry 10\n- Windows Phone 8\n\n### Platform differences\n\n Android - shares message until unshare is called\n BlackBerry 10 - shares the message one time or until unshare is called \n Windows Phone 8 - must be called from within a NFC event handler like nfc.write \n\n## nfc.unshare\n\nStop sharing NDEF data via peer-to-peer.\n\n nfc.unshare([onSuccess], [onFailure]);\n\n### Parameters\n\n- __onSuccess__: (Optional) The callback that is called when sharing stops.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.unshare` stops sharing data via peer-to-peer.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- BlackBerry 10\n\n## nfc.erase\n\nErase a NDEF tag\n\n nfc.erase([onSuccess], [onFailure]);\n\n### Parameters\n\n- __onSuccess__: (Optional) The callback that is called when sharing stops.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.erase` erases a tag by writing an empty message. Will format unformatted tags before writing.\n\nThis method *must* be called from within an NDEF Event Handler.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n\n## nfc.handover\n\nSend a file to another device via NFC handover.\n\n var uri = \"content://media/external/audio/media/175\";\n nfc.handover(uri, [onSuccess], [onFailure]);\n\n\n var uris = [\n \"content://media/external/audio/media/175\",\n \"content://media/external/audio/media/176\",\n \"content://media/external/audio/media/348\" \n ];\n nfc.handover(uris, [onSuccess], [onFailure]);\n\n \n### Parameters\n\n- __uri__: A URI as a String, or an *array* of URIs.\n- __onSuccess__: (Optional) The callback that is called when the message is pushed.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.handover` shares files to a NFC peer using handover. Files are sent by specifying a file:// or context:// URI or a list of URIs. The file transfer is initiated with NFC but the transfer is completed with over Bluetooth or WiFi which is handled by a NFC handover request. The Android code is responsible for building the handover NFC Message.\n\nThis is Android only, but it should be possible to add implementations for other platforms.\n\n### Supported Platforms\n\n- Android\n\n## nfc.stopHandover\n\nStop sharing NDEF data via NFC handover.\n\n nfc.stopHandover([onSuccess], [onFailure]);\n\n### Parameters\n\n- __onSuccess__: (Optional) The callback that is called when sharing stops.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.stopHandover` stops sharing data via peer-to-peer.\n\n### Supported Platforms\n\n- Android\n\n# NDEF\n\n> The `ndef` object provides NDEF constants, functions for creating NdefRecords, and functions for converting data.\n> See [android.nfc.NdefRecord](http://developer.android.com/reference/android/nfc/NdefRecord.html) for documentation about constants\n\n## NdefMessage\n\nRepresents an NDEF (NFC Data Exchange Format) data message that contains one or more NdefRecords.\nThis plugin uses an array of NdefRecords to represent an NdefMessage.\n\n## NdefRecord\n\nRepresents a logical (unchunked) NDEF (NFC Data Exchange Format) record.\n\n### Properties\n\n- __tnf__: 3-bit TNF (Type Name Format) - use one of the TNF_* constants\n- __type__: byte array, containing zero to 255 bytes, must not be null\n- __id__: byte array, containing zero to 255 bytes, must not be null\n- __payload__: byte array, containing zero to (2 ** 32 - 1) bytes, must not be null\n\nThe `ndef` object has a function for creating NdefRecords\n \n var type = \"text/pg\",\n \tid = [],\n \tpayload = ndef.stringToBytes(\"Hello World\"),\n \trecord = ndef.record(ndef.TNF_MIME_MEDIA, type, id, payload);\n \nThere are also helper functions for some types of records\n\nCreate a URI record\n\n var record = ndef.uriRecord(\"http://chariotsolutions.com\");\n\nCreate a plain text record\n\n var record = ndef.textRecord(\"Plain text message\");\n\nCreate a mime type record\n\n var mimeType = \"text/pg\",\n payload = \"Hello Phongap\",\n record = ndef.mimeMediaRecord(mimeType, nfc.stringToBytes(payload));\n \nCreate an Empty record\n\n var record = ndef.emptyRecord();\n\nSee `ndef.record`, `ndef.textRecord`, `ndef.mimeMediaRecord`, and `ndef.uriRecord`.\n\nThe Ndef object has functions to convert some data types to and from byte arrays. \n\nSee the [phonegap-nfc.js](https://github.com/chariotsolutions/phonegap-nfc/blob/master/www/phonegap-nfc.js) source for more documentation.\n\n# Events\n\nEvents are fired when NFC tags are read. Listeners are added by registering callback functions with the `nfc` object. For example ` nfc.addNdefListener(myNfcListener, win, fail);`\n\n## NfcEvent\n\n### Properties\n\n- __type__: event type \n- __tag__: Ndef tag\n \n### Types\n\n- tag\n- ndef-mime\n- ndef\n- ndef-formatable\n\nThe tag contents are platform dependent.\n\n`id` and `techTypes` may be included when scanning a tag on Android. `serialNumber` may be included on BlackBerry 7.\n\n`id` and `serialNumber` are different names for the same value. `id` is typically displayed as a hex string `ndef.bytesToHexString(tag.id)`.\n\nWindows Phone 8 and BlackBerry 10 read the NDEF information from a tag, but do not have access to the tag id or other meta data like capacity, read-only status or tag technologies.\n\nAssuming the following NDEF message is written to a tag, it will produce the following events when read.\n\n\tvar ndefMessage = [\n\t\tndef.createMimeRecord('text/pg', 'Hello PhoneGap')\t\t\n\t];\n\n#### Sample Event on Android\n\n\t{\n\t type: 'ndef',\n\t tag: {\n\t \"isWritable\": true,\n\t \"id\": [4, 96, 117, 74, -17, 34, -128],\n\t \"techTypes\": [\"android.nfc.tech.IsoDep\", \"android.nfc.tech.NfcA\", \"android.nfc.tech.Ndef\"],\n\t \"type\": \"NFC Forum Type 4\",\n\t \"canMakeReadOnly\": false,\n\t \"maxSize\": 2046,\n\t \"ndefMessage\": [{\n\t \"id\": [],\n\t \"type\": [116, 101, 120, 116, 47, 112, 103],\n\t \"payload\": [72, 101, 108, 108, 111, 32, 80, 104, 111, 110, 101, 71, 97, 112],\n\t \"tnf\": 2\n\t }]\n\t }\n\t}\n\n#### Sample Event on BlackBerry 7\n\n\t{\n\t type: 'ndef',\n\t tag: {\n\t \"tagType\": \"4\",\n\t \"isLocked\": false,\n\t \"isLockable\": false,\n\t \"freeSpaceSize\": \"2022\",\n\t \"serialNumberLength\": \"7\",\n\t \"serialNumber\": [4, 96, 117, 74, -17, 34, -128],\n\t \"name\": \"Desfire EV1 2K\",\n\t \"ndefMessage\": [{\n\t \"tnf\": 2,\n\t \"type\": [116, 101, 120, 116, 47, 112, 103],\n\t \"id\": [],\n\t \"payload\": [72, 101, 108, 108, 111, 32, 80, 104, 111, 110, 101, 71, 97, 112]\n\t }]\n\t }\n\t}\n\t\n#### Sample Event on BlackBerry 10 or Windows Phone 8\n\n\t{\n\t type: 'ndef',\n\t tag: {\n\t \"ndefMessage\": [{\n\t \"tnf\": 2,\n\t \"type\": [116, 101, 120, 116, 47, 112, 103],\n\t \"id\": [],\n\t \"payload\": [72, 101, 108, 108, 111, 32, 80, 104, 111, 110, 101, 71, 97, 112]\n\t }]\n\t }\n\t}\n\t\n## Getting Details about Events\n\t\nThe raw contents of the scanned tags are written to the log before the event is fired. Use `adb logcat` on Android and Event Log (hold alt + lglg) on BlackBerry. \n\nYou can also log the tag contents in your event handlers. `console.log(JSON.stringify(nfcEvent.tag))` Note that you want to stringify the tag not the event to avoid a circular reference.\n\n# Platform Differences\n\n## Non-NDEF Tags\n\nOnly Android and BlackBerry 7 can read Non-NDEF NFC tags.\n\n## Mifare Classic Tags\n\nBlackBerry 7, BlackBerry 10 and many newer Android phones will not read Mifare Classic tags. Mifare Ultralight tags will work since they are NFC Forum Type 2 tags.\n\n## Tag Id and Meta Data\n\nWindows Phone 8 and BlackBerry 10 read the NDEF information from a tag, but do not have access to the tag id or other meta data like capacity, read-only status or tag technologies.\n\n## Multiple Listeners\n\nMultiple listeners can be registered in JavaScript. e.g. addNdefListener, addTagDiscoveredListener, addMimeTypeListener.\n\nOn Android, only the most specific event will fire. If a Mime Media Tag is scanned, only the addMimeTypeListener callback is called and not the callback defined in addNdefListener. You can use the same event handler for multiple listeners.\n\nOn BlackBerry 7, all the events fire if a Mime Media Tag is scanned.\n\n## addTagDiscoveredListener\n\nOn Android, addTagDiscoveredListener scans non-NDEF tags and NDEF tags. The tag event does NOT contain an ndefMessage even if there are NDEF messages on the tag. Use addNdefListener or addMimeTypeListener to get the NDEF information.\n\nOn BlackBerry 7, addTagDiscoveredListener does NOT scan non-NDEF tags. Webworks returns the ndefMessage in the event.\n\t\n### Non-NDEF tag scanned with addTagDiscoveredListener on *Android*\n\n\t{\n\t type: 'tag',\n\t tag: {\n\t \"id\": [ - 81, 105, -4, 64],\n\t \"techTypes\": [\"android.nfc.tech.MifareClassic\", \"android.nfc.tech.NfcA\", \"android.nfc.tech.NdefFormatable\"]\n\t }\n\t}\n\n### NDEF tag scanned with addTagDiscoveredListener on *Android*\n\n\t{\n\t type: 'tag',\n\t tag: {\n\t \"id\": [4, 96, 117, 74, -17, 34, -128],\n\t \"techTypes\": [\"android.nfc.tech.IsoDep\", \"android.nfc.tech.NfcA\", \"android.nfc.tech.Ndef\"]\n\t }\n\t}\n\t\n# BlackBerry 10 Invoke Target\n\nThis plugin uses the [BlackBerry Invocation Framework](http://developer.blackberry.com/native/documentation/cascades/device_platform/invocation/receiving_invocation.html) to read NFC tags on BlackBerry 10. This means that you need to register an invoke target in the config.xml.\n\nIf your project supports multiple platforms, copy www/config.xml to merges/config.xml and add a `rim:invoke-target` tag. The invoke-target determines which tags your app will scan when it is running. If your application is not running, BlackBerry will launch it when a matching tag is scanned.\n\nThis sample configuration attempts to open any NDEF tag.\n\n <rim:invoke-target id=\"your.unique.id.here\">\n <type>APPLICATION</type>\n <filter>\n <action>bb.action.OPEN</action>\n <mime-type>application/vnd.rim.nfc.ndef</mime-type>\n <!-- any TNF Empty(0), Well Known(1), MIME Media(2), Absolute URI(3), External(4) --> \n <property var=\"uris\" value=\"ndef://0,ndef://1,ndef://2,ndef://3,ndef://4\" />\n </filter>\n </rim:invoke-target>\n \nYou can configure you application to handle only certain tags. \n\nFor example to scan only MIME Media tags of type \"text/pg\" use \n\n <rim:invoke-target id=\"your.unique.id.here\">\n <type>APPLICATION</type>\n <filter>\n <action>bb.action.OPEN</action>\n <mime-type>application/vnd.rim.nfc.ndef</mime-type>\n <!-- TNF MIME Media(2) with type \"text/pg\" -->\n <property var=\"uris\" value=\"ndef://2/text/pg\" />\n </filter>\n </rim:invoke-target>\n\nOr to scan only Plain Text tags use \n\n <rim:invoke-target id=\"your.unique.id.here\">\n <type>APPLICATION</type>\n <filter>\n <action>bb.action.OPEN</action>\n <mime-type>application/vnd.rim.nfc.ndef</mime-type>\n <!-- TNF Well Known(1), RTD T -->\n <property var=\"uris\" value=\"ndef://1/T\" />\n </filter>\n </rim:invoke-target>\n\nSee the [BlackBerry documentation](http://developer.blackberry.com/native/documentation/cascades/device_comm/nfc/receiving_content.html) for more info.\n\t\n# Launching your Android Application when Scanning a Tag\n\nOn Android, intents can be used to launch your application when a NFC tag is read. This is optional and configured in AndroidManifest.xml.\n\n <intent-filter>\n <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n <data android:mimeType=\"text/pg\" />\n <category android:name=\"android.intent.category.DEFAULT\" />\n </intent-filter>\n \nNote: `data android:mimeType=\"text/pg\"` should match the data type you specified in JavaScript\n\nWe have found it necessary to add `android:noHistory=\"true\"` to the activity element so that scanning a tag launches the application after the user has pressed the home button.\n\nSee the Android documentation for more information about [filtering for NFC intents](http://developer.android.com/guide/topics/connectivity/nfc/nfc.html#ndef-disc).\n\nSample Projects\n================\n\n- [NFC Reader](https://github.com/don/phonegap-nfc-reader)\n- [NFC Writer](https://github.com/don/phonegap-nfc-writer)\n- [NFC Peer to Peer](https://github.com/don/phonegap-p2p)\n- [Rock Paper Scissors](https://github.com/don/rockpaperscissors) *Android 2.x only*\n\nLicense\n================\n\nThe MIT License\n\nCopyright (c) 2011-2013 Chariot Solutions\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies 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,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","readmeFilename":"README.md","_id":"com.chariotsolutions.nfc.plugin@0.4.7","dist":{"shasum":"a77854f037c43d81db1bcbb85020096a46465f6f","tarball":"http://registry.cordova.io/com.chariotsolutions.nfc.plugin/-/com.chariotsolutions.nfc.plugin-0.4.7.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"don","email":"don.coleman@gmail.com"},"maintainers":[{"name":"don","email":"don.coleman@gmail.com"}]}},"readme":"PhoneGap NFC Plugin\n==========================\n\nThe PhoneGap NFC Plugin provides access to Near Field Communication (NFC) functionality, allowing applications to read NDEF message in NFC tags. A \"tag\" may actually be another device that appears as a tag.\n\nSupported Platforms\n-------------------\n* Android\n* BlackBerry 7\n* BlackBerry 10\n* Windows Phone 8\n\n## Contents\n\n* [Installing](#installing)\n* [NFC](#nfc)\n* [NDEF](#ndef)\n - [NdefMessage](#ndefmessage)\n - [NdefRecord](#ndefrecord)\n* [Events](#events)\n* [Platform Differences](#platform-differences)\n* [Launching Application when Scanning a Tag](#launching-your-application-when-scanning-a-tag)\n* [Sample Projects](#sample-projects)\n* [License](#license)\n \n# Installing\n\nSee [INSTALL.md](INSTALL.md) for details on how to install the nfc-plugin into your PhoneGap project.\n\nPhonegap 2.8.0 is required for Android and recommended for other platforms. BlackBerry and Windows Phone *should* work with Corodva 2.5 and greater.\n\nSee the [doc](doc) directory for additional documentation.\n\n# NFC\n\n> The nfc object provides access to the device's NFC sensor.\n\n## Methods\n\n- [nfc.addTagDiscoveredListener](#nfcaddtagdiscoveredlistener)\n- [nfc.addMimeTypeListener](#nfcaddmimetypelistener)\n- [nfc.addNdefListener](#nfcaddndeflistener)\n- [nfc.addNdefFormatableListener](#nfcaddndefformatablelistener)\n- [nfc.write](#nfcwrite)\n- [nfc.share](#nfcshare)\n- [nfc.unshare](#nfcunshare)\n- [nfc.erase](#nfcerase)\n\n## nfc.addTagDiscoveredListener\n\nRegisters an event listener for tags matching any tag type.\n\n nfc.addTagDiscoveredListener(callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __callback__: The callback that is called when a tag is detected.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addTagDiscoveredListener` registers the callback for tag events.\n\nThis event occurs when any tag is detected by the phone.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n\n## nfc.addMimeTypeListener\n\nRegisters an event listener for NDEF tags matching a specified MIME type.\n\n nfc.addMimeTypeListener(mimeType, callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __mimeType__: The MIME type to filter for messages.\n- __callback__: The callback that is called when an NDEF tag matching the MIME type is read.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addMimeTypeListener` registers the callback for ndef-mime events.\n\nA ndef-mime event occurs when a `Ndef.TNF_MIME_MEDIA` tag is read and matches the specified MIME type.\n\nThis function can be called multiple times to register different MIME types.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n\n## nfc.addNdefListener\n\nRegisters an event listener for any NDEF tag.\n\n nfc.addNdefListener(callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __callback__: The callback that is called when an NDEF tag is read.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addNdefListener` registers the callback for ndef events.\n\nA ndef event occurs when a NDEF tag is read.\n\nNOTE: Registered mimeTypeListeners takes precedence over the more generic NDEF listener.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- BlackBerry 10\n- Windows Phone 8\n\n\n## nfc.addNdefFormatableListener\n\nRegisters an event listener for formatable NDEF tags.\n\n nfc.addNdefFormatableListener(callback, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __callback__: The callback that is called when NDEF formatable tag is read.\n- __onSuccess__: (Optional) The callback that is called when the listener is added.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.addNdefFormatableListener` registers the callback for ndef-formatable events.\n\nA ndef-formatable event occurs when a tag is read that can be NDEF formatted. This is not fired for tags that are already formatted as NDEF. The ndef-formatable event will not contain an NdefMessage.\n\n### Supported Platforms\n\n- Android\n\n## nfc.write\n\nWrites an NDEF Message to a NFC tag.\n\nA NDEF Message is an array of one or more NDEF Records\n \n var message = [\n ndef.textRecord(\"hello, world\"),\n ndef.uriRecord(\"http://github.com/chariotsolutions/phonegap-nfc\")\n ];\n \n nfc.write(message, [onSuccess], [onFailure]);\n\n### Parameters\n\n- __ndefMessage__: An array of NDEF Records.\n- __onSuccess__: (Optional) The callback that is called when the tag is written.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.write` writes an NdefMessage to a NFC tag.\n\nThis method *must* be called from within an NDEF Event Handler. \n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- Windows Phone 8\n\n## nfc.share\n\nShares an NDEF Message via peer-to-peer.\n\nA NDEF Message is an array of one or more NDEF Records\n\n var message = [\n ndef.textRecord(\"hello, world\")\n ];\n\n nfc.share(message, [onSuccess], [onFailure]);\n \n### Parameters\n\n- __ndefMessage__: An array of NDEF Records.\n- __onSuccess__: (Optional) The callback that is called when the message is pushed.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.share` writes an NdefMessage via peer-to-peer. This should appear as an NFC tag to another device.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- BlackBerry 10\n- Windows Phone 8\n\n### Platform differences\n\n Android - shares message until unshare is called\n BlackBerry 10 - shares the message one time or until unshare is called \n Windows Phone 8 - must be called from within a NFC event handler like nfc.write \n\n## nfc.unshare\n\nStop sharing NDEF data via peer-to-peer.\n\n nfc.unshare([onSuccess], [onFailure]);\n\n### Parameters\n\n- __onSuccess__: (Optional) The callback that is called when sharing stops.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.unshare` stops sharing data via peer-to-peer.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n- BlackBerry 10\n\n## nfc.erase\n\nErase a NDEF tag\n\n nfc.erase([onSuccess], [onFailure]);\n\n### Parameters\n\n- __onSuccess__: (Optional) The callback that is called when sharing stops.\n- __onFailure__: (Optional) The callback that is called if there was an error.\n\n### Description\n\nFunction `nfc.erase` erases a tag by writing an empty message. Will format unformatted tags before writing.\n\nThis method *must* be called from within an NDEF Event Handler.\n\n### Supported Platforms\n\n- Android\n- BlackBerry 7\n\n# NDEF\n\n> The `ndef` object provides NDEF constants, functions for creating NdefRecords, and functions for converting data.\n> See [android.nfc.NdefRecord](http://developer.android.com/reference/android/nfc/NdefRecord.html) for documentation about constants\n\n## NdefMessage\n\nRepresents an NDEF (NFC Data Exchange Format) data message that contains one or more NdefRecords.\nThis plugin uses an array of NdefRecords to represent an NdefMessage.\n\n## NdefRecord\n\nRepresents a logical (unchunked) NDEF (NFC Data Exchange Format) record.\n\n### Properties\n\n- __tnf__: 3-bit TNF (Type Name Format) - use one of the TNF_* constants\n- __type__: byte array, containing zero to 255 bytes, must not be null\n- __id__: byte array, containing zero to 255 bytes, must not be null\n- __payload__: byte array, containing zero to (2 ** 32 - 1) bytes, must not be null\n\nThe `ndef` object has a function for creating NdefRecords\n \n var type = \"text/pg\",\n \tid = [],\n \tpayload = ndef.stringToBytes(\"Hello World\"),\n \trecord = ndef.record(ndef.TNF_MIME_MEDIA, type, id, payload);\n \nThere are also helper functions for some types of records\n\nCreate a URI record\n\n var record = ndef.uriRecord(\"http://chariotsolutions.com\");\n\nCreate a plain text record\n\n var record = ndef.textRecord(\"Plain text message\");\n\nCreate a mime type record\n\n var mimeType = \"text/pg\",\n payload = \"Hello Phongap\",\n record = ndef.mimeMediaRecord(mimeType, nfc.stringToBytes(payload));\n \nCreate an Empty record\n\n var record = ndef.emptyRecord();\n\nSee `ndef.record`, `ndef.textRecord`, `ndef.mimeMediaRecord`, and `ndef.uriRecord`.\n\nThe Ndef object has functions to convert some data types to and from byte arrays. \n\nSee the [phonegap-nfc.js](https://github.com/chariotsolutions/phonegap-nfc/blob/master/www/phonegap-nfc.js) source for more documentation.\n\n# Events\n\nEvents are fired when NFC tags are read. Listeners are added by registering callback functions with the `nfc` object. For example ` nfc.addNdefListener(myNfcListener, win, fail);`\n\n## NfcEvent\n\n### Properties\n\n- __type__: event type \n- __tag__: Ndef tag\n \n### Types\n\n- tag\n- ndef-mime\n- ndef\n- ndef-formatable\n\nThe tag contents are platform dependent.\n\n`id` and `techTypes` may be included when scanning a tag on Android. `serialNumber` may be included on BlackBerry.\n\n`id` and `serialNumber` are different names for the same value. `id` is typically displayed as a hex string `ndef.bytesToHexString(tag.id)`.\n\nWindows Phone 8 and BlackBerry 10 read the NDEF information from a tag, but do not have access to the tag id or other meta data like capacity, read-only status or tag technologies.\n\nAssuming the following NDEF message is written to a tag, it will produce the following events when read.\n\n\tvar ndefMessage = [\n\t\tndef.createMimeRecord('text/pg', 'Hello PhoneGap')\t\t\n\t];\n\n#### Sample Event on Android\n\n\t{\n\t type: 'ndef',\n\t tag: {\n\t \"isWritable\": true,\n\t \"id\": [4, 96, 117, 74, -17, 34, -128],\n\t \"techTypes\": [\"android.nfc.tech.IsoDep\", \"android.nfc.tech.NfcA\", \"android.nfc.tech.Ndef\"],\n\t \"type\": \"NFC Forum Type 4\",\n\t \"canMakeReadOnly\": false,\n\t \"maxSize\": 2046,\n\t \"ndefMessage\": [{\n\t \"id\": [],\n\t \"type\": [116, 101, 120, 116, 47, 112, 103],\n\t \"payload\": [72, 101, 108, 108, 111, 32, 80, 104, 111, 110, 101, 71, 97, 112],\n\t \"tnf\": 2\n\t }]\n\t }\n\t}\n\n#### Sample Event on BlackBerry 7\n\n\t{\n\t type: 'ndef',\n\t tag: {\n\t \"tagType\": \"4\",\n\t \"isLocked\": false,\n\t \"isLockable\": false,\n\t \"freeSpaceSize\": \"2022\",\n\t \"serialNumberLength\": \"7\",\n\t \"serialNumber\": [4, 96, 117, 74, -17, 34, -128],\n\t \"name\": \"Desfire EV1 2K\",\n\t \"ndefMessage\": [{\n\t \"tnf\": 2,\n\t \"type\": [116, 101, 120, 116, 47, 112, 103],\n\t \"id\": [],\n\t \"payload\": [72, 101, 108, 108, 111, 32, 80, 104, 111, 110, 101, 71, 97, 112]\n\t }]\n\t }\n\t}\n\t\n#### Sample Event on BlackBerry 10 or Windows Phone 8\n\n\t{\n\t type: 'ndef',\n\t tag: {\n\t \"ndefMessage\": [{\n\t \"tnf\": 2,\n\t \"type\": [116, 101, 120, 116, 47, 112, 103],\n\t \"id\": [],\n\t \"payload\": [72, 101, 108, 108, 111, 32, 80, 104, 111, 110, 101, 71, 97, 112]\n\t }]\n\t }\n\t}\n\t\n## Getting Details about Events\n\t\nThe raw contents of the scanned tags are written to the log before the event is fired. Use `adb logcat` on Android and Event Log (hold alt + lglg) on BlackBerry. \n\nYou can also log the tag contents in your event handlers. `console.log(JSON.stringify(nfcEvent.tag))` Note that you want to stringify the tag not the event to avoid a circular reference.\n\n# Platform Differences\n\n## Non-NDEF Tags\n\nOnly Android and BlackBerry 7 can read Non-NDEF NFC tags.\n\n## Mifare Classic Tags\n\nBlackBerry 7 and BlackBerry 10 will not read Mifare Classic tags. Mifare Ultralight tags will work since they are NFC Forum Type 2 tags.\n\n## Tag Id and Meta Data\n\nWindows Phone 8 and BlackBerry 10 read the NDEF information from a tag, but do not have access to the tag id or other meta data like capacity, read-only status or tag technologies.\n\n## Multiple Listeners\n\nMultiple listeners can be registered in JavaScript. e.g. addTagDiscoveredListener, addNdefListener, addMimeTypeListener.\n\nOn Android, only the most specific event will fire. If a Mime Media Tag is scanned, only the addMimeTypeListener callback is called.\n\nOn BlackBerry 10, all the events fire if a Mime Media Tag is scanned.\n\n## addTagDiscoveredListener on Android and BlackBerry 7.\n\nOn Android, addTagDiscoveredListener scans non-NDEF tags and NDEF tags. The tag event does NOT contain an ndefMessage even if there are NDEF messages on the tag. Use addNdefListener or addMimeTypeListener to get the NDEF information.\n\nOn BlackBerry 7, addTagDiscoveredListener does NOT scan non-NDEF tags. Webworks returns the ndefMessage in the event.\n\t\n### Non-NDEF tag scanned with addTagDiscoveredListener on *Android*\n\n\t{\n\t type: 'tag',\n\t tag: {\n\t \"id\": [ - 81, 105, -4, 64],\n\t \"techTypes\": [\"android.nfc.tech.MifareClassic\", \"android.nfc.tech.NfcA\", \"android.nfc.tech.NdefFormatable\"]\n\t }\n\t}\n\n### NDEF tag scanned with addTagDiscoveredListener on *Android*\n\n\t{\n\t type: 'tag',\n\t tag: {\n\t \"id\": [4, 96, 117, 74, -17, 34, -128],\n\t \"techTypes\": [\"android.nfc.tech.IsoDep\", \"android.nfc.tech.NfcA\", \"android.nfc.tech.Ndef\"]\n\t }\n\t}\n\t\n\n# Launching your Application when Scanning a Tag\n\n On Android, intents can be used to launch your application when a NFC tag is read. This is optional and configured in AndroidManifest.xml.\n\n <intent-filter>\n <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n <data android:mimeType=\"text/pg\" />\n <category android:name=\"android.intent.category.DEFAULT\" />\n </intent-filter>\n \nNote: `data android:mimeType=\"text/pg\"` should match the data type you specified in JavaScript\n\n We have found it necessary to add `android:noHistory=\"true\"` to the activity element so that scanning a tag launches the application after the user has pressed the home button.\n\n\nSample Projects\n================\n\n- [NFC Reader](https://github.com/don/phonegap-nfc-reader)\n- [NFC Writer](https://github.com/don/phonegap-nfc-writer)\n- [NFC Peer to Peer](https://github.com/don/phonegap-p2p)\n- [Rock Paper Scissors](https://github.com/don/rockpaperscissors)\n\nLicense\n================\n\nThe MIT License\n\nCopyright (c) 2011-2012 Chariot Solutions\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies 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,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","maintainers":[{"name":"don","email":"don.coleman@gmail.com"}],"time":{"modified":"2013-11-08T02:19:36.599Z","created":"2013-08-05T01:29:12.067Z","0.4.5":"2013-08-05T01:29:13.178Z","0.4.6":"2013-10-29T21:21:08.867Z","0.4.7":"2013-11-08T02:19:36.599Z"},"_attachments":{"com.chariotsolutions.nfc.plugin-0.4.7.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-KBPd3oAGE0aP1cnsS6DaGQ==","length":91785,"stub":true},"com.chariotsolutions.nfc.plugin-0.4.6.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-EF+iB5JQ4ECl5DB0NaWD7g==","length":92681,"stub":true},"com.chariotsolutions.nfc.plugin-0.4.5.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-g044HDkEh1/qwQaJdXmjNQ==","length":90593,"stub":true}}}},
{"id":"com.chariotsolutions.toast.plugin","key":"com.chariotsolutions.toast.plugin","value":{"rev":"5-d9e67740ad9bd86c0333a27788555779"},"doc":{"_id":"com.chariotsolutions.toast.plugin","_rev":"5-d9e67740ad9bd86c0333a27788555779","name":"com.chariotsolutions.toast.plugin","description":"Toasty - PhoneGap Toast Notification Plugin ===========================================","dist-tags":{"latest":"1.1.1"},"versions":{"1.1.0":{"version":"1.1.0","name":"com.chariotsolutions.toast.plugin","cordova_name":"Toasty","engines":[{"name":"cordova","version":">=2.8.0"}],"readme":"Toasty - PhoneGap Toast Notification Plugin\n===========================================\n\nShows an Android Toast Notification\n\n* toast.showShort(message);\n* toast.showLong(message);\n\nCancel an Android Toast Notification\n\n* toast.cancel();\n\nSupported Platforms\n--------------------\n* Android\n\nAdding Toasty to your project\n------------------------------\n\nThese instructions assume your project is using PhoneGap-2.8+\n\n $ plugman --platform android --project /path/to/your/project --plugin /path/to/toasty\n \nor if you're using cordova-cli\n\n $ cordova plugin install /path/to/toasty\n\nOnce the the plugin is installed, toast will be available on the document object. There is no need to modify your javascript imports.\n \n toast.showLong(\"hello, world\");\n","readmeFilename":"README.md","description":"Toasty - PhoneGap Toast Notification Plugin ===========================================","_id":"com.chariotsolutions.toast.plugin@1.1.0","dist":{"shasum":"c6f682a6023e753897add033b459b5462708f754","tarball":"http://registry.cordova.io/com.chariotsolutions.toast.plugin/-/com.chariotsolutions.toast.plugin-1.1.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"don","email":"don.coleman@gmail.com"},"maintainers":[{"name":"don","email":"don.coleman@gmail.com"}]},"1.1.1":{"version":"1.1.1","name":"com.chariotsolutions.toast.plugin","cordova_name":"Toasty","engines":[],"readme":"Toasty - PhoneGap Toast Notification Plugin\n===========================================\n\nShows an Android Toast Notification\n\n* toast.showShort(message);\n* toast.showLong(message);\n\nCancel an Android Toast Notification\n\n* toast.cancel();\n\nSupported Platforms\n--------------------\n* Android\n\nAdding Toasty to your project\n------------------------------\n\nThese instructions assume your project is using PhoneGap-2.8+\n\n $ plugman --platform android --project /path/to/your/project --plugin /path/to/toasty\n \nor if you're using cordova-cli\n\n $ cordova plugin install /path/to/toasty\n\nOnce the the plugin is installed, toast will be available on the document object. There is no need to modify your javascript imports.\n \n toast.showLong(\"hello, world\");\n","readmeFilename":"README.md","description":"Toasty - PhoneGap Toast Notification Plugin ===========================================","_id":"com.chariotsolutions.toast.plugin@1.1.1","dist":{"shasum":"f54e5808e71318a10460c1f72d6ea9091422fa8b","tarball":"http://registry.cordova.io/com.chariotsolutions.toast.plugin/-/com.chariotsolutions.toast.plugin-1.1.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"don","email":"don.coleman@gmail.com"},"maintainers":[{"name":"don","email":"don.coleman@gmail.com"}]}},"readme":"Toasty - PhoneGap Toast Notification Plugin\n===========================================\n\nShows an Android Toast Notification\n\n* toast.showShort(message);\n* toast.showLong(message);\n\nCancel an Android Toast Notification\n\n* toast.cancel();\n\nSupported Platforms\n--------------------\n* Android\n\nAdding Toasty to your project\n------------------------------\n\nThese instructions assume your project is using PhoneGap-2.8+\n\n $ plugman --platform android --project /path/to/your/project --plugin /path/to/toasty\n \nor if you're using cordova-cli\n\n $ cordova plugin install /path/to/toasty\n\nOnce the the plugin is installed, toast will be available on the document object. There is no need to modify your javascript imports.\n \n toast.showLong(\"hello, world\");\n","maintainers":[{"name":"don","email":"don.coleman@gmail.com"}],"time":{"modified":"2013-11-08T02:40:13.169Z","created":"2013-11-08T02:39:38.869Z","1.1.0":"2013-11-08T02:39:39.884Z","1.1.1":"2013-11-08T02:40:13.169Z"},"_attachments":{"com.chariotsolutions.toast.plugin-1.1.1.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-KuHrT1FhAv9QEbBPZ38g5A==","length":2781,"stub":true},"com.chariotsolutions.toast.plugin-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-XrpmsP8l7g/qYwfjbiK1rw==","length":2965,"stub":true}}}},
{"id":"com.cmpsoft.mobile.button","key":"com.cmpsoft.mobile.button","value":{"rev":"3-1c2d7a62af46f9f9ad878f5e0bd951fd"},"doc":{"_id":"com.cmpsoft.mobile.button","_rev":"3-1c2d7a62af46f9f9ad878f5e0bd951fd","name":"com.cmpsoft.mobile.button","description":"Button plugin description","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.2":{"version":"1.0.2","name":"com.cmpsoft.mobile.button","cordova_name":"Button","description":"Button plugin description","license":"Apache 2.0","keywords":["cmpsoft","button"],"engines":[],"readme":"ERROR: No README data found!","_id":"com.cmpsoft.mobile.button@1.0.2","dist":{"shasum":"e69f2d568b831529358f04f71b9620d1b6ca74f0","tarball":"http://registry.cordova.io/com.cmpsoft.mobile.button/-/com.cmpsoft.mobile.button-1.0.2.tgz"},"_from":"C:\\Users\\qp\\Desktop\\com.cmpsoft.mobile.plugin","_npmVersion":"1.3.4","_npmUser":{"name":"cmpsoft","email":"1@1.cn"},"maintainers":[{"name":"cmpsoft","email":"1@1.cn"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"cmpsoft","email":"1@1.cn"}],"time":{"modified":"2013-11-07T07:02:36.240Z","created":"2013-11-07T07:02:22.220Z","1.0.2":"2013-11-07T07:02:36.240Z"},"_attachments":{"com.cmpsoft.mobile.button-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-TmYlMufxezcCcaVcAFwSKw==","length":1465,"stub":true}}}},
{"id":"com.cmpsoft.mobile.plugin.download","key":"com.cmpsoft.mobile.plugin.download","value":{"rev":"3-7c68fb4457c72d2fa3814a24f01367e1"},"doc":{"_id":"com.cmpsoft.mobile.plugin.download","_rev":"3-7c68fb4457c72d2fa3814a24f01367e1","name":"com.cmpsoft.mobile.plugin.download","description":"download plugin description","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.cmpsoft.mobile.plugin.download","cordova_name":"download","description":"download plugin description","license":"Apache 2.0","keywords":["cmpsoft","download"],"engines":[],"readme":"ERROR: No README data found!","_id":"com.cmpsoft.mobile.plugin.download@1.0.0","dist":{"shasum":"6d7adb6264e1806e46b0c5838051a37ba9047e6c","tarball":"http://registry.cordova.io/com.cmpsoft.mobile.plugin.download/-/com.cmpsoft.mobile.plugin.download-1.0.0.tgz"},"_from":"C:\\Users\\Administrator\\Desktop\\com.cmpsoft.mobile.plugin.download","_npmVersion":"1.3.4","_npmUser":{"name":"cmpsoft","email":"daibin@cmpsoft.cn"},"maintainers":[{"name":"cmpsoft","email":"daibin@cmpsoft.cn"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"cmpsoft","email":"daibin@cmpsoft.cn"}],"time":{"modified":"2013-11-19T10:48:48.364Z","created":"2013-11-19T10:48:46.261Z","1.0.0":"2013-11-19T10:48:48.364Z"},"_attachments":{"com.cmpsoft.mobile.plugin.download-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-HATlOdz6b1PO4AqVGAbTTg==","length":4861,"stub":true}}}},
{"id":"com.cmpsoft.mobile.plugin.exitapp","key":"com.cmpsoft.mobile.plugin.exitapp","value":{"rev":"3-1d712332dc1409f17e8fd6de9e830291"},"doc":{"_id":"com.cmpsoft.mobile.plugin.exitapp","_rev":"3-1d712332dc1409f17e8fd6de9e830291","name":"com.cmpsoft.mobile.plugin.exitapp","description":"ExitApp plugin description","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.cmpsoft.mobile.plugin.exitapp","cordova_name":"ExitApp","description":"ExitApp plugin description","license":"Apache 2.0","keywords":["cmpsoft","ExitApp"],"engines":[],"readme":"ERROR: No README data found!","_id":"com.cmpsoft.mobile.plugin.exitapp@1.0.0","dist":{"shasum":"f0559cc99802a411a8759064024fd629de9bcf08","tarball":"http://registry.cordova.io/com.cmpsoft.mobile.plugin.exitapp/-/com.cmpsoft.mobile.plugin.exitapp-1.0.0.tgz"},"_from":"C:\\Users\\Administrator\\Desktop\\com.cmpsoft.mobile.plugin.exitapp","_npmVersion":"1.3.4","_npmUser":{"name":"cmpsoft","email":"daibin@cmpsoft.cn"},"maintainers":[{"name":"cmpsoft","email":"daibin@cmpsoft.cn"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"cmpsoft","email":"daibin@cmpsoft.cn"}],"time":{"modified":"2013-11-19T10:49:19.633Z","created":"2013-11-19T10:49:04.011Z","1.0.0":"2013-11-19T10:49:19.633Z"},"_attachments":{"com.cmpsoft.mobile.plugin.exitapp-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-HzggdQrBPaDpMmeWLmX/Bg==","length":972,"stub":true}}}},
{"id":"com.cmpsoft.mobile.plugin.localnotification","key":"com.cmpsoft.mobile.plugin.localnotification","value":{"rev":"3-f683d8b8800fbece703017d2f57f6527"},"doc":{"_id":"com.cmpsoft.mobile.plugin.localnotification","_rev":"3-f683d8b8800fbece703017d2f57f6527","name":"com.cmpsoft.mobile.plugin.localnotification","description":"localnotification plugin description","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.cmpsoft.mobile.plugin.localnotification","cordova_name":"localnotification","description":"localnotification plugin description","license":"Apache 2.0","keywords":["cmpsoft","localnotification"],"engines":[],"readme":"ERROR: No README data found!","_id":"com.cmpsoft.mobile.plugin.localnotification@1.0.0","dist":{"shasum":"b7dc1630a2c20ca071548514c0eb5033b0aba031","tarball":"http://registry.cordova.io/com.cmpsoft.mobile.plugin.localnotification/-/com.cmpsoft.mobile.plugin.localnotification-1.0.0.tgz"},"_from":"C:\\Users\\Administrator\\Desktop\\com.cmpsoft.mobile.plugin.localnotification","_npmVersion":"1.3.4","_npmUser":{"name":"cmpsoft","email":"daibin@cmpsoft.cn"},"maintainers":[{"name":"cmpsoft","email":"daibin@cmpsoft.cn"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"cmpsoft","email":"daibin@cmpsoft.cn"}],"time":{"modified":"2013-11-28T07:00:49.250Z","created":"2013-11-28T07:00:15.810Z","1.0.0":"2013-11-28T07:00:49.250Z"},"_attachments":{"com.cmpsoft.mobile.plugin.localnotification-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-Ms4MWYEIlPib56tEK0GT3w==","length":8128,"stub":true}}}},
{"id":"com.cmpsoft.mobile.plugin.pushnotification","key":"com.cmpsoft.mobile.plugin.pushnotification","value":{"rev":"3-82f939c7984a3d768cea8d5b7d91511c"},"doc":{"_id":"com.cmpsoft.mobile.plugin.pushnotification","_rev":"3-82f939c7984a3d768cea8d5b7d91511c","name":"com.cmpsoft.mobile.plugin.pushnotification","description":"pushNotification plugin description","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.cmpsoft.mobile.plugin.pushnotification","cordova_name":"PushNotification","description":"pushNotification plugin description","license":"Apache 2.0","keywords":["cmpsoft"," pushnotification"],"engines":[],"readme":"ERROR: No README data found!","_id":"com.cmpsoft.mobile.plugin.pushnotification@1.0.0","dist":{"shasum":"7aebec31df54b06b52a3d2e4e56dcb80e04fe4f1","tarball":"http://registry.cordova.io/com.cmpsoft.mobile.plugin.pushnotification/-/com.cmpsoft.mobile.plugin.pushnotification-1.0.0.tgz"},"_from":"C:\\Users\\Administrator\\Desktop\\com.cmpsoft.mobile.plugin.pushnotification","_npmVersion":"1.3.4","_npmUser":{"name":"cmpsoft","email":"daibin@cmpsoft.cn"},"maintainers":[{"name":"cmpsoft","email":"daibin@cmpsoft.cn"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"cmpsoft","email":"daibin@cmpsoft.cn"}],"time":{"modified":"2013-12-13T01:53:17.420Z","created":"2013-12-13T01:53:10.865Z","1.0.0":"2013-12-13T01:53:17.420Z"},"_attachments":{"com.cmpsoft.mobile.plugin.pushnotification-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-kv/13dXi2t18awBpqqR64w==","length":208313,"stub":true}}}},
{"id":"com.contraterrene.gapfile","key":"com.contraterrene.gapfile","value":{"rev":"3-4ac89c24720e20d7c4524085a32ea369"},"doc":{"_id":"com.contraterrene.gapfile","_rev":"3-4ac89c24720e20d7c4524085a32ea369","name":"com.contraterrene.gapfile","description":"GapFile provides a set of convenience wrapper functions for the Cordova file API.","dist-tags":{"latest":"1.1.0"},"versions":{"1.1.0":{"version":"1.1.0","name":"com.contraterrene.gapfile","cordova_name":"GapFile","description":"GapFile provides a set of convenience wrapper functions for the Cordova file API.","license":"Apache 2.0 License","keywords":["file","read"," write"," append","directory"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"GapFile\n=======\n\nGapFile is a set of convenience wrapper functions for the file API in PhoneGap/Apache Cordova. It lets you use single (and simple) function calls for file reads, writes, directory listings, etc. avoiding the callback hell. The downside is that the error reporting is less fine-grained (you'll basically just get a single error callback if anything goes wrong in the callback ball of snakes).\n\nGapFile was written by [Tony Hursh](http://people.phonegap.com/developer/anthony-hursh/). I'm currently available for remote contract work.\n\n## Recent (significant) changes\n\nRepackaged as 3.0-compatible plugin.\n\nThe gapFile object has been renamed GapFile to be more consistent with other plugins.\n\nAs a convenience, GapFile.writeFile now calls the success callback with the file's URL as a parameter (e.g., writing /test.txt will send file://(some horrifically ugly platform-dependent path)/test.txt to the success callback).\n\n## Files included\n\n* gapfile.js -- the JavaScript object that implements all GapFile functions.\n* index.html -- a basic PhoneGap index.html for testing gapfile.js.\n* README.md -- this document.\n* NOTICE -- Apache 2.0 license information (the same as PhoneGap/Cordova itself).\n* plugin.xml -- For PhoneGap/Cordova 3.0 and above.\n\n\n## Usage\n\nIf you are using Cordova/PhoneGap 3.0 or above, you can install this with:\n\ncordova plugin add https://github.com/tonyhursh/gapfile.git\n\nRemove with:\n\ncordova plugin remove com.contraterrene.GapFile\n\nYou will also need the base Cordova File plugin:\n\ncordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-file.git\n\nIf you want to run the test index file (and probably for your own stuff) you'll need:\n\ncordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-device.git\n\nso that the deviceready event fires correctly.\n\nIf you are using an earlier version, just add the www/gapfile.js file to your project and include the script in your index.html file. Also, earlier versions will typically need to have file access enabled in the configuration file(s) for the project. See the documentation for your particular device/version of PhoneGap.\n\n##Potential gotchas\n\n* This was originally written for Phonegap/Cordova 2.7.0, but the current version has not been tested with it (it should still work, though). The current version has been tested with 3.0.x. \n* Not all devices support access to the file system (at least through PhoneGap), though most of the \"majors\" do.\n* Not all devices use the same directory structure. iOS creates a separate and isolated root directory for each app (which can be accessed at /), while Android wants you to write in the /sdcard/ directory. I speculate that the other platforms that support file I/O (BlackBerry, Windows Phone x.x, etc.) also vary in this respect, but I don't own any of them and have been unable to test it. Reports welcome -- if you can tell me the location of the logical and permitted place for users to write files on your platform, I'll add it to the docs and the test code.\n* As can perhaps be inferred from the previous point, the code *has not been tested on anything other than iOS and Android*. It's been tested on iPhone (6 and 7), iPad (6 and 7), and a couple of Android devices (a cheap Huawei Ideos phone and an Amazon Kindle Fire). However, if the PhoneGap File API is fully implemented for your device, GapFile should also work (presuming you set the proper folder -- see previous point). There is no native code in the plugin. Please file a bug report if you run across any exceptions.\n* If you want to transfer files via iTunes on iOS, you'll also need to set \"Application supports iTunes file sharing\" to \"YES\" in your (appname)-Info.plist file (under the yellow Resources folder in Xcode).\n\n##Running the tests\n\nCreate a new PhoneGap/Cordova project, install the plugins (or manually add gapfile.js and enable file access in the config for pre-3.0 versions), and replace the generated index.html with the index.html from this project. Build and run as normal. You may want to test the error handling by (e.g.) writing a file, deleting it, then attempting to read it. \n\n##Public API\n\nBelow are GapFile's public API functions with a brief summary of their use. See index.html for example usage.\n\nUnless an extremely good reason presents itself, these should remain stable in any future versions of GapFile.\n\n**GapFile.writeFile(fullpath, data, success, fail)**\n\nWrite data to a file.\n\nParameters: \n\n *fullpath*: full path including file name (if no path portion is given, assumes /).\n\n\tExamples: test.txt /test.txt /some/folder/test.txt\n\n *data*: the data to write.\n\n *success*: callback function on successful write. Called with the file URL as the sole parameter. \n\n *fail*: callback function if error occurs.\n\n\n**GapFile.appendFile(fullpath, data, success, fail)**\n\nIdentical to writeFile, except appends the data to an existing file.\n\n\n**GapFile.readFile(fullpath, asText, success, fail)**\n\nRead data from a file.\n\nParameters: \n\n *fullpath*: full path including file name (if no path portion is given, assumes /).\n\n Examples: test.txt /test.txt /some/folder/test.txt \n\n *asText*: boolean specifying whether to read as text or a data URI. If true, calls success with the text as the parameter. If false, calls success with the data URI as the parameter.\n\n *success*: callback function on successful read.\n\n *fail*: callback function if error occurs.\n\n\n**GapFile.deleteFile(fullpath, success, fail)**\n\nDelete a file.\n\nParameters: \n\n *fullpath*: full path of file to delete, including file name (if no path portion is given, assumes /).\n\n Examples: test.txt /test.txt /some/folder/test.txt \n\n *success*: callback function on successful delete.\n\n *fail*: callback function if error occurs.\n\n\n**GapFile.readDirectory(dirname, success, fail)**\n\nGet a list of the files in a directory.\n\nParameters:\n\n *dirname*: full path to directory\n\n *success*: callback function, called with an array of file names from the directory.\n\n *fail*: callback function if error occurs.\n\n\n**GapFile.mkDirectory(dirName, success, fail)**\n\nCreate a subdirectory.\n\nParameters: \n\n *dirName*: full path to directory\n\n *success*: callback function for successful create.\n\n *fail*: callback function if error occurs.\n\n\n**GapFile.rmDirectory(dirName, success, fail)**\n\nDelete a subdirectory.\n\nParameters: \n *dirName*: full path to directory\n\n *success*: callback function for successful delete.\n\n *fail*: callback function if error occurs.\n\n\n**GapFile.fileExists(fullpath, callback, fail)**\n\nCheck for file existence.\n\nParameters:\n\n *fullpath*: full path of name to check\n\n *success*: called with true if file is found, false if file is not found.\n\n *fail*: callback function if error occurs.\n\n","readmeFilename":"README.md","_id":"com.contraterrene.gapfile@1.1.0","dist":{"shasum":"074b6aa5f3969401567ab4f0e483ad2d5c16bb12","tarball":"http://registry.cordova.io/com.contraterrene.gapfile/-/com.contraterrene.gapfile-1.1.0.tgz"},"_from":"/Users/tonyhursh/gits/gapfile","_npmVersion":"1.3.4","_npmUser":{"name":"tony.hursh","email":"tony.hursh@gmail.com"},"maintainers":[{"name":"tony.hursh","email":"tony.hursh@gmail.com"}]}},"readme":"GapFile\n=======\n\nGapFile is a set of convenience wrapper functions for the file API in PhoneGap/Apache Cordova. It lets you use single (and simple) function calls for file reads, writes, directory listings, etc. avoiding the callback hell. The downside is that the error reporting is less fine-grained (you'll basically just get a single error callback if anything goes wrong in the callback ball of snakes).\n\nGapFile was written by [Tony Hursh](http://people.phonegap.com/developer/anthony-hursh/). I'm currently available for remote contract work.\n\n## Recent (significant) changes\n\nRepackaged as 3.0-compatible plugin.\n\nThe gapFile object has been renamed GapFile to be more consistent with other plugins.\n\nAs a convenience, GapFile.writeFile now calls the success callback with the file's URL as a parameter (e.g., writing /test.txt will send file://(some horrifically ugly platform-dependent path)/test.txt to the success callback).\n\n## Files included\n\n* gapfile.js -- the JavaScript object that implements all GapFile functions.\n* index.html -- a basic PhoneGap index.html for testing gapfile.js.\n* README.md -- this document.\n* NOTICE -- Apache 2.0 license information (the same as PhoneGap/Cordova itself).\n* plugin.xml -- For PhoneGap/Cordova 3.0 and above.\n\n\n## Usage\n\nIf you are using Cordova/PhoneGap 3.0 or above, you can install this with:\n\ncordova plugin add https://github.com/tonyhursh/gapfile.git\n\nRemove with:\n\ncordova plugin remove com.contraterrene.GapFile\n\nYou will also need the base Cordova File plugin:\n\ncordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-file.git\n\nIf you want to run the test index file (and probably for your own stuff) you'll need:\n\ncordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-device.git\n\nso that the deviceready event fires correctly.\n\nIf you are using an earlier version, just add the www/gapfile.js file to your project and include the script in your index.html file. Also, earlier versions will typically need to have file access enabled in the configuration file(s) for the project. See the documentation for your particular device/version of PhoneGap.\n\n##Potential gotchas\n\n* This was originally written for Phonegap/Cordova 2.7.0, but the current version has not been tested with it (it should still work, though). The current version has been tested with 3.0.x. \n* Not all devices support access to the file system (at least through PhoneGap), though most of the \"majors\" do.\n* Not all devices use the same directory structure. iOS creates a separate and isolated root directory for each app (which can be accessed at /), while Android wants you to write in the /sdcard/ directory. I speculate that the other platforms that support file I/O (BlackBerry, Windows Phone x.x, etc.) also vary in this respect, but I don't own any of them and have been unable to test it. Reports welcome -- if you can tell me the location of the logical and permitted place for users to write files on your platform, I'll add it to the docs and the test code.\n* As can perhaps be inferred from the previous point, the code *has not been tested on anything other than iOS and Android*. It's been tested on iPhone (6 and 7), iPad (6 and 7), and a couple of Android devices (a cheap Huawei Ideos phone and an Amazon Kindle Fire). However, if the PhoneGap File API is fully implemented for your device, GapFile should also work (presuming you set the proper folder -- see previous point). There is no native code in the plugin. Please file a bug report if you run across any exceptions.\n* If you want to transfer files via iTunes on iOS, you'll also need to set \"Application supports iTunes file sharing\" to \"YES\" in your (appname)-Info.plist file (under the yellow Resources folder in Xcode).\n\n##Running the tests\n\nCreate a new PhoneGap/Cordova project, install the plugins (or manually add gapfile.js and enable file access in the config for pre-3.0 versions), and replace the generated index.html with the index.html from this project. Build and run as normal. You may want to test the error handling by (e.g.) writing a file, deleting it, then attempting to read it. \n\n##Public API\n\nBelow are GapFile's public API functions with a brief summary of their use. See index.html for example usage.\n\nUnless an extremely good reason presents itself, these should remain stable in any future versions of GapFile.\n\n**GapFile.writeFile(fullpath, data, success, fail)**\n\nWrite data to a file.\n\nParameters: \n\n *fullpath*: full path including file name (if no path portion is given, assumes /).\n\n\tExamples: test.txt /test.txt /some/folder/test.txt\n\n *data*: the data to write.\n\n *success*: callback function on successful write. Called with the file URL as the sole parameter. \n\n *fail*: callback function if error occurs.\n\n\n**GapFile.appendFile(fullpath, data, success, fail)**\n\nIdentical to writeFile, except appends the data to an existing file.\n\n\n**GapFile.readFile(fullpath, asText, success, fail)**\n\nRead data from a file.\n\nParameters: \n\n *fullpath*: full path including file name (if no path portion is given, assumes /).\n\n Examples: test.txt /test.txt /some/folder/test.txt \n\n *asText*: boolean specifying whether to read as text or a data URI. If true, calls success with the text as the parameter. If false, calls success with the data URI as the parameter.\n\n *success*: callback function on successful read.\n\n *fail*: callback function if error occurs.\n\n\n**GapFile.deleteFile(fullpath, success, fail)**\n\nDelete a file.\n\nParameters: \n\n *fullpath*: full path of file to delete, including file name (if no path portion is given, assumes /).\n\n Examples: test.txt /test.txt /some/folder/test.txt \n\n *success*: callback function on successful delete.\n\n *fail*: callback function if error occurs.\n\n\n**GapFile.readDirectory(dirname, success, fail)**\n\nGet a list of the files in a directory.\n\nParameters:\n\n *dirname*: full path to directory\n\n *success*: callback function, called with an array of file names from the directory.\n\n *fail*: callback function if error occurs.\n\n\n**GapFile.mkDirectory(dirName, success, fail)**\n\nCreate a subdirectory.\n\nParameters: \n\n *dirName*: full path to directory\n\n *success*: callback function for successful create.\n\n *fail*: callback function if error occurs.\n\n\n**GapFile.rmDirectory(dirName, success, fail)**\n\nDelete a subdirectory.\n\nParameters: \n *dirName*: full path to directory\n\n *success*: callback function for successful delete.\n\n *fail*: callback function if error occurs.\n\n\n**GapFile.fileExists(fullpath, callback, fail)**\n\nCheck for file existence.\n\nParameters:\n\n *fullpath*: full path of name to check\n\n *success*: called with true if file is found, false if file is not found.\n\n *fail*: callback function if error occurs.\n\n","maintainers":[{"name":"tony.hursh","email":"tony.hursh@gmail.com"}],"time":{"modified":"2013-10-31T17:43:16.765Z","created":"2013-10-31T17:43:15.863Z","1.1.0":"2013-10-31T17:43:16.765Z"},"_attachments":{"com.contraterrene.gapfile-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-8ne2SpxDA4eZbrvOs0tgcw==","length":6096,"stub":true}}}},
{"id":"com.couchbase.lite.phonegap","key":"com.couchbase.lite.phonegap","value":{"rev":"3-1a33971d4fc8b3fe31876fa50a3aef77"},"doc":{"_id":"com.couchbase.lite.phonegap","_rev":"3-1a33971d4fc8b3fe31876fa50a3aef77","name":"com.couchbase.lite.phonegap","description":"Install Couchbase Lite in your app to enable JSON sync.","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"version":"0.2.0","name":"com.couchbase.lite.phonegap","cordova_name":"Couchbase Lite","description":"Install Couchbase Lite in your app to enable JSON sync.","license":"Apache 2.0","engines":[{"name":"cordova","version":"3.0.0"}],"readme":"# PhoneGap plugin for Couchbase Lite\n\nCouchbase Lite is an embedded JSON database for occasionally connected devices. It syncs data in the background, so users can collaborate across devices. There is an [event based `_changes` JSON feed API](http://guide.couchdb.org/draft/notifications.html) so you can drive data-binding UI frameworks like Sencha and Backbone to reflect remote updates interactively.\n\nIt works with native code as well as Cordova / PhoneGap on iOS and Android (you can even sync with Mac desktops), so it doesn't matter where your users are, they can work with the data, and as soon as they get back online, everyone will see their changes.\n\nIf you wanna know everything about the PhoneGap plugin system the [best docs right now are on Raymond Camden's blog](http://www.raymondcamden.com/index.cfm/2013/7/19/PhoneGap-30-Released--Things-You-Should-Know)\n\n## Quick start\n\nYou install LiteGap into your PhoneGap app using [the PhoneGap command line tools](https://github.com/mwbrooks/phonegap-cli/) and this command (where `$PLATFORM` is either `ios` or `android`):\n\n```\nnpm install -g phonegap\nphonegap create MyPhoneGapApp \ncd MyPhoneGapApp/\nphonegap local plugin add https://github.com/couchbaselabs/Couchbase-Lite-PhoneGap-Plugin.git\nphonegap run $PLATFORM\n```\n\nCongrats, you got to hello world. If you want to get awesome, do this:\n\n```\nrm -rf www\ngit clone https://github.com/couchbaselabs/TodoLite-PhoneGap www\nphonegap run $PLATFORM\n```\n\nYou should see a cool todo app in your simulator or device.\n\nSo far LiteGap has only been tested with PhoneGap 2.9 and 3.0 apps. (ARC-enabled on iOS 6, and Android API level 11+) If you want to send pull requests, please modify [the code in this repo.](https://github.com/couchbaselabs/couchbase-lite-phonegap-plugin-builder)\n\n## Architecture\n\nThis is where LiteGap fits in the picture:\n\n![architecture.png](http://cl.ly/image/3b15030Y3f0q/couchbase-lite-phonegap-plugin-android.png)\n\n_Note:_ your JavaScript code can also directly communicate with Couchbase Lite over a Javascript<->Native bridge, to [ask it what URL it has launched on for subsequent XHR access](https://github.com/couchbaselabs/LiteGap/blob/master/www/litegap-example.html)\n\n_Note:_ Couchbase-Lite is capable of syncing with Couchbase Server or Apache CouchDB databases running in the cloud, as [shown here](https://github.com/couchbase/couchbase-lite-android)\n\n# Where to go from here\n\nThere's an [example chat app with PhoneGap](https://github.com/couchbaselabs/CouchChat-PhoneGap) that illustrates the channel sync API. You can [read more about the app here](https://github.com/couchbaselabs/CouchChat-PhoneGap).\n\nIf you made it this far, you are now ready to build your custom PhoneGap App by editing the HTML, CSS, and Javascript files under the www directory. Your same application code will work on both the iOS and Android platforms!\n\nYou might want to start with this [API reference](https://github.com/couchbase/couchbase-lite-ios/wiki/Guide%3A-REST) and this [API cheat sheet.](http://docs.couchdb.org/en/latest/api/reference.html) (For REST we use a 90% similar API as Apache CouchDB -- we'll have docs of our exact API in the next few months.)\n","readmeFilename":"README.md","_id":"com.couchbase.lite.phonegap@0.2.0","dist":{"shasum":"039531b7dcd9dd8dd4e68c2dff0f15c56865b4f5","tarball":"http://registry.cordova.io/com.couchbase.lite.phonegap/-/com.couchbase.lite.phonegap-0.2.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"jchris","email":"jchris@couchbase.com"},"maintainers":[{"name":"jchris","email":"jchris@couchbase.com"}]}},"readme":"# PhoneGap plugin for Couchbase Lite\n\nCouchbase Lite is an embedded JSON database for occasionally connected devices. It syncs data in the background, so users can collaborate across devices. There is an [event based `_changes` JSON feed API](http://guide.couchdb.org/draft/notifications.html) so you can drive data-binding UI frameworks like Sencha and Backbone to reflect remote updates interactively.\n\nIt works with native code as well as Cordova / PhoneGap on iOS and Android (you can even sync with Mac desktops), so it doesn't matter where your users are, they can work with the data, and as soon as they get back online, everyone will see their changes.\n\nIf you wanna know everything about the PhoneGap plugin system the [best docs right now are on Raymond Camden's blog](http://www.raymondcamden.com/index.cfm/2013/7/19/PhoneGap-30-Released--Things-You-Should-Know)\n\n## Quick start\n\nYou install LiteGap into your PhoneGap app using [the PhoneGap command line tools](https://github.com/mwbrooks/phonegap-cli/) and this command (where `$PLATFORM` is either `ios` or `android`):\n\n```\nnpm install -g phonegap\nphonegap create MyPhoneGapApp \ncd MyPhoneGapApp/\nphonegap local plugin add https://github.com/couchbaselabs/Couchbase-Lite-PhoneGap-Plugin.git\nphonegap run $PLATFORM\n```\n\nCongrats, you got to hello world. If you want to get awesome, do this:\n\n```\nrm -rf www\ngit clone https://github.com/couchbaselabs/TodoLite-PhoneGap www\nphonegap run $PLATFORM\n```\n\nYou should see a cool todo app in your simulator or device.\n\nSo far LiteGap has only been tested with PhoneGap 2.9 and 3.0 apps. (ARC-enabled on iOS 6, and Android API level 11+) If you want to send pull requests, please modify [the code in this repo.](https://github.com/couchbaselabs/couchbase-lite-phonegap-plugin-builder)\n\n## Architecture\n\nThis is where LiteGap fits in the picture:\n\n![architecture.png](http://cl.ly/image/3b15030Y3f0q/couchbase-lite-phonegap-plugin-android.png)\n\n_Note:_ your JavaScript code can also directly communicate with Couchbase Lite over a Javascript<->Native bridge, to [ask it what URL it has launched on for subsequent XHR access](https://github.com/couchbaselabs/LiteGap/blob/master/www/litegap-example.html)\n\n_Note:_ Couchbase-Lite is capable of syncing with Couchbase Server or Apache CouchDB databases running in the cloud, as [shown here](https://github.com/couchbase/couchbase-lite-android)\n\n# Where to go from here\n\nThere's an [example chat app with PhoneGap](https://github.com/couchbaselabs/CouchChat-PhoneGap) that illustrates the channel sync API. You can [read more about the app here](https://github.com/couchbaselabs/CouchChat-PhoneGap).\n\nIf you made it this far, you are now ready to build your custom PhoneGap App by editing the HTML, CSS, and Javascript files under the www directory. Your same application code will work on both the iOS and Android platforms!\n\nYou might want to start with this [API reference](https://github.com/couchbase/couchbase-lite-ios/wiki/Guide%3A-REST) and this [API cheat sheet.](http://docs.couchdb.org/en/latest/api/reference.html) (For REST we use a 90% similar API as Apache CouchDB -- we'll have docs of our exact API in the next few months.)\n","maintainers":[{"name":"jchris","email":"jchris@couchbase.com"}],"time":{"modified":"2013-09-05T20:51:23.812Z","created":"2013-09-05T20:50:31.245Z","0.2.0":"2013-09-05T20:51:23.812Z"},"_attachments":{"com.couchbase.lite.phonegap-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-Lem9SaNTwPP6YiXA0k35JQ==","length":13320107,"stub":true}}}},
{"id":"com.danielcwilson.plugins.googleanalytics","key":"com.danielcwilson.plugins.googleanalytics","value":{"rev":"3-d2a9c65bd3d30d51b1aca885a0f9970e"},"doc":{"_id":"com.danielcwilson.plugins.googleanalytics","_rev":"3-d2a9c65bd3d30d51b1aca885a0f9970e","name":"com.danielcwilson.plugins.googleanalytics","description":"Cordova (PhoneGap) Plugin to connect to the native Google's Universal Analytics SDK 3.0","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.2":{"version":"0.1.2","name":"com.danielcwilson.plugins.googleanalytics","cordova_name":"Google Universal Analytics Plugin","description":"Cordova (PhoneGap) Plugin to connect to the native Google's Universal Analytics SDK 3.0","license":"MIT License","engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"google-analytics-plugin\r\n=======================\r\n\r\nCordova (PhoneGap) 3.0+ Plugin to connect to Google's native Universal Analytics SDK 3.0\r\n\r\nPrerequisites:\r\n* A Cordova 3.0+ project for iOS and/or Android\r\n* A Mobile App property through the Google Analytics Admin Console\r\n* Download the Google Analytics SDK 3.0 for [iOS](https://developers.google.com/analytics/devguides/collection/ios/) and/or [Android](https://developers.google.com/analytics/devguides/collection/android/)\r\n* For iOS, add the downloaded Google Analytics SDK header files and libraries according to the [Getting Started](https://developers.google.com/analytics/devguides/collection/ios/v3) documentation\r\n* For Android, add `libGoogleAnalyticsServices.jar` to your Cordova Android project's `/libs` directory and build path\r\n\r\n#Installing\r\n\r\nThis plugin follows the Cordova 3.0 plugin spec, so it can be installed through the Cordova CLI in your existing Cordova project:\r\n```bash\r\ncordova plugin add https://github.com/danwilson/google-analytics-plugin.git\r\n```\r\n#JavaScript Usage\r\nIn your 'deviceready' handler, set up your Analytics tracker:\r\n* `analytics.startTrackerWithId('UA-XXXX-YY')` where UA-XXXX-YY is your Google Analytics Mobile App property\r\n\r\nTo track a Screen (PageView):\r\n* `analytics.trackView('Screen Title')`\r\n\r\nTo track an Event:\r\n* `analytics.trackEvent('Category', 'Action', 'Label')` Label is optional\r\n\r\n\r\n","readmeFilename":"README.md","_id":"com.danielcwilson.plugins.googleanalytics@0.1.2","dist":{"shasum":"5e2e1ceaac0de12d4a3dd8859e6c5e96990168e8","tarball":"http://registry.cordova.io/com.danielcwilson.plugins.googleanalytics/-/com.danielcwilson.plugins.googleanalytics-0.1.2.tgz"},"_from":"C:\\Users\\Dan\\Documents\\GitHub\\google-analytics-plugin","_npmVersion":"1.3.4","_npmUser":{"name":"dancwilson","email":"dwilson1@gmail.com"},"maintainers":[{"name":"dancwilson","email":"dwilson1@gmail.com"}]}},"readme":"google-analytics-plugin\r\n=======================\r\n\r\nCordova (PhoneGap) 3.0+ Plugin to connect to Google's native Universal Analytics SDK 3.0\r\n\r\nPrerequisites:\r\n* A Cordova 3.0+ project for iOS and/or Android\r\n* A Mobile App property through the Google Analytics Admin Console\r\n* Download the Google Analytics SDK 3.0 for [iOS](https://developers.google.com/analytics/devguides/collection/ios/) and/or [Android](https://developers.google.com/analytics/devguides/collection/android/)\r\n* For iOS, add the downloaded Google Analytics SDK header files and libraries according to the [Getting Started](https://developers.google.com/analytics/devguides/collection/ios/v3) documentation\r\n* For Android, add `libGoogleAnalyticsServices.jar` to your Cordova Android project's `/libs` directory and build path\r\n\r\n#Installing\r\n\r\nThis plugin follows the Cordova 3.0 plugin spec, so it can be installed through the Cordova CLI in your existing Cordova project:\r\n```bash\r\ncordova plugin add https://github.com/danwilson/google-analytics-plugin.git\r\n```\r\n#JavaScript Usage\r\nIn your 'deviceready' handler, set up your Analytics tracker:\r\n* `analytics.startTrackerWithId('UA-XXXX-YY')` where UA-XXXX-YY is your Google Analytics Mobile App property\r\n\r\nTo track a Screen (PageView):\r\n* `analytics.trackView('Screen Title')`\r\n\r\nTo track an Event:\r\n* `analytics.trackEvent('Category', 'Action', 'Label')` Label is optional\r\n\r\n\r\n","maintainers":[{"name":"dancwilson","email":"dwilson1@gmail.com"}],"time":{"modified":"2013-10-22T13:14:55.444Z","created":"2013-10-22T13:14:54.687Z","0.1.2":"2013-10-22T13:14:55.444Z"},"_attachments":{"com.danielcwilson.plugins.googleanalytics-0.1.2.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-noFkweMzsRguDbhDFl81/g==","length":3998,"stub":true}}}},
{"id":"com.google.androidsupport","key":"com.google.androidsupport","value":{"rev":"3-ccf007e3bc39a43a523e65af38462b2f"},"doc":{"_id":"com.google.androidsupport","_rev":"3-ccf007e3bc39a43a523e65af38462b2f","name":"com.google.androidsupport","description":"This is a simple Cordova plugin that adds the Android Support v4 client library to your app.","dist-tags":{"latest":"4.0.0"},"versions":{"4.0.0":{"version":"4.0.0","name":"com.google.androidsupport","cordova_name":"Android Support","engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"# Android Support for Cordova\n\nThis is a simple Cordova plugin that adds the Android Support v4 client library to your app.\n\nNo user interaction is required; it should be automatically detected and included by Eclipse.\n\n## Developer Guide\n\nIf you're an app developer, there's nothing to see here. This is not a useful plugin on its own. There is no Cordova API for Android Support.\n\nInstead, this plugin should be used by plugin authors as a dependency if their plugin's Android native code requires Android Support.\n","readmeFilename":"README.md","description":"This is a simple Cordova plugin that adds the Android Support v4 client library to your app.","_id":"com.google.androidsupport@4.0.0","dist":{"shasum":"61091d89fd474e3348632272711ee1d0d11e0012","tarball":"http://registry.cordova.io/com.google.androidsupport/-/com.google.androidsupport-4.0.0.tgz"},"_from":"/Users/maxw/android-support","_npmVersion":"1.3.4","_npmUser":{"name":"maxw","email":"maxw@chromium.org"},"maintainers":[{"name":"maxw","email":"maxw@chromium.org"}]}},"readme":"# Android Support for Cordova\n\nThis is a simple Cordova plugin that adds the Android Support v4 client library to your app.\n\nNo user interaction is required; it should be automatically detected and included by Eclipse.\n\n## Developer Guide\n\nIf you're an app developer, there's nothing to see here. This is not a useful plugin on its own. There is no Cordova API for Android Support.\n\nInstead, this plugin should be used by plugin authors as a dependency if their plugin's Android native code requires Android Support.\n","maintainers":[{"name":"maxw","email":"maxw@chromium.org"}],"time":{"modified":"2014-01-17T18:40:04.364Z","created":"2014-01-17T18:40:03.463Z","4.0.0":"2014-01-17T18:40:04.364Z"},"_attachments":{"com.google.androidsupport-4.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-mwCCQF+BB+lV/e1UCgKUNA==","length":539274,"stub":true}}}},
{"id":"com.google.playservices","key":"com.google.playservices","value":{"rev":"3-7c1f36e5ce0696965c3d7efd8c25b502"},"doc":{"_id":"com.google.playservices","_rev":"3-7c1f36e5ce0696965c3d7efd8c25b502","name":"com.google.playservices","description":"This is a simple Cordova plugin that adds the Google Play Services (currently v9) client library to your app.","dist-tags":{"latest":"9.0.0"},"versions":{"9.0.0":{"version":"9.0.0","name":"com.google.playservices","cordova_name":"Google Play Services for Android","engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"# Play Services for Cordova\n\nThis is a simple Cordova plugin that adds the Google Play Services (currently v9) client library to your app.\n\nNo user interaction is required, it should be automatically detected and included by Eclipse.\n","readmeFilename":"README.md","description":"This is a simple Cordova plugin that adds the Google Play Services (currently v9) client library to your app.","_id":"com.google.playservices@9.0.0","dist":{"shasum":"29c8e76ddcf4cd0f8d05a56350431beb8fed5874","tarball":"http://registry.cordova.io/com.google.playservices/-/com.google.playservices-9.0.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"agrieve","email":"agrieve@chromium.org"},"maintainers":[{"name":"agrieve","email":"agrieve@chromium.org"}]}},"readme":"# Play Services for Cordova\n\nThis is a simple Cordova plugin that adds the Google Play Services (currently v9) client library to your app.\n\nNo user interaction is required, it should be automatically detected and included by Eclipse.\n","maintainers":[{"name":"agrieve","email":"agrieve@chromium.org"}],"time":{"modified":"2013-09-22T14:06:53.152Z","created":"2013-09-22T14:06:40.913Z","9.0.0":"2013-09-22T14:06:53.152Z"},"_attachments":{"com.google.playservices-9.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-ZdOhaxLoNprW7IohZ3u2fQ==","length":509263,"stub":true}}}},
{"id":"com.hipmob.android.phonegap.plugin","key":"com.hipmob.android.phonegap.plugin","value":{"rev":"3-94814a4ef6fbe2646645ff85e61a3f77"},"doc":{"_id":"com.hipmob.android.phonegap.plugin","_rev":"3-94814a4ef6fbe2646645ff85e61a3f77","name":"com.hipmob.android.phonegap.plugin","description":"Hipmob provides an in-app live chat and helpdesk for mobile apps.","dist-tags":{"latest":"0.2.5"},"versions":{"0.2.5":{"version":"0.2.5","name":"com.hipmob.android.phonegap.plugin","cordova_name":"Hipmob","description":"Hipmob provides an in-app live chat and helpdesk for mobile apps.","license":"MIT License","keywords":["real-time"," live chat"," cobrowsing"," screensharing"," customer support"," support"," helpdesk"," QA"," sales"," demos"," demonstrations push notifications"," push messaging"," push alerts"," push"],"engines":[{"name":"cordova","version":">=2.9"}],"readme":"cordova-plugin-hipmob-android\n---------------------------\nThe Hipmob Cordova plugin for Android provides Phonegap applications access to helpdesk, live chat and support CRM tools using the Hipmob platform. For more information visit https://www.hipmob.com.\n\nIt is compatible with Android 2.1 and higher, and works on versions of Cordova greater than 2.9.0.\n\nInstallation\n---------------------------\nInstall the plugin using the Cordova command-line interface:\n\n cordova plugin add https://github.com/hipmob/cordova-plugin-hipmob-android.git\n\nOn Windows, you may have issues with the install (we've observed Git errors when trying to do the fetch). If that's the case, you'll want to clone the repository and then do a local add: ***make sure you clone the plugin to a directory outside your app***.\n\n git clone https://github.com/hipmob/cordova-plugin-hipmob-android.git <directory location of plugin>\n cd <root of application>\n cordova plugin add <directory location of plugin>\n\nUsage\n---------------------------\nTo use the Hipmob library, you'll need to get a free account at https://www.hipmob.com/. Once you have an account, visit https://manage.hipmob.com/#apps to get your application ID. You can then open a support chat window from a button:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openChat(hipmob_app_id, {\n\t'title': 'Help',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }\n\nTo open a helpdesk search window, you can do:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openHelpdeskSearch(hipmob_app_id, {\n\t'title': 'Help',\n\t'query': 'Android',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }\n \nTo open an instant help window, you can do:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n\tvar helpdesk_article_url = '<helpdesk article url>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openHelpdeskArticle(hipmob_app_id, helpdesk_article_url, {\n\t'title': 'Help',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }","readmeFilename":"README.md","_id":"com.hipmob.android.phonegap.plugin@0.2.5","dist":{"shasum":"e56506aad002f0ad7296fab3cc2828aeb62e39b6","tarball":"http://registry.cordova.io/com.hipmob.android.phonegap.plugin/-/com.hipmob.android.phonegap.plugin-0.2.5.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"hipmob","email":"team@hipmob.com"},"maintainers":[{"name":"hipmob","email":"team@hipmob.com"}]}},"readme":"cordova-plugin-hipmob-android\n---------------------------\nThe Hipmob Cordova plugin for Android provides Phonegap applications access to helpdesk, live chat and support CRM tools using the Hipmob platform. For more information visit https://www.hipmob.com.\n\nIt is compatible with Android 2.1 and higher, and works on versions of Cordova greater than 2.9.0.\n\nInstallation\n---------------------------\nInstall the plugin using the Cordova command-line interface:\n\n cordova plugin add https://github.com/hipmob/cordova-plugin-hipmob-android.git\n\nOn Windows, you may have issues with the install (we've observed Git errors when trying to do the fetch). If that's the case, you'll want to clone the repository and then do a local add: ***make sure you clone the plugin to a directory outside your app***.\n\n git clone https://github.com/hipmob/cordova-plugin-hipmob-android.git <directory location of plugin>\n cd <root of application>\n cordova plugin add <directory location of plugin>\n\nUsage\n---------------------------\nTo use the Hipmob library, you'll need to get a free account at https://www.hipmob.com/. Once you have an account, visit https://manage.hipmob.com/#apps to get your application ID. You can then open a support chat window from a button:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openChat(hipmob_app_id, {\n\t'title': 'Help',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }\n\nTo open a helpdesk search window, you can do:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openHelpdeskSearch(hipmob_app_id, {\n\t'title': 'Help',\n\t'query': 'Android',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }\n \nTo open an instant help window, you can do:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n\tvar helpdesk_article_url = '<helpdesk article url>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openHelpdeskArticle(hipmob_app_id, helpdesk_article_url, {\n\t'title': 'Help',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }","maintainers":[{"name":"hipmob","email":"team@hipmob.com"}],"time":{"modified":"2013-12-16T15:39:38.261Z","created":"2013-12-16T15:39:37.601Z","0.2.5":"2013-12-16T15:39:38.261Z"},"_attachments":{"com.hipmob.android.phonegap.plugin-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-xKgYFlg/6B2N4MHe5oRPVg==","length":209225,"stub":true}}}},
{"id":"com.hipmob.ios.phonegap.plugin","key":"com.hipmob.ios.phonegap.plugin","value":{"rev":"5-d8e3acc18e18a880c8438fc5a113a1e7"},"doc":{"_id":"com.hipmob.ios.phonegap.plugin","_rev":"5-d8e3acc18e18a880c8438fc5a113a1e7","name":"com.hipmob.ios.phonegap.plugin","description":"Hipmob provides in-app live chat and helpdesk for mobile apps.","dist-tags":{"latest":"0.2.5"},"versions":{"0.1.0":{"version":"0.1.0","name":"com.hipmob.ios.phonegap.plugin","cordova_name":"Hipmob","description":"Hipmob provides in-app live chat and helpdesk for mobile apps.","license":"MIT License","keywords":["real-time"," live chat"," cobrowsing"," screensharing"," customer support"," support"," helpdesk"," QA"," sales"," demos"," demonstrations push notifications"," push messaging"," push alerts"," push"],"engines":[{"name":"cordova","version":">=2.9"}],"readme":"cordova-plugin-hipmob-ios\n---------------------------\nThe Hipmob Cordova plugin for iOS provides Phonegap applications access to helpdesk, live chat and support CRM tools using the Hipmob platform. For more information visit https://www.hipmob.com.\n\nIt is compatible with iOS 4.3 and higher, and works on versions of Cordova greater than 2.9.0.\n\nInstallation\n---------------------------\nInstall the plugin using the Cordova command-line interface:\n\n cordova plugin add https://github.com/hipmob/cordova-plugin-hipmob-ios.git\n\nUsage\n---------------------------\nTo use the Hipmob library, you'll need to get a free account at https://www.hipmob.com/. Once you have an account, visit https://manage.hipmob.com/#apps to get your application ID. You can then open a support chat window from a button:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openChat(hipmob_app_id, {\n\t'title': 'Help',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }\n\nTo open a helpdesk search window, you can do:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openHelpdeskSearch(hipmob_app_id, {\n\t'title': 'Help',\n\t'query': 'Android',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }\n \nTo open an instant help window, you can do:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n\tvar helpdesk_article_url = '<helpdesk article url>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openHelpdeskArticle(hipmob_app_id, helpdesk_article_url, {\n\t'title': 'Help',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }","readmeFilename":"README.md","_id":"com.hipmob.ios.phonegap.plugin@0.1.0","dist":{"shasum":"8b190e5003e3b2170ccca09156df4ab6d4b08778","tarball":"http://registry.cordova.io/com.hipmob.ios.phonegap.plugin/-/com.hipmob.ios.phonegap.plugin-0.1.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"hipmob","email":"team@hipmob.com"},"maintainers":[{"name":"hipmob","email":"team@hipmob.com"}]},"0.2.5":{"version":"0.2.5","name":"com.hipmob.ios.phonegap.plugin","cordova_name":"Hipmob","description":"Hipmob provides in-app live chat and helpdesk for mobile apps.","license":"MIT License","keywords":["real-time"," live chat"," cobrowsing"," screensharing"," customer support"," support"," helpdesk"," QA"," sales"," demos"," demonstrations push notifications"," push messaging"," push alerts"," push"],"engines":[{"name":"cordova","version":">=2.9"}],"readme":"cordova-plugin-hipmob-ios\n---------------------------\nThe Hipmob Cordova plugin for iOS provides Phonegap applications access to helpdesk, live chat and support CRM tools using the Hipmob platform. For more information visit https://www.hipmob.com.\n\nIt is compatible with iOS 4.3 and higher, and works on versions of Cordova greater than 2.9.0.\n\nInstallation\n---------------------------\nInstall the plugin using the Cordova command-line interface:\n\n cordova plugin add https://github.com/hipmob/cordova-plugin-hipmob-ios.git\n\nUsage\n---------------------------\nTo use the Hipmob library, you'll need to get a free account at https://www.hipmob.com/. Once you have an account, visit https://manage.hipmob.com/#apps to get your application ID. You can then open a support chat window from a button:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openChat(hipmob_app_id, {\n\t'title': 'Help',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }\n\nTo open a helpdesk search window, you can do:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openHelpdeskSearch(hipmob_app_id, {\n\t'title': 'Help',\n\t'query': 'Android',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }\n \nTo open an instant help window, you can do:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n\tvar helpdesk_article_url = '<helpdesk article url>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openHelpdeskArticle(hipmob_app_id, helpdesk_article_url, {\n\t'title': 'Help',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }","readmeFilename":"README.md","_id":"com.hipmob.ios.phonegap.plugin@0.2.5","dist":{"shasum":"222bc4b0d836a82457b09c34eb120ec82328df5b","tarball":"http://registry.cordova.io/com.hipmob.ios.phonegap.plugin/-/com.hipmob.ios.phonegap.plugin-0.2.5.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"hipmob","email":"team@hipmob.com"},"maintainers":[{"name":"hipmob","email":"team@hipmob.com"}]}},"readme":"cordova-plugin-hipmob-ios\n---------------------------\nThe Hipmob Cordova plugin for iOS provides Phonegap applications access to helpdesk, live chat and support CRM tools using the Hipmob platform. For more information visit https://www.hipmob.com.\n\nIt is compatible with iOS 4.3 and higher, and works on versions of Cordova greater than 2.9.0.\n\nInstallation\n---------------------------\nInstall the plugin using the Cordova command-line interface:\n\n cordova plugin add https://github.com/hipmob/cordova-plugin-hipmob-ios.git\n\nUsage\n---------------------------\nTo use the Hipmob library, you'll need to get a free account at https://www.hipmob.com/. Once you have an account, visit https://manage.hipmob.com/#apps to get your application ID. You can then open a support chat window from a button:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openChat(hipmob_app_id, {\n\t'title': 'Help',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }\n\nTo open a helpdesk search window, you can do:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openHelpdeskSearch(hipmob_app_id, {\n\t'title': 'Help',\n\t'query': 'Android',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }\n \nTo open an instant help window, you can do:\n\n if( window.plugins && window.plugins.Hipmob ) {\n var hipmob_app_id = '<HIPMOB APPLICATION ID>';\n\tvar helpdesk_article_url = '<helpdesk article url>';\n var Hipmob = window.plugins.Hipmob;\n \n Hipmob.openHelpdeskArticle(hipmob_app_id, helpdesk_article_url, {\n\t'title': 'Help',\n\t'user': '<hipmob user id>',\n\t'name': 'Femi',\n\t'email': 'femi@hipmob.com',\n\t'context': 'shopping for shoes',\n\t'location': 'At home'\n\t});\n } else {\n alert('Hipmob plugin not available/ready.');\n }","maintainers":[{"name":"hipmob","email":"team@hipmob.com"}],"time":{"modified":"2013-12-16T15:39:01.287Z","created":"2013-12-16T02:28:08.261Z","0.1.0":"2013-12-16T02:28:12.467Z","0.2.5":"2013-12-16T15:39:01.287Z"},"_attachments":{"com.hipmob.ios.phonegap.plugin-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-Tqdk9IItAXpMvYvKRaP2YQ==","length":2730762,"stub":true},"com.hipmob.ios.phonegap.plugin-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-omsiDzNR2L5PR673YpnYcw==","length":2730437,"stub":true}}}},
{"id":"com.infobip.mpay","key":"com.infobip.mpay","value":{"rev":"3-490901a9880530fdf9d611376ab70e74"},"doc":{"_id":"com.infobip.mpay","_rev":"3-490901a9880530fdf9d611376ab70e74","name":"com.infobip.mpay","description":"Centili Mobile Payments Plugin","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"version":"0.1.0","name":"com.infobip.mpay","cordova_name":"Centili MPay","description":"Centili Mobile Payments Plugin","license":"MIT","keywords":["centili"," mpay"," infobip"],"engines":[],"readme":"ERROR: No README data found!","_id":"com.infobip.mpay@0.1.0","dist":{"shasum":"f52f3d3236bb854288c95e510ada544ac1cdb700","tarball":"http://registry.cordova.io/com.infobip.mpay/-/com.infobip.mpay-0.1.0.tgz"},"_from":"NetBeansProjects/CentiliPlugin","_npmVersion":"1.3.4","_npmUser":{"name":"infobip","email":"miroslav.milivojevic@infobip.com"},"maintainers":[{"name":"infobip","email":"miroslav.milivojevic@infobip.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"infobip","email":"miroslav.milivojevic@infobip.com"}],"time":{"modified":"2013-11-15T12:24:39.220Z","created":"2013-11-15T12:24:36.991Z","0.1.0":"2013-11-15T12:24:39.220Z"},"_attachments":{"com.infobip.mpay-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-8Zs3dy9iT1vFwkmKul32ug==","length":657007,"stub":true}}}},
{"id":"com.jamiestarke.webviewdebug","key":"com.jamiestarke.webviewdebug","value":{"rev":"7-39d56d177ebffb300e4cd6d11e6117d9"},"doc":{"_id":"com.jamiestarke.webviewdebug","_rev":"7-39d56d177ebffb300e4cd6d11e6117d9","name":"com.jamiestarke.webviewdebug","description":"Enables debugging of WebViews withing Android for Cordova Apps","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.jamiestarke.webviewdebug","cordova_name":"WebView Debug","description":"Enables debugging of WebViews withing Android for Cordova Apps","license":"Apache 2.0 License","keywords":["cordova","debug","webview"],"engines":[],"readme":"# WebViewDebug Android Plugin for Cordova 3.X #\nBy Jamie Starke\n\n## Why do you want this? ##\nAs of Android 4.4, Google has enabled some amazing new functionality, [Debugging Android WebViews](https://developers.google.com/chrome-developer-tools/docs/remote-debugging#debugging-webviews).\n\nTo be able to enable this functionality though, you have to add a piece of code to [Configure your WebViews for Debugging](https://developers.google.com/chrome-developer-tools/docs/remote-debugging#configure-webview)\n\nSince this was something I would need while developing, but not during production, I figured that I would make this\nas a plugin, so it could easily be removed before I release my code.\n\n## Requirements ##\n\nYou will require the Android 4.4 (SDK 19) build tools and SDK.\n\nThe `platforms/android/project.properties` file will need to be updated so that `target=android-19` as this was functionality added\nin Android 4.4.\n\nYou may also have to [change your Android Target from 17 to 19](http://stackoverflow.com/a/19734065/1017797). Follow that post, but\ninstead of using `18` use `19`.\n\n## Adding the Plugin to your project ##\n1. To install the plugin, use the Cordova CLI and enter the following:\n\n cordova plugin add https://github.com/jrstarke/webview-debug.git\n\n## Removing the plugin before you release ##\n1. To remove the plugin use the Cordova CLI and enter the following:\n\n cordova plugin remove com.jamiestarke.webviewdebug\n\n## Licence ##\n\nCopyright 2013 Jamie Starke\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","readmeFilename":"README.md","_id":"com.jamiestarke.webviewdebug@1.0.0","dist":{"shasum":"d31be7e33ad273995bce61c9201aaae51637a469","tarball":"http://registry.cordova.io/com.jamiestarke.webviewdebug/-/com.jamiestarke.webviewdebug-1.0.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"jrstarke","email":"jrstarke@gmail.com"},"maintainers":[{"name":"jrstarke","email":"jrstarke@gmail.com"}]},"1.0.1":{"version":"1.0.1","name":"com.jamiestarke.webviewdebug","cordova_name":"WebView Debug","description":"Enables debugging of WebViews withing Android for Cordova Apps","license":"Apache 2.0 License","keywords":["cordova","debug","webview"],"engines":[],"readme":"# WebViewDebug Android Plugin for Cordova 3.X #\nBy Jamie Starke\n\n## Why do you want this? ##\nAs of Android 4.4, Google has enabled some amazing new functionality, [Debugging Android WebViews](https://developers.google.com/chrome-developer-tools/docs/remote-debugging#debugging-webviews).\n\nTo be able to enable this functionality though, you have to add a piece of code to [Configure your WebViews for Debugging](https://developers.google.com/chrome-developer-tools/docs/remote-debugging#configure-webview)\n\nSince this was something I would need while developing, but not during production, I figured that I would make this\nas a plugin, so it could easily be removed before I release my code.\n\n## Requirements ##\n\nYou will require the Android 4.4 (SDK 19) build tools and SDK.\n\nThe `platforms/android/project.properties` file will need to be updated so that `target=android-19` as this was functionality added\nin Android 4.4.\n\nYou may also have to [change your Android Target from 17 to 19](http://stackoverflow.com/a/19734065/1017797). Follow that post, but\ninstead of using `18` use `19`.\n\n## Adding the Plugin to your project ##\n1. To install the plugin, use the Cordova CLI and enter the following:\n\n cordova plugin add https://github.com/jrstarke/webview-debug.git\n\n## Removing the plugin before you release ##\n1. To remove the plugin use the Cordova CLI and enter the following:\n\n cordova plugin remove com.jamiestarke.webviewdebug\n\n## To Debug WebViews ##\n\nMake sure that you have [adb installed](https://developers.google.com/chrome-developer-tools/docs/remote-debugging#install-adbplugin),\nand that [USB debugging is enabled on your device](https://developers.google.com/chrome-developer-tools/docs/remote-debugging#enable-usb-debugging).\n\n1. Connect your device to your computer using a USB cable.\n2. In your Chrome 30+ browser, open the url **about:inspect**.\n3. Find the application you would like to debug in the list, and click the `inspect` link.\n\n## Licence ##\n\nCopyright 2013 Jamie Starke\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","readmeFilename":"README.md","_id":"com.jamiestarke.webviewdebug@1.0.1","dist":{"shasum":"136993cd82339c06cc8e56125fa3443a3017c384","tarball":"http://registry.cordova.io/com.jamiestarke.webviewdebug/-/com.jamiestarke.webviewdebug-1.0.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"jrstarke","email":"jrstarke@gmail.com"},"maintainers":[{"name":"jrstarke","email":"jrstarke@gmail.com"}]},"1.0.2":{"version":"1.0.2","name":"com.jamiestarke.webviewdebug","cordova_name":"WebView Debug","description":"Enables debugging of WebViews withing Android for Cordova Apps","license":"Apache 2.0 License","keywords":["cordova","debug","webview"],"engines":[],"readme":"# WebViewDebug Android Plugin for Cordova 3.X #\nBy Jamie Starke\n\n## Why do you want this? ##\nAs of Android 4.4, Google has enabled some amazing new functionality, [Debugging Android WebViews](https://developers.google.com/chrome-developer-tools/docs/remote-debugging#debugging-webviews).\n\nTo be able to enable this functionality though, you have to add a piece of code to [Configure your WebViews for Debugging](https://developers.google.com/chrome-developer-tools/docs/remote-debugging#configure-webview)\n\nSince this was something I would need while developing, but not during production, I figured that I would make this\nas a plugin, so it could easily be removed before I release my code.\n\n## Requirements ##\n\nYou will require the Android 4.4 (SDK 19) build tools and SDK.\n\nThe `platforms/android/project.properties` file will need to be updated so that `target=android-19` as this was functionality added\nin Android 4.4.\n\nYou may also have to [change your Android Target from 17 to 19](http://stackoverflow.com/a/19734065/1017797). Follow that post, but\ninstead of using `18` use `19`.\n\n## Adding the Plugin to your project ##\n1. To install the plugin, use the Cordova CLI and enter the following:\n\n cordova plugin add https://github.com/jrstarke/webview-debug.git\n\n## Removing the plugin before you release ##\n1. To remove the plugin use the Cordova CLI and enter the following:\n\n cordova plugin remove com.jamiestarke.webviewdebug\n\n## To Debug WebViews ##\n\nMake sure that you have [adb installed](https://developers.google.com/chrome-developer-tools/docs/remote-debugging#install-adbplugin),\nand that [USB debugging is enabled on your device](https://developers.google.com/chrome-developer-tools/docs/remote-debugging#enable-usb-debugging).\n\n1. Connect your device to your computer using a USB cable.\n2. In your Chrome 30+ browser, open the url **about:inspect**.\n3. Find the application you would like to debug in the list, and click the `inspect` link.\n\n## Licence ##\n\nCopyright 2013 Jamie Starke\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","readmeFilename":"README.md","_id":"com.jamiestarke.webviewdebug@1.0.2","dist":{"shasum":"aa06aadc11d6a4f8975f58c3a80cf667afc0287d","tarball":"http://registry.cordova.io/com.jamiestarke.webviewdebug/-/com.jamiestarke.webviewdebug-1.0.2.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"jrstarke","email":"jrstarke@gmail.com"},"maintainers":[{"name":"jrstarke","email":"jrstarke@gmail.com"}]}},"readme":"# WebViewDebug Android Plugin for Cordova 3.X #\nBy Jamie Starke\n\n## Why do you want this? ##\nAs of Android 4.4, Google has enabled some amazing new functionality, [Debugging Android WebViews](https://developers.google.com/chrome-developer-tools/docs/remote-debugging#debugging-webviews).\n\nTo be able to enable this functionality though, you have to add a piece of code to [Configure your WebViews for Debugging](https://developers.google.com/chrome-developer-tools/docs/remote-debugging#configure-webview)\n\nSince this was something I would need while developing, but not during production, I figured that I would make this\nas a plugin, so it could easily be removed before I release my code.\n\n## Requirements ##\n\nYou will require the Android 4.4 (SDK 19) build tools and SDK.\n\nThe `platforms/android/project.properties` file will need to be updated so that `target=android-19` as this was functionality added\nin Android 4.4.\n\nYou may also have to [change your Android Target from 17 to 19](http://stackoverflow.com/a/19734065/1017797). Follow that post, but\ninstead of using `18` use `19`.\n\n## Adding the Plugin to your project ##\n1. To install the plugin, use the Cordova CLI and enter the following:\n\n cordova plugin add https://github.com/jrstarke/webview-debug.git\n\n## Removing the plugin before you release ##\n1. To remove the plugin use the Cordova CLI and enter the following:\n\n cordova plugin remove com.jamiestarke.webviewdebug\n\n## Licence ##\n\nCopyright 2013 Jamie Starke\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.","maintainers":[{"name":"jrstarke","email":"jrstarke@gmail.com"}],"time":{"modified":"2013-11-23T04:36:04.377Z","created":"2013-11-22T14:50:44.273Z","1.0.0":"2013-11-22T14:50:45.449Z","1.0.1":"2013-11-22T15:09:17.570Z","1.0.2":"2013-11-23T04:36:04.377Z"},"_attachments":{"com.jamiestarke.webviewdebug-1.0.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-SNHTpoW/Ua5e0BDQNOin5A==","length":6202,"stub":true},"com.jamiestarke.webviewdebug-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-r7c2rul6jwMQpYXFvLtFaQ==","length":6203,"stub":true},"com.jamiestarke.webviewdebug-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-8pDlLtOGfV6pK7vpqTV/jw==","length":6021,"stub":true}}}},
{"id":"com.jf","key":"com.jf","value":{"rev":"5-ab920ec25bac47d5ba7e0898d8ae765f"},"doc":{"_id":"com.jf","_rev":"5-ab920ec25bac47d5ba7e0898d8ae765f","name":"com.jf","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"version":"0.1.0","name":"com.jf","cordova_name":"Zjf","engines":[],"readme":"ERROR: No README data found!","readmeFilename":"readme.md","_id":"com.jf@0.1.0","dist":{"shasum":"d85af0908cec9811d411b8835ec34edc9418e518","tarball":"http://registry.cordova.io/com.jf/-/com.jf-0.1.0.tgz"},"_from":"D:\\gitfortest","_npmVersion":"1.3.4","_npmUser":{"name":"zjf","email":"zjf276744763@qq.com"},"maintainers":[{"name":"zjf","email":"zjf276744763@qq.com"}]},"0.2.0":{"version":"0.2.0","name":"com.jf","cordova_name":"Zjf","engines":[],"readme":"ERROR: No README data found!","readmeFilename":"readme.md","_id":"com.jf@0.2.0","dist":{"shasum":"70a4b00a4389f9bcf36d8a3a8a6cf46469153041","tarball":"http://registry.cordova.io/com.jf/-/com.jf-0.2.0.tgz"},"_from":"D:\\gitfortest","_npmVersion":"1.3.4","_npmUser":{"name":"zjf","email":"zjf276744763@qq.com"},"maintainers":[{"name":"zjf","email":"zjf276744763@qq.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"zjf","email":"zjf276744763@qq.com"}],"time":{"modified":"2013-10-11T07:23:06.895Z","created":"2013-10-11T07:21:15.128Z","0.1.0":"2013-10-11T07:21:44.432Z","0.2.0":"2013-10-11T07:23:06.895Z"},"_attachments":{"com.jf-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-QDl/6Lv280I751wOD1fYUg==","length":5040395,"stub":true},"com.jf-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-oQOx2URWFCDWEBmS6H2oKQ==","length":5040399,"stub":true}}}},
{"id":"com.megster.cordova.bluetoothserial","key":"com.megster.cordova.bluetoothserial","value":{"rev":"7-d46ddb09bbb3d64be2394a994ef9315e"},"doc":{"_id":"com.megster.cordova.bluetoothserial","_rev":"7-d46ddb09bbb3d64be2394a994ef9315e","name":"com.megster.cordova.bluetoothserial","description":"Bluetooth Serial Communication Plugin","dist-tags":{"latest":"0.2.2"},"versions":{"0.2.0":{"version":"0.2.0","name":"com.megster.cordova.bluetoothserial","description":"Bluetooth Serial Communication Plugin","license":"Apache 2.0","readme":"# Bluetooth Serial Plugin for PhoneGap\n\nThis plugin enables serial communication over Bluetooth. It was written for communicating between Android or iOS and an Arduino.\n\nAndroid uses Classic Bluetooth. iOS uses Bluetooth Low Energy.\n\n## Supported Platforms\n\n* Android\n* iOS (with [BLEMini](http://redbearlab.com/blemini))\n\n## Limitations\n\n * The phone must initiate the Bluetooth connection\n * Data sent over the connection is assumed to be Strings\n * iOS Bluetooth Low Energy requires iPhone 4S, iPhone5, iPod 5, or iPad3+\n\n# Installing \n\nUse [plugman](https://github.com/imhotep/plugman) to add BluetoothSerial to your Android project. Plugman requires [node.js](http://nodejs.org) and is installed through npm.\n\nInstall plugman (v0.7.7 or greater)\n\n $ npm install -g plugman\n\nGet the latest source code\n\n $ git clone https://github.com/don/BluetoothSerial.git\n\nInstall the plugin\n\nAndroid\n\n $ plugman --platform android --project /path/to/your/project --plugin /path/to/BluetoothSerial\n\niOS\n\n $ plugman --platform ios --project /path/to/your/project --plugin /path/to/BluetoothSerial\n\nModify your HTML to include bluetoothSerial.js\n\n <script type=\"text/javascript\" src=\"cordova-2.7.0.js\"></script>\n <script type=\"text/javascript\" src=\"js/bluetoothSerial.js\"></script>\n <script type=\"text/javascript\" src=\"js/index.js\"></script>\n\nRequire bluetoothSerial in your JavaScript\n\n var bluetoothSerial = cordova.require('bluetoothSerial');\n\n# API\n\n## Methods\n\n- [bluetoothSerial.connect](#connect)\n- [bluetoothSerial.disconnect](#disconnect)\n- [bluetoothSerial.write](#write)\n- [bluetoothSerial.available](#available)\n- [bluetoothSerial.read](#read)\n- [bluetoothSerial.readUntil](#readUntil)\n- [bluetoothSerial.subscribe](#subscribe)\n- [bluetoothSerial.unsubscribe](#unsubscribe)\n- [bluetoothSerial.clear](#clear)\n- [bluetoothSerial.list](#list)\n- [bluetoothSerial.isEnabled](#isenabled)\n- [bluetoothSerial.isConnected](#isconnected)\n\n## connect\n\nConnect to a Bluetooth device.\n\n bluetoothSerial.connect(macAddress_or_uuid, connectSuccess, connectFailure);\n\n### Description\n\nFunction `connect` connects to a Bluetooth device. The callback is long running. Success will be called when the connection is successful. Failure is called if the connection fails, or later if the connection disconnects. An error message is passed to the failure callback.\n\n#### Android\nFor Android, `connect` takes a macAddress of the remote device. \n\n#### iOS\nFor iOS, `connect` takes the UUID of the remote device. Optionally, you can pass an **empty string** and the plugin will connect to the first BLE peripheral.\n\n### Parameters\n\n- __macAddress_or_uuid__: Identifier of the remote device. \n- __connectSuccess__: Success callback function that is invoked when the connection is successful. \n- __connectFailure__: Error callback function, invoked when error occurs or the connection disconnects.\n\n## disconnect\n\nDisconnect.\n\n bluetoothSerial.disconnect([success], [failure]);\n\n### Description\n\nFunction `disconnect` disconnects the current connection.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## write\n\nWrites data to the serial port.\n\n bluetoothSerial.write(data, success, failure);\n\n### Description\n\nFunction `write` data to the serial port. Data must be a String.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## available\n\nGets the number of bytes of data available.\n\n bluetoothSerial.available(success, failure);\n\n### Description\n\nFunction `available` gets the number of bytes of data available. The bytes are passed as a parameter to the success callback.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.available(function (numBytes) {\n console.log(\"There are \" + numBytes + \" available to read.\");\n }, failure);\n\n## read\n\nReads data from the buffer.\n\n bluetoothSerial.read(success, failure);\n\n### Description\n\nFunction `read` reads the data from the buffer. The data is passed to the success callback as a String. Calling `read` when no data is available will pass an empty String to the callback.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with the number of bytes available to be read.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.read(function (data) {\n console.log(data);\n }, failure);\n\n## readUntil\n\nReads data from the buffer until it reaches a delimiter.\n\n bluetoothSerial.readUntil('\\n', success, failure);\n\n### Description\n\nFunction `readUntil` reads the data from the buffer until it reaches a delimiter. The data is passed to the success callback as a String. If the buffer does not contain the delimiter, an empty String is passed to the callback. Calling `read` when no data is available will pass an empty String to the callback.\n\n### Parameters\n\n- __delimiter__: delimiter\n- __success__: Success callback function that is invoked with the data.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.readUntil('\\n', function (data) {\n console.log(data);\n }, failure);\n \n## subscribe \n\nSubscribe to be notified when data is received.\n\n bluetoothSerial.subscribe('\\n', success, failure);\n\n### Description\n\nFunction `subscribe` registers a callback that is called when data is received. A delimiter must be specified. The callback is called with the data as soon as the delimiter string is read. The callback is a long running callback and will exist until `unsubscribe` is called.\n\n### Parameters\n\n- __delimiter__: delimiter\n- __success__: Success callback function that is invoked with the data.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n // the success callback is called whenever data is received\n bluetoothSerial.subscribe('\\n', function (data) {\n console.log(data);\n }, failure);\n\n## unsubscribe\n\nUnsubscribe from a subscription.\n\n bluetoothSerial.unsubscribe(success, failure);\n\n### Description\n\nFunction `unsubscribe` removes any notification added by `subscribe` and kills the callback.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.unsubscribe();\n\n## clear\n\nClears data in the buffer.\n\n bluetoothSerial.clear(success, failure);\n\n### Description\n\nFunction `clear` removes any data from the receive buffer.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## list\n\nLists bonded devices\n\n bluetoothSerial.list(success, failure);\n \n### Description\n\n#### Android\n\nFunction `list` lists the paired Bluetooth devices. The success callback is called with a list of objects.\n\nExample list passed to success callback. See [BluetoothDevice](http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#getName()) and [BluetoothClass#getDeviceClass](http://developer.android.com/reference/android/bluetooth/BluetoothClass.html#getDeviceClass()).\n\n [{\n \"class\": 276,\n \"address\": \"10:BF:48:CB:00:00\",\n \"name\": \"Nexus 7\"\n }, {\n \"class\": 7936,\n \"address\": \"00:06:66:4D:00:00\",\n \"name\": \"RN42\"\n }]\n \n#### iOS\n\nFunction `list` lists the discovered Bluetooth Low Energy peripheral. The success callback is called with a list of objects.\n\nExample list passed to success callback for iOS.\n\n [{\n \"uuid\": \"CC410A23-2865-F03E-FC6A-4C17E858E11E\",\n \"name\": \"Biscuit\"\n }]\n\n \n### Parameters\n\n- __success__: Success callback function that is invoked with a list of bonded devices.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.list(function(devices) {\n devices.forEach(function(device) {\n console.log(device.address);\n })\n }, failure);\n \n## isConnected\n\nReports the connection status. \n\n bluetoothSerial.isConnected(success, failure);\n\n### Description\n\nFunction `isConnected` calls the success callback when connected to a peer and the failure callback when *not* connected.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.isConnected(function (connected) {\n console.log(connected); // true or false\n }, failure); \n \n## isEnabled\n\nReports if bluetooth is enabled.\n\n bluetoothSerial.isEnabled(success, failure);\n\n### Description\n\nFunction `isEnabled` calls the success callback when bluetooth is enabled and the failure callback when bluetooth is *not* enabled.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.isEnabled(function (enabled) {\n console.log(enabled); // true or false\n }, failure); \n\n# Misc\n\n## Where does this work? \n\n### Android\nThis plugin was developed with PhoneGap 2.7.0 using Android 4.2.2 on a Nexus 4 connecting to a [Sparkfun Mate Silver](https://www.sparkfun.com/products/10393). The code should be generic and work with most hardware.\n \n### iOS\nThis plugin was developed with PhoneGap 2.7.0 using iOS 6.x on an iPad 4 connecting to a [RedBearLab BLEMini](http://redbearlab.com/blemini).\n\nEnsure that you have update the BLE Mini firmware to at least [Biscuit-UART_20130313.bin](https://github.com/RedBearLab/Biscuit/tree/master/release).\n \n## Props\n\n### Android\n\nMost of the Bluetooth implementation was borrows from the Bluetooth Chat example in the Android SDK.\n\n### iOS\n\nThe iOS code uses RedBearLab's [BLE_Framework](https://github.com/RedBearLab/Release/tree/master/BLEMini).\n\n### API\n\nThe API for available, read, readUntil was influenced by the [BtSerial Library for Processing for Arduino](https://github.com/arduino/BtSerial)\n\n## Wrong Bluetooth Plugin?\n\nIf you don't need **serial** over Bluetooth, try the [PhoneGap Bluetooth Plugin for Android](https://github.com/phonegap/phonegap-plugins/tree/master/Android/Bluetooth)\n\n## Feedback\n \nTry the code. If you find an problem or missing feature, file an issue or create a pull request.\n\n","readmeFilename":"README.md","_id":"com.megster.cordova.bluetoothserial@0.2.0","dist":{"shasum":"3afad03cb64ad1b8def7930dec10615bab1cc48d","tarball":"http://registry.cordova.io/com.megster.cordova.bluetoothserial/-/com.megster.cordova.bluetoothserial-0.2.0.tgz"},"_from":"./BluetoothSerial","_npmVersion":"1.3.4","_npmUser":{"name":"don","email":"don.coleman@gmail.com"},"maintainers":[{"name":"don","email":"don.coleman@gmail.com"}]},"0.2.1":{"version":"0.2.1","name":"com.megster.cordova.bluetoothserial","cordova_name":"Bluetooth Serial","description":"Bluetooth Serial Communication Plugin","license":"Apache 2.0","engines":[{"name":"cordova","version":">=2.9.0"}],"readme":"# Bluetooth Serial Plugin for PhoneGap\n\nThis plugin enables serial communication over Bluetooth. It was written for communicating between Android or iOS and an Arduino.\n\nAndroid uses Classic Bluetooth. iOS uses Bluetooth Low Energy.\n\n## Supported Platforms\n\n* Android\n* iOS (with [BLEMini](http://redbearlab.com/blemini))\n\n## Limitations\n\n * The phone must initiate the Bluetooth connection\n * Data sent over the connection is assumed to be Strings\n * iOS Bluetooth Low Energy requires iPhone 4S, iPhone5, iPod 5, or iPad3+\n\n# Installing \n\nInstall with Cordova cli\n\n $ cordova plugin add https://github.com/don/BluetoothSerial.git\n \nThis plugin is also available for [PhoneGap Build](https://build.phonegap.com/plugins/23)\n\n# API\n\n## Methods\n\n- [bluetoothSerial.connect](#connect)\n- [bluetoothSerial.connectInsecure](#connectInsecure)\n- [bluetoothSerial.disconnect](#disconnect)\n- [bluetoothSerial.write](#write)\n- [bluetoothSerial.available](#available)\n- [bluetoothSerial.read](#read)\n- [bluetoothSerial.readUntil](#readUntil)\n- [bluetoothSerial.subscribe](#subscribe)\n- [bluetoothSerial.unsubscribe](#unsubscribe)\n- [bluetoothSerial.clear](#clear)\n- [bluetoothSerial.list](#list)\n- [bluetoothSerial.isEnabled](#isenabled)\n- [bluetoothSerial.isConnected](#isconnected)\n\n## connect\n\nConnect to a Bluetooth device.\n\n bluetoothSerial.connect(macAddress_or_uuid, connectSuccess, connectFailure);\n\n### Description\n\nFunction `connect` connects to a Bluetooth device. The callback is long running. Success will be called when the connection is successful. Failure is called if the connection fails, or later if the connection disconnects. An error message is passed to the failure callback.\n\n#### Android\nFor Android, `connect` takes a macAddress of the remote device. \n\n#### iOS\nFor iOS, `connect` takes the UUID of the remote device. Optionally, you can pass an **empty string** and the plugin will connect to the first BLE peripheral.\n\n### Parameters\n\n- __macAddress_or_uuid__: Identifier of the remote device. \n- __connectSuccess__: Success callback function that is invoked when the connection is successful. \n- __connectFailure__: Error callback function, invoked when error occurs or the connection disconnects.\n\n## connectInsecure\n\nConnect insecurely to a Bluetooth device.\n\n bluetoothSerial.connectInsecure(macAddress, connectSuccess, connectFailure);\n\n### Description\n\nFunction `connectInsecure` works like [connect](#connect), but creates an insecure connection to a Bluetooth device. See the [Android docs](http://goo.gl/1mFjZY) for more information.\n\n#### Android\nFor Android, `connectInsecure` takes a macAddress of the remote device. \n\n#### iOS\n`connectInsecure` is **not supported** on iOS.\n\n### Parameters\n\n- __macAddress__: Identifier of the remote device. \n- __connectSuccess__: Success callback function that is invoked when the connection is successful. \n- __connectFailure__: Error callback function, invoked when error occurs or the connection disconnects.\n\n\n## disconnect\n\nDisconnect.\n\n bluetoothSerial.disconnect([success], [failure]);\n\n### Description\n\nFunction `disconnect` disconnects the current connection.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## write\n\nWrites data to the serial port.\n\n bluetoothSerial.write(data, success, failure);\n\n### Description\n\nFunction `write` data to the serial port. Data must be a String.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## available\n\nGets the number of bytes of data available.\n\n bluetoothSerial.available(success, failure);\n\n### Description\n\nFunction `available` gets the number of bytes of data available. The bytes are passed as a parameter to the success callback.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.available(function (numBytes) {\n console.log(\"There are \" + numBytes + \" available to read.\");\n }, failure);\n\n## read\n\nReads data from the buffer.\n\n bluetoothSerial.read(success, failure);\n\n### Description\n\nFunction `read` reads the data from the buffer. The data is passed to the success callback as a String. Calling `read` when no data is available will pass an empty String to the callback.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with the number of bytes available to be read.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.read(function (data) {\n console.log(data);\n }, failure);\n\n## readUntil\n\nReads data from the buffer until it reaches a delimiter.\n\n bluetoothSerial.readUntil('\\n', success, failure);\n\n### Description\n\nFunction `readUntil` reads the data from the buffer until it reaches a delimiter. The data is passed to the success callback as a String. If the buffer does not contain the delimiter, an empty String is passed to the callback. Calling `read` when no data is available will pass an empty String to the callback.\n\n### Parameters\n\n- __delimiter__: delimiter\n- __success__: Success callback function that is invoked with the data.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.readUntil('\\n', function (data) {\n console.log(data);\n }, failure);\n \n## subscribe \n\nSubscribe to be notified when data is received.\n\n bluetoothSerial.subscribe('\\n', success, failure);\n\n### Description\n\nFunction `subscribe` registers a callback that is called when data is received. A delimiter must be specified. The callback is called with the data as soon as the delimiter string is read. The callback is a long running callback and will exist until `unsubscribe` is called.\n\n### Parameters\n\n- __delimiter__: delimiter\n- __success__: Success callback function that is invoked with the data.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n // the success callback is called whenever data is received\n bluetoothSerial.subscribe('\\n', function (data) {\n console.log(data);\n }, failure);\n\n## unsubscribe\n\nUnsubscribe from a subscription.\n\n bluetoothSerial.unsubscribe(success, failure);\n\n### Description\n\nFunction `unsubscribe` removes any notification added by `subscribe` and kills the callback.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.unsubscribe();\n\n## clear\n\nClears data in the buffer.\n\n bluetoothSerial.clear(success, failure);\n\n### Description\n\nFunction `clear` removes any data from the receive buffer.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## list\n\nLists bonded devices\n\n bluetoothSerial.list(success, failure);\n \n### Description\n\n#### Android\n\nFunction `list` lists the paired Bluetooth devices. The success callback is called with a list of objects.\n\nExample list passed to success callback. See [BluetoothDevice](http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#getName()) and [BluetoothClass#getDeviceClass](http://developer.android.com/reference/android/bluetooth/BluetoothClass.html#getDeviceClass()).\n\n [{\n \"class\": 276,\n \"address\": \"10:BF:48:CB:00:00\",\n \"name\": \"Nexus 7\"\n }, {\n \"class\": 7936,\n \"address\": \"00:06:66:4D:00:00\",\n \"name\": \"RN42\"\n }]\n \n#### iOS\n\nFunction `list` lists the discovered Bluetooth Low Energy peripheral. The success callback is called with a list of objects.\n\nExample list passed to success callback for iOS.\n\n [{\n \"uuid\": \"CC410A23-2865-F03E-FC6A-4C17E858E11E\",\n \"name\": \"Biscuit\"\n }]\n\n \n### Parameters\n\n- __success__: Success callback function that is invoked with a list of bonded devices.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.list(function(devices) {\n devices.forEach(function(device) {\n console.log(device.address);\n })\n }, failure);\n \n## isConnected\n\nReports the connection status. \n\n bluetoothSerial.isConnected(success, failure);\n\n### Description\n\nFunction `isConnected` calls the success callback when connected to a peer and the failure callback when *not* connected.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.isConnected(\n function() { \n console.log(\"Bluetooth is connected\");\n },\n function() { \n console.log(\"Bluetooth is *not* connected\");\n }\n ); \n \n## isEnabled\n\nReports if bluetooth is enabled.\n\n bluetoothSerial.isEnabled(success, failure);\n\n### Description\n\nFunction `isEnabled` calls the success callback when bluetooth is enabled and the failure callback when bluetooth is *not* enabled.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.isEnabled(\n function() { \n console.log(\"Bluetooth is enabled\");\n },\n function() { \n console.log(\"Bluetooth is *not* enabled\");\n }\n ); \n\n# Misc\n\n## Where does this work? \n\n### Android\n\nCurrent development is done with Cordova 3.0.0 on Android 4.x. Theoretically this code runs on PhoneGap 2.9 and greater. It should support Android-10 (2.3.2) and greater, but I only test with Android 4.x.\n\nDevelopment Devices include\n * Samsung Galaxy Tab 10.1 (GT-P7510) with Android 4.0.4 (see [Issue #8](https://github.com/don/BluetoothSerial/issues/8))\n * Google Nexus S with Android 4.1.2\n * Nexus 4 with Android 4.2.2\n * Samsung Galaxy S4 with Android 4.3\n\nOn the Arduino side I test with [Sparkfun Mate Silver](https://www.sparkfun.com/products/10393) and the [Seeed Studio Bluetooth Shield](http://www.seeedstudio.com/depot/bluetooth-shield-p-866.html?cPath=19_21). The code should be generic and work with most hardware.\n \n### iOS\n\n**NOTE: Currently iOS only works with RedBear Labs BLE Mini Hardware**\n\nThis plugin was developed with Cordova 3.0 using iOS 6.x on an iPad 4 connecting to a [RedBearLab BLEMini](http://redbearlab.com/blemini).\n\nEnsure that you have update the BLE Mini firmware to at least [Biscuit-UART_20130313.bin](https://github.com/RedBearLab/Biscuit/tree/master/release).\n \n## Props\n\n### Android\n\nMost of the Bluetooth implementation was borrows from the Bluetooth Chat example in the Android SDK.\n\n### iOS\n\nThe iOS code uses RedBearLab's [BLE_Framework](https://github.com/RedBearLab/Release/tree/master/BLEMini).\n\n### API\n\nThe API for available, read, readUntil was influenced by the [BtSerial Library for Processing for Arduino](https://github.com/arduino/BtSerial)\n\n## Wrong Bluetooth Plugin?\n\nIf you don't need **serial** over Bluetooth, try the [PhoneGap Bluetooth Plugin for Android](https://github.com/phonegap/phonegap-plugins/tree/master/Android/Bluetooth)\n\n## Feedback\n \nTry the code. If you find an problem or missing feature, file an issue or create a pull request.\n\n","readmeFilename":"README.md","_id":"com.megster.cordova.bluetoothserial@0.2.1","dist":{"shasum":"1a1ef8a35b85caa021141cc266209504a0389218","tarball":"http://registry.cordova.io/com.megster.cordova.bluetoothserial/-/com.megster.cordova.bluetoothserial-0.2.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"don","email":"don.coleman@gmail.com"},"maintainers":[{"name":"don","email":"don.coleman@gmail.com"}]},"0.2.2":{"version":"0.2.2","name":"com.megster.cordova.bluetoothserial","cordova_name":"Bluetooth Serial","description":"Bluetooth Serial Communication Plugin","license":"Apache 2.0","keywords":["bluetooth"," arduino"],"engines":[{"name":"cordova","version":">=2.9.0"}],"readme":"# Bluetooth Serial Plugin for PhoneGap\n\nThis plugin enables serial communication over Bluetooth. It was written for communicating between Android or iOS and an Arduino.\n\nAndroid uses Classic Bluetooth. iOS uses Bluetooth Low Energy.\n\n## Supported Platforms\n\n* Android\n* iOS (with [BLEMini](http://redbearlab.com/blemini))\n\n## Limitations\n\n * The phone must initiate the Bluetooth connection\n * Data sent over the connection is assumed to be Strings\n * iOS Bluetooth Low Energy requires iPhone 4S, iPhone5, iPod 5, or iPad3+\n\n# Installing \n\nInstall with Cordova cli\n\n $ cordova plugin add https://github.com/don/BluetoothSerial.git\n \nThis plugin is also available for [PhoneGap Build](https://build.phonegap.com/plugins/23)\n\n# API\n\n## Methods\n\n- [bluetoothSerial.connect](#connect)\n- [bluetoothSerial.connectInsecure](#connectInsecure)\n- [bluetoothSerial.disconnect](#disconnect)\n- [bluetoothSerial.write](#write)\n- [bluetoothSerial.available](#available)\n- [bluetoothSerial.read](#read)\n- [bluetoothSerial.readUntil](#readUntil)\n- [bluetoothSerial.subscribe](#subscribe)\n- [bluetoothSerial.unsubscribe](#unsubscribe)\n- [bluetoothSerial.clear](#clear)\n- [bluetoothSerial.list](#list)\n- [bluetoothSerial.isEnabled](#isenabled)\n- [bluetoothSerial.isConnected](#isconnected)\n\n## connect\n\nConnect to a Bluetooth device.\n\n bluetoothSerial.connect(macAddress_or_uuid, connectSuccess, connectFailure);\n\n### Description\n\nFunction `connect` connects to a Bluetooth device. The callback is long running. Success will be called when the connection is successful. Failure is called if the connection fails, or later if the connection disconnects. An error message is passed to the failure callback.\n\n#### Android\nFor Android, `connect` takes a macAddress of the remote device. \n\n#### iOS\nFor iOS, `connect` takes the UUID of the remote device. Optionally, you can pass an **empty string** and the plugin will connect to the first BLE peripheral.\n\n### Parameters\n\n- __macAddress_or_uuid__: Identifier of the remote device. \n- __connectSuccess__: Success callback function that is invoked when the connection is successful. \n- __connectFailure__: Error callback function, invoked when error occurs or the connection disconnects.\n\n## connectInsecure\n\nConnect insecurely to a Bluetooth device.\n\n bluetoothSerial.connectInsecure(macAddress, connectSuccess, connectFailure);\n\n### Description\n\nFunction `connectInsecure` works like [connect](#connect), but creates an insecure connection to a Bluetooth device. See the [Android docs](http://goo.gl/1mFjZY) for more information.\n\n#### Android\nFor Android, `connectInsecure` takes a macAddress of the remote device. \n\n#### iOS\n`connectInsecure` is **not supported** on iOS.\n\n### Parameters\n\n- __macAddress__: Identifier of the remote device. \n- __connectSuccess__: Success callback function that is invoked when the connection is successful. \n- __connectFailure__: Error callback function, invoked when error occurs or the connection disconnects.\n\n\n## disconnect\n\nDisconnect.\n\n bluetoothSerial.disconnect([success], [failure]);\n\n### Description\n\nFunction `disconnect` disconnects the current connection.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## write\n\nWrites data to the serial port.\n\n bluetoothSerial.write(data, success, failure);\n\n### Description\n\nFunction `write` data to the serial port. Data must be a String.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## available\n\nGets the number of bytes of data available.\n\n bluetoothSerial.available(success, failure);\n\n### Description\n\nFunction `available` gets the number of bytes of data available. The bytes are passed as a parameter to the success callback.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.available(function (numBytes) {\n console.log(\"There are \" + numBytes + \" available to read.\");\n }, failure);\n\n## read\n\nReads data from the buffer.\n\n bluetoothSerial.read(success, failure);\n\n### Description\n\nFunction `read` reads the data from the buffer. The data is passed to the success callback as a String. Calling `read` when no data is available will pass an empty String to the callback.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with the number of bytes available to be read.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.read(function (data) {\n console.log(data);\n }, failure);\n\n## readUntil\n\nReads data from the buffer until it reaches a delimiter.\n\n bluetoothSerial.readUntil('\\n', success, failure);\n\n### Description\n\nFunction `readUntil` reads the data from the buffer until it reaches a delimiter. The data is passed to the success callback as a String. If the buffer does not contain the delimiter, an empty String is passed to the callback. Calling `read` when no data is available will pass an empty String to the callback.\n\n### Parameters\n\n- __delimiter__: delimiter\n- __success__: Success callback function that is invoked with the data.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.readUntil('\\n', function (data) {\n console.log(data);\n }, failure);\n \n## subscribe \n\nSubscribe to be notified when data is received.\n\n bluetoothSerial.subscribe('\\n', success, failure);\n\n### Description\n\nFunction `subscribe` registers a callback that is called when data is received. A delimiter must be specified. The callback is called with the data as soon as the delimiter string is read. The callback is a long running callback and will exist until `unsubscribe` is called.\n\n### Parameters\n\n- __delimiter__: delimiter\n- __success__: Success callback function that is invoked with the data.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n // the success callback is called whenever data is received\n bluetoothSerial.subscribe('\\n', function (data) {\n console.log(data);\n }, failure);\n\n## unsubscribe\n\nUnsubscribe from a subscription.\n\n bluetoothSerial.unsubscribe(success, failure);\n\n### Description\n\nFunction `unsubscribe` removes any notification added by `subscribe` and kills the callback.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.unsubscribe();\n\n## clear\n\nClears data in the buffer.\n\n bluetoothSerial.clear(success, failure);\n\n### Description\n\nFunction `clear` removes any data from the receive buffer.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## list\n\nLists bonded devices\n\n bluetoothSerial.list(success, failure);\n \n### Description\n\n#### Android\n\nFunction `list` lists the paired Bluetooth devices. The success callback is called with a list of objects.\n\nExample list passed to success callback. See [BluetoothDevice](http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#getName()) and [BluetoothClass#getDeviceClass](http://developer.android.com/reference/android/bluetooth/BluetoothClass.html#getDeviceClass()).\n\n [{\n \"class\": 276,\n \"address\": \"10:BF:48:CB:00:00\",\n \"name\": \"Nexus 7\"\n }, {\n \"class\": 7936,\n \"address\": \"00:06:66:4D:00:00\",\n \"name\": \"RN42\"\n }]\n \n#### iOS\n\nFunction `list` lists the discovered Bluetooth Low Energy peripheral. The success callback is called with a list of objects.\n\nExample list passed to success callback for iOS.\n\n [{\n \"uuid\": \"CC410A23-2865-F03E-FC6A-4C17E858E11E\",\n \"name\": \"Biscuit\"\n }]\n\n \n### Parameters\n\n- __success__: Success callback function that is invoked with a list of bonded devices.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.list(function(devices) {\n devices.forEach(function(device) {\n console.log(device.address);\n })\n }, failure);\n \n## isConnected\n\nReports the connection status. \n\n bluetoothSerial.isConnected(success, failure);\n\n### Description\n\nFunction `isConnected` calls the success callback when connected to a peer and the failure callback when *not* connected.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.isConnected(\n function() { \n console.log(\"Bluetooth is connected\");\n },\n function() { \n console.log(\"Bluetooth is *not* connected\");\n }\n ); \n \n## isEnabled\n\nReports if bluetooth is enabled.\n\n bluetoothSerial.isEnabled(success, failure);\n\n### Description\n\nFunction `isEnabled` calls the success callback when bluetooth is enabled and the failure callback when bluetooth is *not* enabled.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.isEnabled(\n function() { \n console.log(\"Bluetooth is enabled\");\n },\n function() { \n console.log(\"Bluetooth is *not* enabled\");\n }\n ); \n\n# Misc\n\n## Where does this work? \n\n### Android\n\nCurrent development is done with Cordova 3.0.0 on Android 4.x. Theoretically this code runs on PhoneGap 2.9 and greater. It should support Android-10 (2.3.2) and greater, but I only test with Android 4.x.\n\nDevelopment Devices include\n * Samsung Galaxy Tab 10.1 (GT-P7510) with Android 4.0.4 (see [Issue #8](https://github.com/don/BluetoothSerial/issues/8))\n * Google Nexus S with Android 4.1.2\n * Nexus 4 with Android 4.2.2\n * Samsung Galaxy S4 with Android 4.3\n\nOn the Arduino side I test with [Sparkfun Mate Silver](https://www.sparkfun.com/products/10393) and the [Seeed Studio Bluetooth Shield](http://www.seeedstudio.com/depot/bluetooth-shield-p-866.html?cPath=19_21). The code should be generic and work with most hardware.\n \n### iOS\n\n**NOTE: Currently iOS only works with RedBear Labs BLE Mini Hardware**\n\nThis plugin was developed with Cordova 3.0 using iOS 6.x on an iPad 4 connecting to a [RedBearLab BLEMini](http://redbearlab.com/blemini).\n\nEnsure that you have update the BLE Mini firmware to at least [Biscuit-UART_20130313.bin](https://github.com/RedBearLab/Biscuit/tree/master/release).\n \n## Props\n\n### Android\n\nMost of the Bluetooth implementation was borrows from the Bluetooth Chat example in the Android SDK.\n\n### iOS\n\nThe iOS code uses RedBearLab's [BLE_Framework](https://github.com/RedBearLab/Release/tree/master/BLEMini).\n\n### API\n\nThe API for available, read, readUntil was influenced by the [BtSerial Library for Processing for Arduino](https://github.com/arduino/BtSerial)\n\n## Wrong Bluetooth Plugin?\n\nIf you don't need **serial** over Bluetooth, try the [PhoneGap Bluetooth Plugin for Android](https://github.com/phonegap/phonegap-plugins/tree/master/Android/Bluetooth)\n\n## Feedback\n \nTry the code. If you find an problem or missing feature, file an issue or create a pull request.\n\n","readmeFilename":"README.md","_id":"com.megster.cordova.bluetoothserial@0.2.2","dist":{"shasum":"e9e95ba81fac6c4cd45a91fea44b306fe848e211","tarball":"http://registry.cordova.io/com.megster.cordova.bluetoothserial/-/com.megster.cordova.bluetoothserial-0.2.2.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"don","email":"don.coleman@gmail.com"},"maintainers":[{"name":"don","email":"don.coleman@gmail.com"}]}},"readme":"# Bluetooth Serial Plugin for PhoneGap\n\nThis plugin enables serial communication over Bluetooth. It was written for communicating between Android or iOS and an Arduino.\n\nAndroid uses Classic Bluetooth. iOS uses Bluetooth Low Energy.\n\n## Supported Platforms\n\n* Android\n* iOS (with [BLEMini](http://redbearlab.com/blemini))\n\n## Limitations\n\n * The phone must initiate the Bluetooth connection\n * Data sent over the connection is assumed to be Strings\n * iOS Bluetooth Low Energy requires iPhone 4S, iPhone5, iPod 5, or iPad3+\n\n# Installing \n\nUse [plugman](https://github.com/imhotep/plugman) to add BluetoothSerial to your Android project. Plugman requires [node.js](http://nodejs.org) and is installed through npm.\n\nInstall plugman (v0.7.7 or greater)\n\n $ npm install -g plugman\n\nGet the latest source code\n\n $ git clone https://github.com/don/BluetoothSerial.git\n\nInstall the plugin\n\nAndroid\n\n $ plugman --platform android --project /path/to/your/project --plugin /path/to/BluetoothSerial\n\niOS\n\n $ plugman --platform ios --project /path/to/your/project --plugin /path/to/BluetoothSerial\n\nModify your HTML to include bluetoothSerial.js\n\n <script type=\"text/javascript\" src=\"cordova-2.7.0.js\"></script>\n <script type=\"text/javascript\" src=\"js/bluetoothSerial.js\"></script>\n <script type=\"text/javascript\" src=\"js/index.js\"></script>\n\nRequire bluetoothSerial in your JavaScript\n\n var bluetoothSerial = cordova.require('bluetoothSerial');\n\n# API\n\n## Methods\n\n- [bluetoothSerial.connect](#connect)\n- [bluetoothSerial.disconnect](#disconnect)\n- [bluetoothSerial.write](#write)\n- [bluetoothSerial.available](#available)\n- [bluetoothSerial.read](#read)\n- [bluetoothSerial.readUntil](#readUntil)\n- [bluetoothSerial.subscribe](#subscribe)\n- [bluetoothSerial.unsubscribe](#unsubscribe)\n- [bluetoothSerial.clear](#clear)\n- [bluetoothSerial.list](#list)\n- [bluetoothSerial.isEnabled](#isenabled)\n- [bluetoothSerial.isConnected](#isconnected)\n\n## connect\n\nConnect to a Bluetooth device.\n\n bluetoothSerial.connect(macAddress_or_uuid, connectSuccess, connectFailure);\n\n### Description\n\nFunction `connect` connects to a Bluetooth device. The callback is long running. Success will be called when the connection is successful. Failure is called if the connection fails, or later if the connection disconnects. An error message is passed to the failure callback.\n\n#### Android\nFor Android, `connect` takes a macAddress of the remote device. \n\n#### iOS\nFor iOS, `connect` takes the UUID of the remote device. Optionally, you can pass an **empty string** and the plugin will connect to the first BLE peripheral.\n\n### Parameters\n\n- __macAddress_or_uuid__: Identifier of the remote device. \n- __connectSuccess__: Success callback function that is invoked when the connection is successful. \n- __connectFailure__: Error callback function, invoked when error occurs or the connection disconnects.\n\n## disconnect\n\nDisconnect.\n\n bluetoothSerial.disconnect([success], [failure]);\n\n### Description\n\nFunction `disconnect` disconnects the current connection.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## write\n\nWrites data to the serial port.\n\n bluetoothSerial.write(data, success, failure);\n\n### Description\n\nFunction `write` data to the serial port. Data must be a String.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## available\n\nGets the number of bytes of data available.\n\n bluetoothSerial.available(success, failure);\n\n### Description\n\nFunction `available` gets the number of bytes of data available. The bytes are passed as a parameter to the success callback.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.available(function (numBytes) {\n console.log(\"There are \" + numBytes + \" available to read.\");\n }, failure);\n\n## read\n\nReads data from the buffer.\n\n bluetoothSerial.read(success, failure);\n\n### Description\n\nFunction `read` reads the data from the buffer. The data is passed to the success callback as a String. Calling `read` when no data is available will pass an empty String to the callback.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with the number of bytes available to be read.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.read(function (data) {\n console.log(data);\n }, failure);\n\n## readUntil\n\nReads data from the buffer until it reaches a delimiter.\n\n bluetoothSerial.readUntil('\\n', success, failure);\n\n### Description\n\nFunction `readUntil` reads the data from the buffer until it reaches a delimiter. The data is passed to the success callback as a String. If the buffer does not contain the delimiter, an empty String is passed to the callback. Calling `read` when no data is available will pass an empty String to the callback.\n\n### Parameters\n\n- __delimiter__: delimiter\n- __success__: Success callback function that is invoked with the data.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.readUntil('\\n', function (data) {\n console.log(data);\n }, failure);\n \n## subscribe \n\nSubscribe to be notified when data is received.\n\n bluetoothSerial.subscribe('\\n', success, failure);\n\n### Description\n\nFunction `subscribe` registers a callback that is called when data is received. A delimiter must be specified. The callback is called with the data as soon as the delimiter string is read. The callback is a long running callback and will exist until `unsubscribe` is called.\n\n### Parameters\n\n- __delimiter__: delimiter\n- __success__: Success callback function that is invoked with the data.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n // the success callback is called whenever data is received\n bluetoothSerial.subscribe('\\n', function (data) {\n console.log(data);\n }, failure);\n\n## unsubscribe\n\nUnsubscribe from a subscription.\n\n bluetoothSerial.unsubscribe(success, failure);\n\n### Description\n\nFunction `unsubscribe` removes any notification added by `subscribe` and kills the callback.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.unsubscribe();\n\n## clear\n\nClears data in the buffer.\n\n bluetoothSerial.clear(success, failure);\n\n### Description\n\nFunction `clear` removes any data from the receive buffer.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## list\n\nLists bonded devices\n\n bluetoothSerial.list(success, failure);\n \n### Description\n\n#### Android\n\nFunction `list` lists the paired Bluetooth devices. The success callback is called with a list of objects.\n\nExample list passed to success callback. See [BluetoothDevice](http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#getName()) and [BluetoothClass#getDeviceClass](http://developer.android.com/reference/android/bluetooth/BluetoothClass.html#getDeviceClass()).\n\n [{\n \"class\": 276,\n \"address\": \"10:BF:48:CB:00:00\",\n \"name\": \"Nexus 7\"\n }, {\n \"class\": 7936,\n \"address\": \"00:06:66:4D:00:00\",\n \"name\": \"RN42\"\n }]\n \n#### iOS\n\nFunction `list` lists the discovered Bluetooth Low Energy peripheral. The success callback is called with a list of objects.\n\nExample list passed to success callback for iOS.\n\n [{\n \"uuid\": \"CC410A23-2865-F03E-FC6A-4C17E858E11E\",\n \"name\": \"Biscuit\"\n }]\n\n \n### Parameters\n\n- __success__: Success callback function that is invoked with a list of bonded devices.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.list(function(devices) {\n devices.forEach(function(device) {\n console.log(device.address);\n })\n }, failure);\n \n## isConnected\n\nReports the connection status. \n\n bluetoothSerial.isConnected(success, failure);\n\n### Description\n\nFunction `isConnected` calls the success callback when connected to a peer and the failure callback when *not* connected.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.isConnected(function (connected) {\n console.log(connected); // true or false\n }, failure); \n \n## isEnabled\n\nReports if bluetooth is enabled.\n\n bluetoothSerial.isEnabled(success, failure);\n\n### Description\n\nFunction `isEnabled` calls the success callback when bluetooth is enabled and the failure callback when bluetooth is *not* enabled.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n bluetoothSerial.isEnabled(function (enabled) {\n console.log(enabled); // true or false\n }, failure); \n\n# Misc\n\n## Where does this work? \n\n### Android\nThis plugin was developed with PhoneGap 2.7.0 using Android 4.2.2 on a Nexus 4 connecting to a [Sparkfun Mate Silver](https://www.sparkfun.com/products/10393). The code should be generic and work with most hardware.\n \n### iOS\nThis plugin was developed with PhoneGap 2.7.0 using iOS 6.x on an iPad 4 connecting to a [RedBearLab BLEMini](http://redbearlab.com/blemini).\n\nEnsure that you have update the BLE Mini firmware to at least [Biscuit-UART_20130313.bin](https://github.com/RedBearLab/Biscuit/tree/master/release).\n \n## Props\n\n### Android\n\nMost of the Bluetooth implementation was borrows from the Bluetooth Chat example in the Android SDK.\n\n### iOS\n\nThe iOS code uses RedBearLab's [BLE_Framework](https://github.com/RedBearLab/Release/tree/master/BLEMini).\n\n### API\n\nThe API for available, read, readUntil was influenced by the [BtSerial Library for Processing for Arduino](https://github.com/arduino/BtSerial)\n\n## Wrong Bluetooth Plugin?\n\nIf you don't need **serial** over Bluetooth, try the [PhoneGap Bluetooth Plugin for Android](https://github.com/phonegap/phonegap-plugins/tree/master/Android/Bluetooth)\n\n## Feedback\n \nTry the code. If you find an problem or missing feature, file an issue or create a pull request.\n\n","maintainers":[{"name":"don","email":"don.coleman@gmail.com"}],"time":{"modified":"2013-11-13T21:58:10.497Z","created":"2013-08-05T01:29:26.481Z","0.2.0":"2013-08-05T01:29:45.442Z","0.2.1":"2013-10-29T21:31:38.915Z","0.2.2":"2013-11-13T21:58:10.497Z"},"_attachments":{"com.megster.cordova.bluetoothserial-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-cEUBjgOtsUSmdQ/8fox/Bw==","length":13272320,"stub":true},"com.megster.cordova.bluetoothserial-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-qVHAGWL4zbYSVcS65An0kA==","length":11467320,"stub":true},"com.megster.cordova.bluetoothserial-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-aV/rnqpnT07naOdtiWXl+A==","length":11467035,"stub":true}}}},
{"id":"com.megster.cordova.rfduino","key":"com.megster.cordova.rfduino","value":{"rev":"5-fd0d192f3a07b0fc78b7e1358eb09110"},"doc":{"_id":"com.megster.cordova.rfduino","_rev":"5-fd0d192f3a07b0fc78b7e1358eb09110","name":"com.megster.cordova.rfduino","description":"Cordova Plugin for RFduino","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"version":"0.0.1","name":"com.megster.cordova.rfduino","cordova_name":"RFduino","description":"Cordova Plugin for RFduino","license":"Apache 2.0","keywords":["bluetooth"," arduino"," rfduino"],"engines":[{"name":"cordova","version":">=3.1.0"}],"readme":"# RFduino Plugin for PhoneGap\n\nThis plugin enabled Bluetooth communication between a phone and an [RFduino](http://www.rfduino.com/).\n\n## Supported Platforms\n\n* iOS\n\n## Limitations\n\nThis is an early version of plugin, the API is likely to change.\n\nThe current version will only connect to one RFduino at a time.\n\nFor this version rfduino.write() only accepts strings and does not check if data exceeds the max size.\n\n# Installing\n\nInstall with Cordova cli\n\n $ cordova plugin add com.megster.cordova.rfduino\n\n# API\n\n## Methods\n\n- [rfduino.discover](#discover)\n- [rfduino.list](#list)\n\n- [rfduino.connect](#connect)\n- [rfduino.disconnect](#disconnect)\n\n- [rfduino.onData](#ondata)\n- [rfduino.write](#write)\n\n- [rfduino.isEnabled](#isenabled)\n- [rfduino.isConnected](#isconnected)\n\n\n## discover\n\nDiscover RFduino devices\n\n rfduino.discover(seconds, success, failure);\n\n### Description\n\nFunction `discover` discovers the local RFduino devices. The success callback is called each time a peripheral is discovered.\n\n {\n \"name\": \"RFduino\",\n \"uuid\": \"BD922605-1B07-4D55-8D09-B66653E51BBA\",\n \"advertising\": \"echo\",\n \"rssi\": -79\n }\n\n### Parameters\n\n- __seconds__: Number of seconds to run discovery\n- __success__: Success callback function that is invoked with a list of bonded devices.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n rfduino.discover(3, function(device) {\n console.log(JSON.stringify(device));\n }, failure);\n\n## list\n\nLists known devices\n\n rfduino.list(success, failure);\n\n### Description\n\nFunction `list` lists the known RFduino devices. The success callback is called with a list of objects.\n\nThis will return an empty list unless `discover` have previously run. You should prefer `discover` to `list`.\n\n [{\n \"name\": \"RFduino\",\n \"uuid\": \"AEC00232-2F92-4033-8E80-FD4C2533769C\",\n \"advertising\": \"echo\",\n \"rssi\": -79\n }, {\n \"name\": \"RFduino\",\n \"uuid\": \"AEC00232-2F92-4033-8E80-FD4C2533769C\",\n \"advertising\": \"temp\",\n \"rssi\": -55\n }]\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a list of bonded devices.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n rfduino.list(function(devices) {\n devices.forEach(function(device) {\n console.log(device.uuid);\n })\n }, failure);\n\n\n## connect\n\nConnect to a RFduino device.\n\n rfduino.connect(uuid, connectSuccess, connectFailure);\n\n### Description\n\nFunction `connect` connects to a RFduino device. The callback is long running. Success will be called when the connection is successful. Failure is called if the connection fails, or later if the connection disconnects. An error message is passed to the failure callback.\n\n### Parameters\n\n- __uuid__: UUID of the remote device\n- __connectSuccess__: Success callback function that is invoked when the connection is successful.\n- __connectFailure__: Error callback function, invoked when error occurs or the connection disconnects.\n\n## disconnect\n\nDisconnect.\n\n rfduino.disconnect([success], [failure]);\n\n### Description\n\nFunction `disconnect` disconnects the current connection.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## onData\n\nAdds a callback for processing data from the RFduino.\n\n rfduino.onData(success, failure);\n\n### Description\n\nFunction `onData` registers a function that is called whenever phone receives data from the RFduino.\n\nRaw data is passed from ObjectiveC the callback as an [ArrayBuffer](http://www.html5rocks.com/en/tutorials/webgl/typed_arrays/) and must be processed.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## write\n\nWrites data to the currently connected device\n\n rfduino.write(data, success, failure);\n\n### Description\n\nFunction `write` writes data to the connected device. **Data must be a String.** for this version.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## isConnected\n\nReports the connection status.\n\n rfduino.isConnected(success, failure);\n\n### Description\n\nFunction `isConnected` calls the success callback when connected to a peer and the failure callback when *not* connected.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n rfduino.isConnected(\n function() {\n console.log(\"RFduino is connected\");\n },\n function() {\n console.log(\"RFduino is *not* connected\");\n }\n );\n\n## isEnabled\n\nReports if bluetooth is enabled.\n\n rfduino.isEnabled(success, failure);\n\n### Description\n\nFunction `isEnabled` calls the success callback when Bluetooth is enabled and the failure callback when Bluetooth is *not* enabled.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n rfduino.isEnabled(\n function() {\n console.log(\"Bluetooth is enabled\");\n },\n function() {\n console.log(\"Bluetooth is *not* enabled\");\n }\n );\n\n# License\n\nApache 2.0\n\n# Feedback\n\nTry the code. If you find an problem or missing feature, file an issue or create a pull request.\n\n","readmeFilename":"README.md","_id":"com.megster.cordova.rfduino@0.0.1","dist":{"shasum":"f71d2ae1edb1c986f1199adabf6e1373bc0822aa","tarball":"http://registry.cordova.io/com.megster.cordova.rfduino/-/com.megster.cordova.rfduino-0.0.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"don","email":"don.coleman@gmail.com"},"maintainers":[{"name":"don","email":"don.coleman@gmail.com"}]},"0.0.2":{"version":"0.0.2","name":"com.megster.cordova.rfduino","cordova_name":"RFduino","description":"Cordova Plugin for RFduino","license":"Apache 2.0","keywords":["bluetooth"," arduino"," rfduino"],"engines":[{"name":"cordova","version":">=3.1.0"}],"readme":"# RFduino Plugin for PhoneGap\n\nThis plugin enabled Bluetooth communication between a phone and an [RFduino](http://www.rfduino.com/).\n\n## Supported Platforms\n\n* iOS\n* Android\n\nAndroid 4.3 or greater is required. Update the generated cordova project from target 17 to 18 or 19\n\n $ android update project -p platforms/android -t android-19\n\n## Limitations\n\nThis is an early version of plugin, the API is likely to change.\n\nThe current version will only connect to one RFduino at a time.\n\nFor this version rfduino.write() only accepts strings and does not check if data exceeds the max size.\n\n# Installing\n\nInstall with Cordova cli\n\n $ cordova plugin add com.megster.cordova.rfduino\n\n# API\n\n## Methods\n\n- [rfduino.discover](#discover)\n- [rfduino.list](#list)\n\n- [rfduino.connect](#connect)\n- [rfduino.disconnect](#disconnect)\n\n- [rfduino.onData](#ondata)\n- [rfduino.write](#write)\n\n- [rfduino.isEnabled](#isenabled)\n- [rfduino.isConnected](#isconnected)\n\n\n## discover\n\nDiscover RFduino devices\n\n rfduino.discover(seconds, success, failure);\n\n### Description\n\nFunction `discover` discovers the local RFduino devices. The success callback is called each time a peripheral is discovered.\n\n {\n \"name\": \"RFduino\",\n \"uuid\": \"BD922605-1B07-4D55-8D09-B66653E51BBA\",\n \"advertising\": \"echo\",\n \"rssi\": -79\n }\n\n### Parameters\n\n- __seconds__: Number of seconds to run discovery\n- __success__: Success callback function that is invoked with a list of bonded devices.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n rfduino.discover(3, function(device) {\n console.log(JSON.stringify(device));\n }, failure);\n\n## list\n\nLists known devices\n\n rfduino.list(success, failure);\n\n### Description\n\nFunction `list` lists the known RFduino devices. The success callback is called with a list of objects.\n\nThis will return an empty list unless `discover` have previously run. You should prefer `discover` to `list`.\n\n [{\n \"name\": \"RFduino\",\n \"uuid\": \"AEC00232-2F92-4033-8E80-FD4C2533769C\",\n \"advertising\": \"echo\",\n \"rssi\": -79\n }, {\n \"name\": \"RFduino\",\n \"uuid\": \"AEC00232-2F92-4033-8E80-FD4C2533769C\",\n \"advertising\": \"temp\",\n \"rssi\": -55\n }]\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a list of bonded devices.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n rfduino.list(function(devices) {\n devices.forEach(function(device) {\n console.log(device.uuid);\n })\n }, failure);\n\n\n## connect\n\nConnect to a RFduino device.\n\n rfduino.connect(uuid, connectSuccess, connectFailure);\n\n### Description\n\nFunction `connect` connects to a RFduino device. The callback is long running. Success will be called when the connection is successful. Failure is called if the connection fails, or later if the connection disconnects. An error message is passed to the failure callback.\n\n### Parameters\n\n- __uuid__: UUID of the remote device\n- __connectSuccess__: Success callback function that is invoked when the connection is successful.\n- __connectFailure__: Error callback function, invoked when error occurs or the connection disconnects.\n\n## disconnect\n\nDisconnect.\n\n rfduino.disconnect([success], [failure]);\n\n### Description\n\nFunction `disconnect` disconnects the current connection.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## onData\n\nAdds a callback for processing data from the RFduino.\n\n rfduino.onData(success, failure);\n\n### Description\n\nFunction `onData` registers a function that is called whenever phone receives data from the RFduino.\n\nRaw data is passed from ObjectiveC the callback as an [ArrayBuffer](http://www.html5rocks.com/en/tutorials/webgl/typed_arrays/) and must be processed.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## write\n\nWrites data to the currently connected device\n\n rfduino.write(data, success, failure);\n\n### Description\n\nFunction `write` writes data to the connected device. **Data must be a String.** for this version.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## isConnected\n\nReports the connection status.\n\n rfduino.isConnected(success, failure);\n\n### Description\n\nFunction `isConnected` calls the success callback when connected to a peer and the failure callback when *not* connected.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n rfduino.isConnected(\n function() {\n console.log(\"RFduino is connected\");\n },\n function() {\n console.log(\"RFduino is *not* connected\");\n }\n );\n\n## isEnabled\n\nReports if bluetooth is enabled.\n\n rfduino.isEnabled(success, failure);\n\n### Description\n\nFunction `isEnabled` calls the success callback when Bluetooth is enabled and the failure callback when Bluetooth is *not* enabled.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n rfduino.isEnabled(\n function() {\n console.log(\"Bluetooth is enabled\");\n },\n function() {\n console.log(\"Bluetooth is *not* enabled\");\n }\n );\n\n# License\n\nApache 2.0\n\n# Feedback\n\nTry the code. If you find an problem or missing feature, file an issue or create a pull request.\n\n","readmeFilename":"README.md","_id":"com.megster.cordova.rfduino@0.0.2","dist":{"shasum":"dd68f2ee02ff8cb157dcfcd8ee8d75fa368afe7c","tarball":"http://registry.cordova.io/com.megster.cordova.rfduino/-/com.megster.cordova.rfduino-0.0.2.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"don","email":"don.coleman@gmail.com"},"maintainers":[{"name":"don","email":"don.coleman@gmail.com"}]}},"readme":"# RFduino Plugin for PhoneGap\n\nThis plugin enabled Bluetooth communication between a phone and an [RFduino](http://www.rfduino.com/).\n\n## Supported Platforms\n\n* iOS\n\n## Limitations\n\nThis is an early version of plugin, the API is likely to change.\n\nThe current version will only connect to one RFduino at a time.\n\nFor this version rfduino.write() only accepts strings and does not check if data exceeds the max size.\n\n# Installing\n\nInstall with Cordova cli\n\n $ cordova plugin add com.megster.cordova.rfduino\n\n# API\n\n## Methods\n\n- [rfduino.discover](#discover)\n- [rfduino.list](#list)\n\n- [rfduino.connect](#connect)\n- [rfduino.disconnect](#disconnect)\n\n- [rfduino.onData](#ondata)\n- [rfduino.write](#write)\n\n- [rfduino.isEnabled](#isenabled)\n- [rfduino.isConnected](#isconnected)\n\n\n## discover\n\nDiscover RFduino devices\n\n rfduino.discover(seconds, success, failure);\n\n### Description\n\nFunction `discover` discovers the local RFduino devices. The success callback is called each time a peripheral is discovered.\n\n {\n \"name\": \"RFduino\",\n \"uuid\": \"BD922605-1B07-4D55-8D09-B66653E51BBA\",\n \"advertising\": \"echo\",\n \"rssi\": -79\n }\n\n### Parameters\n\n- __seconds__: Number of seconds to run discovery\n- __success__: Success callback function that is invoked with a list of bonded devices.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n rfduino.discover(3, function(device) {\n console.log(JSON.stringify(device));\n }, failure);\n\n## list\n\nLists known devices\n\n rfduino.list(success, failure);\n\n### Description\n\nFunction `list` lists the known RFduino devices. The success callback is called with a list of objects.\n\nThis will return an empty list unless `discover` have previously run. You should prefer `discover` to `list`.\n\n [{\n \"name\": \"RFduino\",\n \"uuid\": \"AEC00232-2F92-4033-8E80-FD4C2533769C\",\n \"advertising\": \"echo\",\n \"rssi\": -79\n }, {\n \"name\": \"RFduino\",\n \"uuid\": \"AEC00232-2F92-4033-8E80-FD4C2533769C\",\n \"advertising\": \"temp\",\n \"rssi\": -55\n }]\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a list of bonded devices.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n rfduino.list(function(devices) {\n devices.forEach(function(device) {\n console.log(device.uuid);\n })\n }, failure);\n\n\n## connect\n\nConnect to a RFduino device.\n\n rfduino.connect(uuid, connectSuccess, connectFailure);\n\n### Description\n\nFunction `connect` connects to a RFduino device. The callback is long running. Success will be called when the connection is successful. Failure is called if the connection fails, or later if the connection disconnects. An error message is passed to the failure callback.\n\n### Parameters\n\n- __uuid__: UUID of the remote device\n- __connectSuccess__: Success callback function that is invoked when the connection is successful.\n- __connectFailure__: Error callback function, invoked when error occurs or the connection disconnects.\n\n## disconnect\n\nDisconnect.\n\n rfduino.disconnect([success], [failure]);\n\n### Description\n\nFunction `disconnect` disconnects the current connection.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## onData\n\nAdds a callback for processing data from the RFduino.\n\n rfduino.onData(success, failure);\n\n### Description\n\nFunction `onData` registers a function that is called whenever phone receives data from the RFduino.\n\nRaw data is passed from ObjectiveC the callback as an [ArrayBuffer](http://www.html5rocks.com/en/tutorials/webgl/typed_arrays/) and must be processed.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## write\n\nWrites data to the currently connected device\n\n rfduino.write(data, success, failure);\n\n### Description\n\nFunction `write` writes data to the connected device. **Data must be a String.** for this version.\n\n### Parameters\n\n- __success__: Success callback function that is invoked when the connection is successful. [optional]\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n## isConnected\n\nReports the connection status.\n\n rfduino.isConnected(success, failure);\n\n### Description\n\nFunction `isConnected` calls the success callback when connected to a peer and the failure callback when *not* connected.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n rfduino.isConnected(\n function() {\n console.log(\"RFduino is connected\");\n },\n function() {\n console.log(\"RFduino is *not* connected\");\n }\n );\n\n## isEnabled\n\nReports if bluetooth is enabled.\n\n rfduino.isEnabled(success, failure);\n\n### Description\n\nFunction `isEnabled` calls the success callback when Bluetooth is enabled and the failure callback when Bluetooth is *not* enabled.\n\n### Parameters\n\n- __success__: Success callback function that is invoked with a boolean for connected status.\n- __failure__: Error callback function, invoked when error occurs. [optional]\n\n### Quick Example\n\n rfduino.isEnabled(\n function() {\n console.log(\"Bluetooth is enabled\");\n },\n function() {\n console.log(\"Bluetooth is *not* enabled\");\n }\n );\n\n# License\n\nApache 2.0\n\n# Feedback\n\nTry the code. If you find an problem or missing feature, file an issue or create a pull request.\n\n","maintainers":[{"name":"don","email":"don.coleman@gmail.com"}],"time":{"modified":"2013-11-19T07:17:19.031Z","created":"2013-11-18T00:18:38.221Z","0.0.1":"2013-11-18T00:18:38.727Z","0.0.2":"2013-11-19T07:17:19.031Z"},"_attachments":{"com.megster.cordova.rfduino-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-Nt0aogIhqsQFULina97rtw==","length":12313,"stub":true},"com.megster.cordova.rfduino-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-i6z9qQdbOTsjKvmgXHP2Ow==","length":8720,"stub":true}}}},
{"id":"com.mirasense.scanditsdk.plugin","key":"com.mirasense.scanditsdk.plugin","value":{"rev":"3-e70e2224846ff31a566e6d6b82be0f0b"},"doc":{"_id":"com.mirasense.scanditsdk.plugin","_rev":"3-e70e2224846ff31a566e6d6b82be0f0b","name":"com.mirasense.scanditsdk.plugin","description":"BarcodeScannerPlugin ====================","dist-tags":{"latest":"1.1.0"},"versions":{"1.1.0":{"version":"1.1.0","name":"com.mirasense.scanditsdk.plugin","cordova_name":"ScanditBarcodeScanner","engines":[],"readme":"BarcodeScannerPlugin\n====================\n\nCross platform Phonegap/Cordova Plugin of the Scandit Barcode Scanner SDK for iOS and Android\n\nFollow the detailed instructions below to add a high-performance barcode scanner to your app in 5 min using [Plugman](https://github.com/apache/cordova-plugman/).\n\nIf you don't have a Phonegap app yet, but want to try out our Phonegap/Cordova Plugins anyway, [follow the instructions on phonegap.com](http://docs.phonegap.com/) to generate a sample app. \n\n\nScandit SDK Plugin Integration with Plugman \n------------------------\n\nThe easiest way to install the Scandit plugin into your Phonegap/Cordova project is to use [Plugman](https://github.com/apache/cordova-plugman/). \n\n* Sign up and download the Scandit SDK Cordova Plugins for iOS and Android from your Scandit SDK account.\n* Generate a sample Cordova project or use your existing Cordova project\n\n```\n\tcordova create .\n\tcordova platform add ios\n\tcordova platform add android\n```\n\n* Install Android and iOS Scandit SDK Plugin using [Plugman](https://github.com/apache/cordova-plugman/)\n\n```\n plugman install --platform android --project <your project dir> --plugin <path to unzipped ScanditSDK Plugin for Android> \n```\n\n```\n plugman install --platform ios --project <your project dir> --plugin <path to unzipped ScanditSDK Plugin for iOS> \n```\n \n* Start using the Scandit SDK in your html code \n * Get the app key from your Scandit SDK account\n * Invoke the Scandit SDK scanner by invoking the cordova.exec() function with the following parameters:\n\n\t`cordova.exec(function(success), function(cancel), \"ScanditSDK\", \"scan\", [\"ENTER YOUR APP KEY HERE\",{}]);`\n\n * See full example and API below for a detailed list of options. \n\nTo install [Plugman](https://github.com/apache/cordova-plugman/):\n\n npm install -g plugman\n\n\n\nManual Scandit SDK Plugin Integration for iOS \n------------------------\n\n* Download and add the Scandit SDK for iOS library to your Xcode Cordova Project:\n * Sign up for a free community license (or one of the enterprise packages) at http://www.scandit.com. \n * Download the Scandit SDK Cordova Plugin for iOS version from your Scandit account and unzip it. \n * Open your project in Xcode, right-click on the `Plugins` group in the navigation pane and select \"Add Files to <name of your project>\" \n * Choose the files folders below from the zip you downloaded above (make sure you select the options `create group for added folders` and the `copy items to destination group's folder`):\n * ScanditSDK.h\n * ScanditSDK.mm\n * ScanditSDKRotatingBarcodePicker.h\n * ScanditSDKRotatingBarcodePicker.m\n * ScanditSDK folder (which includes the libscanditsdk-iphone-<version>.a static lib)\n\n* Add frameworks needed by Scandit Barcode Scanner SDK:\n * Click on your project in the navigation pane of Xcode, then select your target and the tab \"Build Phases\" \n * Under the entry \"Link Binary with Libraries\", add the following libraries by clicking the \"+\" button (most of them will already be listed):\n * AudioToolbox.framework\n * AVFoundation.framework\n * CoreGraphics.framework\n * CoreLocation.framework\n * CoreMedia.framework\n * CoreVideo.framework\n * QuartzCore.framework\n * SystemConfiguration.framework\n * libiconv.dylib\n * libz.dylib \n * libc++.dylib\n \n* Register the Plugin with your Cordova App:\n\n * Open the config.xml file and add the following xml element to the widget element\n\n ```\n\t<feature name=\"ScanditSDK\" >\n\t\t<param name=\"ios-package\" value=\"ScanditSDK\" />\n\t</feature>\n ```\n\n\n* Start using the Scandit SDK in your html code \n * Get the app key from your Scandit SDK account\n * Invoke the Scandit SDK scanner by invoking the cordova.exec() function with the following parameters:\n\tSample (minimal) `scan` usage: `cordova.exec(function(success), function(cancel), \"ScanditSDK\", \"scan\", [\"ENTER YOUR APP KEY HERE\",{}]);`\n * See full example and API below for a detailed list of options. \n \n\nManual Scandit SDK Plugin Integration for Android\n------------------------\n\n* Download and add the Scandit SDK library for Android to your Eclipse Cordova Project:\n * Sign up for a free community license (or one of the enterprise packages) at http://www.scandit.com. \n * Download the latest Scandit SDK Phonegap/Cordova for Android from your Scandit account. \n * Unzip the downloaded zip file \n * Copy the contents of the \"libs\" folder from the unzipped folder to the `libs` folder of your Phonegap/Cordova project. The `libs` folder includes the shared library libscanditsdk-android-*.so (in a folder called armeabi)\nand the scanditsdk-barcodepicker-android-*.jar.\n * Copy the `res/raw` folder to the `res` folder of your Phonegap/Cordova project \n * Copy the classes ScanditSDK.java and ScanditSDKActivity.java from the src/android folder (in the com.mirasense.scanditsdk.plugin package) into your project preserving the package hierarchy.\n * Refresh your eclipse project for the files to show up in Eclipse\n\n* Add ScanditSDK jar file to your build path:\n * Right-click on the scanditsdk-barcodepicker-android-*.jar file in the libs folder and select \"Add to Build Path\"\n \n* Register the Plugin with your Cordova App and set the permissions correctly:\n * Add ScanditSDK Activity to the \"application\" section of your app's AndroidManifest.xml file\n\n ```\n <activity android:name=\"com.mirasense.scanditsdk.plugin.ScanditSDKActivity\"/>\n ```\n * Make sure the following permissions are listed in your AndroidManifest.xml file \n\n ```\n\t<uses-permission android:name=\"android.permission.CAMERA\" />\n\t<uses-permission android:name=\"android.permission.VIBRATE\" />\n\t<uses-permission android:name=\"android.permission.INTERNET\" />\n ```\n * Add the following xml element to the res/xml/config.xml resource's widget element\n\n ```\n\n <feature name=\"ScanditSDK\">\n <param name=\"android-package\" value=\"com.mirasense.scanditsdk.plugin.ScanditSDK\"/>\n </feature>\n ```\n\n\n* Start using the Scandit SDK in your html code \n * Get the app key from your Scandit SDK account\n * Invoke the Scandit SDK scanner by invoking the cordova.exec() function with the following parameters:\n\n\tSample (minimal) `scan` usage: \n```\ncordova.exec(function(success), function(cancel), \"ScanditSDK\", \"scan\", [\"YOUR APP KEY HERE\",{}]);\n```\n * See full example and API below for a detailed list of options. \n\n\n### Sample HTML + JS\n\n```html\n<!DOCTYPE html>\n<html>\n <!--\n #\n # Licensed to the Apache Software Foundation (ASF) under one\n # or more contributor license agreements. See the NOTICE file\n # distributed with this work for additional information\n # regarding copyright ownership. The ASF licenses this file\n # to you under the Apache License, Version 2.0 (the\n # \"License\"); you may not use this file except in compliance\n # with the License. You may obtain a copy of the License at\n #\n # http://www.apache.org/licenses/LICENSE-2.0\n #\n # Unless required by applicable law or agreed to in writing,\n # software distributed under the License is distributed on an\n # \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n # KIND, either express or implied. See the License for the\n # specific language governing permissions and limitations\n # under the License.\n #\n -->\n <head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <meta name = \"format-detection\" content = \"telephone=no\"/>\n <meta name=\"viewport\" content=\"user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width;\" />\n <link rel=\"stylesheet\" type=\"text/css\" href=\"css/index.css\" />\n <title>Scandit SDK</title>\n </head>\n <body onload=\"onBodyLoad()\" style=\"background: url(img/ScanditSDKDemo-Splash.png) no-repeat;background-size: 100%;background-color: #000000\">\n <script type=\"text/javascript\" src=\"cordova.js\"></script>\n <script type=\"text/javascript\" src=\"js/index.js\"></script>\n <script type=\"text/javascript\">\n function onBodyLoad()\n {\n document.addEventListener(\"deviceready\", onDeviceReady, false);\n }\n \n\t function success(resultArray) {\n\n\t\talert(\"Scanned \" + resultArray[0] + \" code: \" + resultArray[1]);\n\n \t// NOTE: Scandit SDK Phonegap Plugin Versions 1.* for iOS report\n \t// the scanning result as a concatenated string.\n \t// Starting with version 2.0.0, the Scandit SDK Phonegap\n \t// Plugin for iOS reports the result as an array\n \t// identical to the way the Scandit SDK plugin for Android reports results.\n \n \t// If you are running the Scandit SDK Phonegap Plugin Version 1.* for iOS,\n \t// use the following approach to generate a result array from the string result returned:\n \t// resultArray = result.split(\"|\");\n }\n \n function failure(error) {\n alert(\"Failed: \" + error);\n }\n \n function scan() {\n // See below for all available options. \n cordova.exec(success, failure, \"ScanditSDK\", \"scan\",\n [\"ENTER YOUR APP KEY HERE\",\n {\"beep\": true,\n \"1DScanning\" : true,\n \"2DScanning\" : true}]);\n }\n \n app.initialize();\n </script>\n \n <div align=\"center\" valign=\"center\">\n <input type=\"button\" value=\"scan\" onclick=\"scan()\" style=\"margin-top: 230px; width: 100px; height: 30px; font-size: 1em\"/>\n </div>\n </body>\n</html>\n\n```\n\n\nChangelog\n------------------------\n\n**Scandit SDK Phonegap Plugin for iOS and Android (2.2.0) - September 30th 2013**\n\n * upgraded to Scandit SDK for iOS 3.1.1 and Scandit SDK for Android 3.5.1 (see release notes in download section of your Scandit SDK for details)\n\n\n**Scandit SDK Phonegap Plugin for iOS (2.1.0) and Android (1.2.0) - August 6th 2013**\n\n * support for Phonegap/Cordova 3.0 \n\n * upgraded to Scandit SDK 3.0.4 for iOS (for details see release notes in download section of your Scandit SDK account), Android version of plugin still uses Scandit SDK 3.3.1 for Android\n\n\n**Scandit SDK Phonegap Plugin 2.0.1 for iOS only - June 17th 2013**\n\n * upgraded to Scandit SDK 3.0.3 for iOS which is a new bug fix release (see release notes of native iOS version for details)\n\n**Scandit SDK Phonegap Plugin 2.0.0 for iOS only - May 11th 2013**\n\n * upgraded to new Scandit SDK 3.0.1 for iOS which comprises various new features: full screen scanning, \n improved autofocus management, better scan performance and robustness, new cleaner scan screen interface \n with the option to add a button to switch cameras and new symbologies (PDF417 beta and MSI-Plessey).\n\n * IMPORTANT: updated Scandit SDK Phonegap Plugin API to reflect updates in Scandit SDK 3.0.1 for iOS. \n This includes a number of new API options (see below), a number of options have also disappeared. \n\n * harmonized return results of Android and iPhone Plugin. In previous versions, \n the iOS Plugin would return a string, while the Android Plugin would return an array. \n Starting with Scandit SDK Phonegap Plugin for iOS 2.0.0, the iOS Plugin will also return an array. \n\n\n\n**Scandit SDK Phonegap Plugin 1.1.0 for Android & iOS - April 2nd 2013**\n\n * upgraded to native Scandit SDK 2.2.7 for iOS and 3.3.1 for Android\n \n * includes support PLUGMAN\n\n * Fixed a bug that would freeze and stop the modal view from closing.\n\n * Scandit SDK Phonegap Plugin for Android now also supports barcode scanning in landscape mode.\n\n * Minor changes to ScanditSDKActivity.java \n\n\n\n\nAPI for Scandit SDK Phonegap Plugin iOS and Android \n------------------------\n\nSee http://www.scandit.com/support for more information \n\n\n\nLicense\n-------\n* This plug-in is released under the Apache 2.0 license: http://www.apache.org/licenses/LICENSE-2.0\n\n\n\nQuestions? Contact `info@scandit.com`.\n\n\n\n\n","readmeFilename":"README.md","description":"BarcodeScannerPlugin ====================","_id":"com.mirasense.scanditsdk.plugin@1.1.0","dist":{"shasum":"f8d7086a48ca7872289b1530433c3451e178ebfc","tarball":"http://registry.cordova.io/com.mirasense.scanditsdk.plugin/-/com.mirasense.scanditsdk.plugin-1.1.0.tgz"},"_from":"..\\BarcodeScannerPlugin-master","_npmVersion":"1.3.4","_npmUser":{"name":"palpatine222","email":"selenita108@hotmail.com"},"maintainers":[{"name":"palpatine222","email":"selenita108@hotmail.com"}]}},"readme":"BarcodeScannerPlugin\n====================\n\nCross platform Phonegap/Cordova Plugin of the Scandit Barcode Scanner SDK for iOS and Android\n\nFollow the detailed instructions below to add a high-performance barcode scanner to your app in 5 min using [Plugman](https://github.com/apache/cordova-plugman/).\n\nIf you don't have a Phonegap app yet, but want to try out our Phonegap/Cordova Plugins anyway, [follow the instructions on phonegap.com](http://docs.phonegap.com/) to generate a sample app. \n\n\nScandit SDK Plugin Integration with Plugman \n------------------------\n\nThe easiest way to install the Scandit plugin into your Phonegap/Cordova project is to use [Plugman](https://github.com/apache/cordova-plugman/). \n\n* Sign up and download the Scandit SDK Cordova Plugins for iOS and Android from your Scandit SDK account.\n* Generate a sample Cordova project or use your existing Cordova project\n\n```\n\tcordova create .\n\tcordova platform add ios\n\tcordova platform add android\n```\n\n* Install Android and iOS Scandit SDK Plugin using [Plugman](https://github.com/apache/cordova-plugman/)\n\n```\n plugman install --platform android --project <your project dir> --plugin <path to unzipped ScanditSDK Plugin for Android> \n```\n\n```\n plugman install --platform ios --project <your project dir> --plugin <path to unzipped ScanditSDK Plugin for iOS> \n```\n \n* Start using the Scandit SDK in your html code \n * Get the app key from your Scandit SDK account\n * Invoke the Scandit SDK scanner by invoking the cordova.exec() function with the following parameters:\n\n\t`cordova.exec(function(success), function(cancel), \"ScanditSDK\", \"scan\", [\"ENTER YOUR APP KEY HERE\",{}]);`\n\n * See full example and API below for a detailed list of options. \n\nTo install [Plugman](https://github.com/apache/cordova-plugman/):\n\n npm install -g plugman\n\n\n\nManual Scandit SDK Plugin Integration for iOS \n------------------------\n\n* Download and add the Scandit SDK for iOS library to your Xcode Cordova Project:\n * Sign up for a free community license (or one of the enterprise packages) at http://www.scandit.com. \n * Download the Scandit SDK Cordova Plugin for iOS version from your Scandit account and unzip it. \n * Open your project in Xcode, right-click on the `Plugins` group in the navigation pane and select \"Add Files to <name of your project>\" \n * Choose the files folders below from the zip you downloaded above (make sure you select the options `create group for added folders` and the `copy items to destination group's folder`):\n * ScanditSDK.h\n * ScanditSDK.mm\n * ScanditSDKRotatingBarcodePicker.h\n * ScanditSDKRotatingBarcodePicker.m\n * ScanditSDK folder (which includes the libscanditsdk-iphone-<version>.a static lib)\n\n* Add frameworks needed by Scandit Barcode Scanner SDK:\n * Click on your project in the navigation pane of Xcode, then select your target and the tab \"Build Phases\" \n * Under the entry \"Link Binary with Libraries\", add the following libraries by clicking the \"+\" button (most of them will already be listed):\n * AudioToolbox.framework\n * AVFoundation.framework\n * CoreGraphics.framework\n * CoreLocation.framework\n * CoreMedia.framework\n * CoreVideo.framework\n * QuartzCore.framework\n * SystemConfiguration.framework\n * libiconv.dylib\n * libz.dylib \n * libc++.dylib\n \n* Register the Plugin with your Cordova App:\n\n * Open the config.xml file and add the following xml element to the widget element\n\n ```\n\t<feature name=\"ScanditSDK\" >\n\t\t<param name=\"ios-package\" value=\"ScanditSDK\" />\n\t</feature>\n ```\n\n\n* Start using the Scandit SDK in your html code \n * Get the app key from your Scandit SDK account\n * Invoke the Scandit SDK scanner by invoking the cordova.exec() function with the following parameters:\n\tSample (minimal) `scan` usage: `cordova.exec(function(success), function(cancel), \"ScanditSDK\", \"scan\", [\"ENTER YOUR APP KEY HERE\",{}]);`\n * See full example and API below for a detailed list of options. \n \n\nManual Scandit SDK Plugin Integration for Android\n------------------------\n\n* Download and add the Scandit SDK library for Android to your Eclipse Cordova Project:\n * Sign up for a free community license (or one of the enterprise packages) at http://www.scandit.com. \n * Download the latest Scandit SDK Phonegap/Cordova for Android from your Scandit account. \n * Unzip the downloaded zip file \n * Copy the contents of the \"libs\" folder from the unzipped folder to the `libs` folder of your Phonegap/Cordova project. The `libs` folder includes the shared library libscanditsdk-android-*.so (in a folder called armeabi)\nand the scanditsdk-barcodepicker-android-*.jar.\n * Copy the `res/raw` folder to the `res` folder of your Phonegap/Cordova project \n * Copy the classes ScanditSDK.java and ScanditSDKActivity.java from the src/android folder (in the com.mirasense.scanditsdk.plugin package) into your project preserving the package hierarchy.\n * Refresh your eclipse project for the files to show up in Eclipse\n\n* Add ScanditSDK jar file to your build path:\n * Right-click on the scanditsdk-barcodepicker-android-*.jar file in the libs folder and select \"Add to Build Path\"\n \n* Register the Plugin with your Cordova App and set the permissions correctly:\n * Add ScanditSDK Activity to the \"application\" section of your app's AndroidManifest.xml file\n\n ```\n <activity android:name=\"com.mirasense.scanditsdk.plugin.ScanditSDKActivity\"/>\n ```\n * Make sure the following permissions are listed in your AndroidManifest.xml file \n\n ```\n\t<uses-permission android:name=\"android.permission.CAMERA\" />\n\t<uses-permission android:name=\"android.permission.VIBRATE\" />\n\t<uses-permission android:name=\"android.permission.INTERNET\" />\n ```\n * Add the following xml element to the res/xml/config.xml resource's widget element\n\n ```\n\n <feature name=\"ScanditSDK\">\n <param name=\"android-package\" value=\"com.mirasense.scanditsdk.plugin.ScanditSDK\"/>\n </feature>\n ```\n\n\n* Start using the Scandit SDK in your html code \n * Get the app key from your Scandit SDK account\n * Invoke the Scandit SDK scanner by invoking the cordova.exec() function with the following parameters:\n\n\tSample (minimal) `scan` usage: \n```\ncordova.exec(function(success), function(cancel), \"ScanditSDK\", \"scan\", [\"YOUR APP KEY HERE\",{}]);\n```\n * See full example and API below for a detailed list of options. \n\n\n### Sample HTML + JS\n\n```html\n<!DOCTYPE html>\n<html>\n <!--\n #\n # Licensed to the Apache Software Foundation (ASF) under one\n # or more contributor license agreements. See the NOTICE file\n # distributed with this work for additional information\n # regarding copyright ownership. The ASF licenses this file\n # to you under the Apache License, Version 2.0 (the\n # \"License\"); you may not use this file except in compliance\n # with the License. You may obtain a copy of the License at\n #\n # http://www.apache.org/licenses/LICENSE-2.0\n #\n # Unless required by applicable law or agreed to in writing,\n # software distributed under the License is distributed on an\n # \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n # KIND, either express or implied. See the License for the\n # specific language governing permissions and limitations\n # under the License.\n #\n -->\n <head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <meta name = \"format-detection\" content = \"telephone=no\"/>\n <meta name=\"viewport\" content=\"user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width;\" />\n <link rel=\"stylesheet\" type=\"text/css\" href=\"css/index.css\" />\n <title>Scandit SDK</title>\n </head>\n <body onload=\"onBodyLoad()\" style=\"background: url(img/ScanditSDKDemo-Splash.png) no-repeat;background-size: 100%;background-color: #000000\">\n <script type=\"text/javascript\" src=\"cordova.js\"></script>\n <script type=\"text/javascript\" src=\"js/index.js\"></script>\n <script type=\"text/javascript\">\n function onBodyLoad()\n {\n document.addEventListener(\"deviceready\", onDeviceReady, false);\n }\n \n\t function success(resultArray) {\n\n\t\talert(\"Scanned \" + resultArray[0] + \" code: \" + resultArray[1]);\n\n \t// NOTE: Scandit SDK Phonegap Plugin Versions 1.* for iOS report\n \t// the scanning result as a concatenated string.\n \t// Starting with version 2.0.0, the Scandit SDK Phonegap\n \t// Plugin for iOS reports the result as an array\n \t// identical to the way the Scandit SDK plugin for Android reports results.\n \n \t// If you are running the Scandit SDK Phonegap Plugin Version 1.* for iOS,\n \t// use the following approach to generate a result array from the string result returned:\n \t// resultArray = result.split(\"|\");\n }\n \n function failure(error) {\n alert(\"Failed: \" + error);\n }\n \n function scan() {\n // See below for all available options. \n cordova.exec(success, failure, \"ScanditSDK\", \"scan\",\n [\"ENTER YOUR APP KEY HERE\",\n {\"beep\": true,\n \"1DScanning\" : true,\n \"2DScanning\" : true}]);\n }\n \n app.initialize();\n </script>\n \n <div align=\"center\" valign=\"center\">\n <input type=\"button\" value=\"scan\" onclick=\"scan()\" style=\"margin-top: 230px; width: 100px; height: 30px; font-size: 1em\"/>\n </div>\n </body>\n</html>\n\n```\n\n\nChangelog\n------------------------\n\n**Scandit SDK Phonegap Plugin for iOS and Android (2.2.0) - September 30th 2013**\n\n * upgraded to Scandit SDK for iOS 3.1.1 and Scandit SDK for Android 3.5.1 (see release notes in download section of your Scandit SDK for details)\n\n\n**Scandit SDK Phonegap Plugin for iOS (2.1.0) and Android (1.2.0) - August 6th 2013**\n\n * support for Phonegap/Cordova 3.0 \n\n * upgraded to Scandit SDK 3.0.4 for iOS (for details see release notes in download section of your Scandit SDK account), Android version of plugin still uses Scandit SDK 3.3.1 for Android\n\n\n**Scandit SDK Phonegap Plugin 2.0.1 for iOS only - June 17th 2013**\n\n * upgraded to Scandit SDK 3.0.3 for iOS which is a new bug fix release (see release notes of native iOS version for details)\n\n**Scandit SDK Phonegap Plugin 2.0.0 for iOS only - May 11th 2013**\n\n * upgraded to new Scandit SDK 3.0.1 for iOS which comprises various new features: full screen scanning, \n improved autofocus management, better scan performance and robustness, new cleaner scan screen interface \n with the option to add a button to switch cameras and new symbologies (PDF417 beta and MSI-Plessey).\n\n * IMPORTANT: updated Scandit SDK Phonegap Plugin API to reflect updates in Scandit SDK 3.0.1 for iOS. \n This includes a number of new API options (see below), a number of options have also disappeared. \n\n * harmonized return results of Android and iPhone Plugin. In previous versions, \n the iOS Plugin would return a string, while the Android Plugin would return an array. \n Starting with Scandit SDK Phonegap Plugin for iOS 2.0.0, the iOS Plugin will also return an array. \n\n\n\n**Scandit SDK Phonegap Plugin 1.1.0 for Android & iOS - April 2nd 2013**\n\n * upgraded to native Scandit SDK 2.2.7 for iOS and 3.3.1 for Android\n \n * includes support PLUGMAN\n\n * Fixed a bug that would freeze and stop the modal view from closing.\n\n * Scandit SDK Phonegap Plugin for Android now also supports barcode scanning in landscape mode.\n\n * Minor changes to ScanditSDKActivity.java \n\n\n\n\nAPI for Scandit SDK Phonegap Plugin iOS and Android \n------------------------\n\nSee http://www.scandit.com/support for more information \n\n\n\nLicense\n-------\n* This plug-in is released under the Apache 2.0 license: http://www.apache.org/licenses/LICENSE-2.0\n\n\n\nQuestions? Contact `info@scandit.com`.\n\n\n\n\n","maintainers":[{"name":"palpatine222","email":"selenita108@hotmail.com"}],"time":{"modified":"2013-11-22T11:24:27.062Z","created":"2013-11-22T11:24:25.070Z","1.1.0":"2013-11-22T11:24:27.062Z"},"_attachments":{"com.mirasense.scanditsdk.plugin-1.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-nMGU4vbyqBwSjWxx/aXhUw==","length":16572,"stub":true}}}},
{"id":"com.mobbu.cordova.cesg.clearpasteboard","key":"com.mobbu.cordova.cesg.clearpasteboard","value":{"rev":"8-8a24f53a69857baad59593f270fa27ed"},"doc":{"_id":"com.mobbu.cordova.cesg.clearpasteboard","_rev":"8-8a24f53a69857baad59593f270fa27ed","name":"com.mobbu.cordova.cesg.clearpasteboard","description":"Cordova plugin that automatically clears the pasteboard on app background to comply with CESG Guidelines and prevents users from copying data out of your app. Works on iOS, Android, BB10.","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"version":"0.0.1","name":"com.mobbu.cordova.cesg.clearpasteboard","cordova_name":"Clear pasteboard","description":"Cordova plugin that automatically clears the pasteboard on app background to comply with CESG Guidelines (https://www.gov.uk/government/publications/end-user-devices-security-guidance-apple-ios-application-development/end-user-devices-security-guidance-apple-ios-application-security-guidance) and prevents users from copying data out of your app.","license":"Apache 2.0","keywords":["cordova","copy","paste","pasteboard","security","cesg"],"engines":[],"readme":"ERROR: No README data found!","_id":"com.mobbu.cordova.cesg.clearpasteboard@0.0.1","dist":{"shasum":"b0220d5f238a10845eb0c8ff14f9e5628ee65245","tarball":"http://cordova.iriscouch.com/registry/_design/scratch/_rewrite/com.mobbu.cordova.cesg.clearpasteboard/-/com.mobbu.cordova.cesg.clearpasteboard-0.0.1.tgz"},"_from":"com.mobbu.cordova.cesg.clearpasteboard","_npmVersion":"1.3.4","_npmUser":{"name":"mobbu","email":"stacec@mobbu.com"},"maintainers":[{"name":"mobbu","email":"stacec@mobbu.com"}],"directories":{}},"0.0.2":{"version":"0.0.2","name":"com.mobbu.cordova.cesg.clearpasteboard","cordova_name":"Clear pasteboard","description":"Cordova plugin that automatically clears the pasteboard on app background to comply with CESG Guidelines and prevents users from copying data out of your app. Works on iOS, Android, BB10.","license":"Apache 2.0","keywords":["cordova","copy","paste","pasteboard","security","cesg"],"engines":[],"readme":"ERROR: No README data found!","_id":"com.mobbu.cordova.cesg.clearpasteboard@0.0.2","dist":{"shasum":"71f5054bdd015e4fcfb9bafc30fc7941674dbb93","tarball":"http://registry.cordova.io/com.mobbu.cordova.cesg.clearpasteboard/-/com.mobbu.cordova.cesg.clearpasteboard-0.0.2.tgz"},"_from":"com.mobbu.cordova.cesg.clearpasteboard","_npmVersion":"1.3.4","_npmUser":{"name":"mobbu","email":"stacec@mobbu.com"},"maintainers":[{"name":"mobbu","email":"stacec@mobbu.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"mobbu","email":"stacec@mobbu.com"}],"time":{"modified":"2013-11-13T14:53:02.089Z","created":"2013-11-12T15:46:14.554Z","0.0.1":"2013-11-12T15:46:29.092Z","0.0.2":"2013-11-13T14:53:02.089Z"},"_attachments":{"com.mobbu.cordova.cesg.clearpasteboard-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":7,"digest":"md5-DwLJ1198WbGA92c4QZXYRg==","length":1379845,"stub":true},"com.mobbu.cordova.cesg.clearpasteboard-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-wFJqjxRFUrvTvD2qC2hlOA==","length":1379428,"stub":true}}}},
{"id":"com.mobbu.cordova.cesg.masksnapshot","key":"com.mobbu.cordova.cesg.masksnapshot","value":{"rev":"9-15d283eb4b23d4b9319672369f83fdba"},"doc":{"_id":"com.mobbu.cordova.cesg.masksnapshot","_rev":"9-15d283eb4b23d4b9319672369f83fdba","name":"com.mobbu.cordova.cesg.masksnapshot","description":"Cordova plugin to remove snapshot or window cover taken on app going into background to comply with CESG Guidelines and provide additional security. Works with iOS, BB10.","dist-tags":{"latest":"0.0.4"},"versions":{"0.0.1":{"version":"0.0.1","name":"com.mobbu.cordova.cesg.masksnapshot","cordova_name":"Mask snapshot","description":"Cordova plugin to remove snapshot or window cover taken on app going into background to comply with CESG Guidelines (https://www.gov.uk/government/publications/end-user-devices-security-guidance-apple-ios-application-development/end-user-devices-security-guidance-apple-ios-application-security-guidance) and provide additional security.","license":"Apache 2.0","keywords":["cordova","copy","paste","pasteboard","security","cesg"],"engines":[],"readme":"ERROR: No README data found!","_id":"com.mobbu.cordova.cesg.masksnapshot@0.0.1","dist":{"shasum":"e0dc23206075a311ad6e746e4d82fb96f3e528c2","tarball":"http://registry.cordova.io/com.mobbu.cordova.cesg.masksnapshot/-/com.mobbu.cordova.cesg.masksnapshot-0.0.1.tgz"},"_from":"com.mobbu.cordova.cesg.masksnapshot","_npmVersion":"1.3.4","_npmUser":{"name":"mobbu","email":"stacec@mobbu.com"},"maintainers":[{"name":"mobbu","email":"stacec@mobbu.com"}]},"0.0.2":{"version":"0.0.2","name":"com.mobbu.cordova.cesg.masksnapshot","cordova_name":"Mask snapshot","description":"Cordova plugin to remove snapshot or window cover taken on app going into background to comply with CESG Guidelines and provide additional security. Works with iOS, Android, BB10.","license":"Apache 2.0","keywords":["cordova","snapshot","security","window cover","masking"],"engines":[],"readme":"ERROR: No README data found!","_id":"com.mobbu.cordova.cesg.masksnapshot@0.0.2","dist":{"shasum":"959742e53525e5ae6cf038f99548a83a3060b152","tarball":"http://registry.cordova.io/com.mobbu.cordova.cesg.masksnapshot/-/com.mobbu.cordova.cesg.masksnapshot-0.0.2.tgz"},"_from":"com.mobbu.cordova.cesg.masksnapshot","_npmVersion":"1.3.4","_npmUser":{"name":"mobbu","email":"stacec@mobbu.com"},"maintainers":[{"name":"mobbu","email":"stacec@mobbu.com"}]},"0.0.3":{"version":"0.0.3","name":"com.mobbu.cordova.cesg.masksnapshot","cordova_name":"Mask snapshot","description":"Cordova plugin to remove snapshot or window cover taken on app going into background to comply with CESG Guidelines and provide additional security. Works with iOS, BB10.","license":"Apache 2.0","keywords":["cordova","snapshot","security","window cover","masking"],"engines":[],"readme":"ERROR: No README data found!","_id":"com.mobbu.cordova.cesg.masksnapshot@0.0.3","dist":{"shasum":"8ad09ee9b1d8a1e61bb692c71bba372055d6fe4d","tarball":"http://registry.cordova.io/com.mobbu.cordova.cesg.masksnapshot/-/com.mobbu.cordova.cesg.masksnapshot-0.0.3.tgz"},"_from":"com.mobbu.cordova.cesg.masksnapshot","_npmVersion":"1.3.4","_npmUser":{"name":"mobbu","email":"stacec@mobbu.com"},"maintainers":[{"name":"mobbu","email":"stacec@mobbu.com"}]},"0.0.4":{"version":"0.0.4","name":"com.mobbu.cordova.cesg.masksnapshot","cordova_name":"Mask snapshot","description":"Cordova plugin to remove snapshot or window cover taken on app going into background to comply with CESG Guidelines and provide additional security. Works with iOS, BB10.","license":"Apache 2.0","keywords":["cordova","snapshot","security","window cover","masking"],"engines":[],"readme":"ERROR: No README data found!","_id":"com.mobbu.cordova.cesg.masksnapshot@0.0.4","dist":{"shasum":"d377f991a1dfd331a73380502bd22adb9e30afc3","tarball":"http://registry.cordova.io/com.mobbu.cordova.cesg.masksnapshot/-/com.mobbu.cordova.cesg.masksnapshot-0.0.4.tgz"},"_from":"com.mobbu.cordova.cesg.masksnapshot","_npmVersion":"1.3.4","_npmUser":{"name":"mobbu","email":"stacec@mobbu.com"},"maintainers":[{"name":"mobbu","email":"stacec@mobbu.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"mobbu","email":"stacec@mobbu.com"}],"time":{"modified":"2013-11-15T16:28:17.093Z","created":"2013-11-12T15:47:06.515Z","0.0.1":"2013-11-12T15:47:07.384Z","0.0.2":"2013-11-13T15:29:45.762Z","0.0.3":"2013-11-15T15:40:23.592Z","0.0.4":"2013-11-15T16:28:17.093Z"},"_attachments":{"com.mobbu.cordova.cesg.masksnapshot-0.0.4.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-/Jf8m91fGlK5Ni9y5CwPFA==","length":2125,"stub":true},"com.mobbu.cordova.cesg.masksnapshot-0.0.3.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-PnKokDbXR79rt6zK2Uglcg==","length":2388,"stub":true},"com.mobbu.cordova.cesg.masksnapshot-0.0.2.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-mVlYfdiI/AeT/xQ5wOsGWQ==","length":2466,"stub":true},"com.mobbu.cordova.cesg.masksnapshot-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-OudhAJl5NA6lHsp2lyUeSw==","length":2168,"stub":true}}}},
{"id":"com.mobileapptracking.matplugin","key":"com.mobileapptracking.matplugin","value":{"rev":"3-8f77e85818cebfb3fa5fdc8b93ee1df4"},"doc":{"_id":"com.mobileapptracking.matplugin","_rev":"3-8f77e85818cebfb3fa5fdc8b93ee1df4","name":"com.mobileapptracking.matplugin","description":"This plugin allows you to track installs and events using MobileAppTracking.","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.mobileapptracking.matplugin","cordova_name":"MATPlugin","description":"This plugin allows you to track installs and events using MobileAppTracking.","license":"Apache 2.0","keywords":["cordova","mat","mobileapptracking","tracking"],"engines":[{"name":"cordova","version":">=2.0.0"}],"readme":"# MAT PhoneGap Plugin\n\nThe MobileAppTracking (MAT) Plugin for PhoneGap provides basic application install\nand event tracking functionality.\n\nTo track installs, you must first integrate the PhoneGap plugin with your app.\nYou may also add and track additional events beyond an app install (such as purchases,\ngame levels, and any other user engagement).\n\nThis document outlines the MAT PhoneGap plugin integration.\n\n\n## Installing the Plugin\n\nHere we have outlined several ways to include the MAT Plugin in your PhoneGap project.\nYou may use whichever method best fits into your build process.\n\n\n### Plugman\n\nRun the following [plugman](https://github.com/apache/cordova-plugman) command from your project's `platforms\\[PLATFORM]\\` folder:\n\n plugman install --platform [PLATFORM] --project [PROJECT-PATH] --plugin [PLUGIN-PATH]\n\n [PLATFORM] = android or ios\n [PROJECT-PATH] = path to folder of your phonegap project\n [PLUGIN-PATH] = path to folder of this plugin\n\n\n### Cordova/PhoneGap CLI\n\nRun the follow command-line interface commands from your project's folder:\n\nCordova:\n\n cordova plugin add [PLUGIN-PATH]\n\nCordova Registry:\n\n cordova plugin add com.mobileapptracking.matplugin\n\nPhoneGap:\n\n phonegap local plugin add [PLUGIN-PATH]\n\n### Manual Android Installation\n\n1. Add the following to your `res/xml/config.xml` file:\n\n <feature name=\"MATPlugin\" >\n <param name=\"android-package\" value=\"com.mobileapptracking.MATPlugin\" />\n </feature>\n\n2. Add `com/mobileapptracking/MATPlugin.java` from MAT PhoneGap's `src/android` folder to your Android project's `src` folder.\n You may simply copy the `com` folder from repo to your `src` folder.\n\n3. Add necessary plugin permissions to your `AndroidManifest.xml`.\n\n <uses-permission android:name=\"android.permission.INTERNET\" />\n <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n <uses-permission android:name=\"android.permission.READ_PHONE_STATE\" /> <!-- optional, for collecting device IMEI -->\n <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" /> <!-- optional, for collecting MAC address -->\n\n4. Copy the `MATPlugin.js` file from MAT PhoneGap's `www` folder into your application's `assets/www` folder.\n\n5. Import the MATPlugin.js script in your html file:\n \n <script type=\"text/javascript\" src=\"MATPlugin.js\"></script>\n\n### Manual iOS Installation\n\n1. Make sure the PhoneGap project exists, if not:\n\n phonegap create <PROJECT-NAME>\n\n2. Make sure the iOS project has been created, if not:\n\n cd <PROJECT-NAME>\n phonegap build ios\n\n3. Copy the MATPlugin.js file to the `platforms/ios/www` folder\n\n4. Import the MATPlugin.js script in your html file:\n \n <script type=\"text/javascript\" src=\"MATPlugin.js\"></script>\n\n5. Create a folder `platforms/ios/Plugins/com.mobileapptracking.MATPlugin`. \n\n6. Copy and paste the files -- `MATPlugin.h`, `MATPlugin.m`, `MobileAppTracker.h`, `MobileAppTracker.a` -- from the downloaded MAT plugin's `src/ios` folder.\n\n7. Open the iOS project in Xcode.\n\n8. In the Project Explorer, Ctrl+Click Plugins folder and click **Add Files To _\"`<PROJECT-NAME>`\"_**. \n Browse to the folder mentioned in #4 above and add the `.h` and `.m` files to the project.\n\n9. Go to the project settings Build Phase page. In the Link Binary With Libraries section add the required frameworks:\n\n MobileAppTracker.a -- from the folder mentioned in #4 above\n AdSupport.framework -- Optional\n CoreTelephony.framework\n MobileCoreServices.framework\n SystemConfiguration.framework\n\n\n10. Copy the MATPlugin feature tag to **platforms/ios/_`<PROJECT-NAME>`_/config.xml** file.\n\n <feature name=\"MATPlugin\">\n <param name=\"ios-package\" value=\"MATPlugin\" />\n <param name=\"onload\" value=\"true\" />\n </feature>\n\n\n## Integration\n\nNow that the plugin is installed, here are instructions on how to use the MobileAppTracking plugin.\n\nFor a complete example, see the implementation in the `example/www/index.html` file of the plugin folder.\n\nThe MobileAppTracking methods are available in a window.plugins.matPlugin object.\n\nYou can create a JavaScript var to easily access the MAT object defined in MATPlugin.js:\n\n var mat = window.plugins.matPlugin;\n\nThe MAT object can be used to call methods defined in MatPlugin.js.\n\nAfter receiving your `deviceready` event, initialize the MAT tracker with the `initTracker` function, passing in\na success callback, error callback, your MAT advertiser ID and key:\n\n mat.initTracker(success, failure, \"advertiser_id\",\"advertiser_key\");\n\n### Installs and Updates\n\nAs the success of attributing app events after the initial install is dependent upon first tracking that install, \nwe require that the install is the first event tracked. To track install of your mobile app, use the `trackInstall` \nmethod. If users have already installed your app prior to SDK implementation, then these users should be tracked as updates.\n\n#### Track Installs\n\nTo track installs of your mobile app, use the Track Install method. Track Install is used to track when users install your \nmobile app on their device and will only record one conversion per install in reports.\n\n mat.trackInstall(success, failure);\n\nThe `trackInstall` method automatically tracks updates of your app if the app version differs from the last app version it saw.\n\n#### Handling Installs Prior to SDK Implementation - Track as Updates\n\nWhat if your app already has thousands or millions of users prior to SDK implementation? What happens when these users update \nthe app to the new version that contains the MAT SDK?\n\nMAT provides you two ways to make sure that the existing users do not count towards new app installs.\n\n1. Call SDK method `trackUpdate` instead of `trackInstall`.\n\n If you are integrating MAT into an existing app where you have users you’ve seen before, you can track an update yourself with the `trackUpdate` method.\n\n mat.trackUpdate(success, failure);\n\n2. Import prior installs to the platform.\n\nThese methods are useful if you already have an app in the store and plan to add the MAT SDK in a new version. \nLearn how to [handle installs prior to SDK implementation here](http://support.mobileapptracking.com/entries/22621001-Handling-Installs-prior-to-SDK-implementation).\n\nIf the code used to differentiate installs versus app updates is not properly implemented, then you will notice \na [spike of total installs](http://support.mobileapptracking.com/entries/22900598-Spike-of-Total-Installs-on-First-day-of-SDK) on the first day of the SDK implementation.\n\n\n### Events\n\nAfter the install has been tracked, the `trackAction` method is intended to be used to track user actions such as reaching a \ncertain level in a game or making an in-app purchase. The `trackAction` method allows you to define the event name dynamically.\n\n trackAction(success, failure, eventName, isId, referenceId, revenue, currency)\n\nwhere\n\n success = success callback\n failure = failure callback\n eventName = name of event to track\n isId = whether eventName is passing event name or event ID # from MAT\n referenceId = advertiser ref ID to associate with event\n revenue = revenue amount to associate with event as double\n currency = ISO 4217 currency code of revenue\n\nYou need to supply the \"eventName\" field with the appropriate value for the event; e.g. \"registration\". If the event does\nnot exist, it will be dynamically created in our site. You may pass a revenue value, currency code,\nor whether you are using an event ID or event name, as optional fields.\n\n#### Registration\n\nIf you have a registration process, it's recommended to track it by calling trackAction set to \"registration\".\n\n mat.trackAction(success, failure, \"registration\", false, \"some_username\", 0, \"USD\");\n\nYou can find these events in the platform by viewing Reports > Event Logs. Then filter the report by the \"registration\" event.\n\nWhile our platform always blocks the tracking of duplicate installs, by default it does not block duplicate event requests. \nHowever, a registration event may be an event that you only want tracked once per device/user. \nPlease see [block duplicate requests setting for events](http://support.mobileapptracking.com/entries/22927312-Block-Duplicate-Request-Setting-for-Events) for further information.\n\n#### Purchases\n\nThe best way to analyze the value of your publishers and marketing campaigns is to track revenue from in-app purchases.\nBy tracking in-app purchases for a user, the data can be correlated back to the install and analyzed on a cohort basis \nto determine revenue per install and lifetime value.\n\n mat.trackAction(success, failure, \"purchase\", false, \"\", 0.99, \"USD\");\n\n__Track In-App Purchases__\nThe basic way to track purchases is to track an event with a name of purchase and then define the revenue (sale amount) and currency code.\n\n__Note__: Pass the revenue in as a Double and the currency of the amount if necessary. Currency is set to \"USD\" by default.\nSee [Setting Currency Code](http://support.mobileapptracking.com/entries/23697946-Customize-SDK-Settings) for currencies we support.\n\nYou can find these events in platform by viewing Reports > Logs > Events. Then filter the report by the \"purchase\" event.\n\n#### Opens\n\nThe SDK allows you to analyze user engagement by tracking unique opens. The SDK has built in functionality to only track one \"open\" event\nper user on any given day to minimize footprint. All subsequent \"open\" events fired on the same day are ignored and will not show up on the platform.\n\n mat.trackAction(success, failure, \"open\", false, \"\", 0, \"USD\");\n\nYou can find counts of Opens by viewing Reports > Mobile Apps. Include the parameter of Opens to see the aggregated count.\nThe platform does not provide logs of Opens. If you track Opens using a name other than \"open\" then these tracked events will\ncost the same price as all other events to track.\n\n#### Other Events\n\nYou can track other events in your app dynamically by calling `trackAction`. The `trackAction` method is intended for tracking\nany user actions. This method allows you to define the event name.\n\nTo dynamically track an event, replace \"eventName\" with the name of the event you want to track. The tracking engine\nwill then look up the event by the name. If an event with the defined name doesn’t exist, the tracking engine will automatically\ncreate an event for you with that name. An Event Name has to be alphanumeric.\n\nYou can find these events in platform by viewing Reports->Logs->Event Logs.\n\nThe max event limit per site is 100. Learn more about the [max limit of events](http://support.mobileapptracking.com/entries/22803093-Max-Event-Limit-per-Site).\n\nWhile our platform always blocks the tracking of duplicate installs, by default it does not block duplicate event requests. \nHowever, there may be other types of events that you only want tracked once per device/user. Please see [block duplicate requests setting for events](http://support.mobileapptracking.com/entries/22927312-Block-Duplicate-Request-Setting-for-Events) for further information.\n\n\n### Testing Plugin Integration with SDK\n\nThese pages contain instructions on how to test whether the SDKs were successfully implemented for the various platforms:\n\n[Testing Android SDK Integration](http://support.mobileapptracking.com/entries/22541781-Testing-Android-SDK-integration)\n\n[Testing iOS SDK Integration](http://support.mobileapptracking.com/entries/22561876-testing-ios-sdk-integration)\n\n\n### Debug Mode and Duplicates\n\n__Debugging__\n\nWhen the Debug mode is enabled in the SDK, the server responds with debug information about the success or failure of the\ntracking requests.\n\n__Note__: For Android, debug mode log output can be found in LogCat under the tag \"MobileAppTracker\".\n\nTo debug log messages that show the event status and server response, call the `setDebugMode` method with Boolean true:\n\n mat.setDebugMode(success, failure, true);\n\n__Allow Duplicates__\n\nThe platform rejects installs from devices it has seen before. For testing purposes, you may want to bypass this behavior\nand fire multiple installs from the same testing device.\n \nThere are two methods you can employ to do so: (1) calling the `setAllowDuplicates` method, and (2) set up a test profile.\n\n(1) Call the `setAllowDuplicates` after initializing `MobileAppTracker`, with Boolean true:\n\n mat.setAllowDuplicates(success, failure, true);\n\n(2) Set up a [test profile](http://support.mobileapptracking.com/entries/22541401-Test-Profiles). A Test Profile should be \nused when you want to allow duplicate installs and/or events from a device you are using from testing and don't want to \nimplement setAllowDuplicateRequests in the code and instead allow duplicate requests from the platform.\n\n\n**_The setDebugMode and setAllowDuplicates calls are meant for use only during debugging and testing. Please be sure to disable these for release builds._**\n\n\n### Additional Resources\n\n#### Custom Settings\n\nThe SDK supports several custom identifiers that you can use as alternate means to identify your installs or events.\nCall these setters before calling the corresponding trackInstall or trackAction code.\n\n__OpenUDID__ (iOS only)\n\nThis sets the OpenUDID of the device. Can be generated with the official implementation at [http://OpenUDID.org](http://OpenUDID.org).\nCalling this will do nothing on Android apps.\n\n mat.setOpenUDID(success, failure, \"your_open_udid\");\n\n__TRUSTe ID__\n\nIf you are integrating with the TRUSTe SDK, you can pass in your TRUSTe ID with `setTRUSTeId`, which populates the \"TPID\" field.\n\n mat.setTrusteTPID(success, failure, \"your_truste_id\");\n\n__User ID__\n\nIf you have a user ID of your own that you wish to track, pass it in as a string with `setUserId`. This populates the \"User ID\"\nfield in our reporting, and also the postback variable {user_id}.\n\n mat.setUserId(success, failure, \"custom_user_id\");\n\nThe SDK supports several custom identifiers that you can use as alternate means to identify your installs or events.\nPlease navigate to the [Custom SDK Settings](http://support.mobileapptracking.com/entries/23738686-Customize-SDK-Settings) page for more information.\n\n#### Event Items\n\nWhile an event is like your receipt for a purchase, the event items are the individual items you purchased.\nEvent items allow you to define multiple items for a single event. The `trackAction` method can include this event item data.\n\nThe function for tracking event items looks like this:\n\n trackActionWithItems(success, failure, eventName, isId, items, referenceId, revenue, currency)\n\nitems is an array of \"event items\" that have the following format:\n\n {\n \"item\":\"item_name\", // name of the item\n \"quantity\":1, // # of items\n \"unit_price\":0.99, // individual unit price\n \"revenue\":0.99, // total revenue of event item, defaults to quantity x unit price\n \"attribute_sub1\":\"1\", // attribute1 for your use (optional)\n \"attribute_sub2\":\"2\", // attribute2 for your use (optional)\n \"attribute_sub3\":\"3\", // attribute3 for your use (optional)\n \"attribute_sub4\":\"4\", // attribute4 for your use (optional)\n \"attribute_sub5\":\"5\" // attribute5 for your use (optional)\n }\n\nSample tracking code:\n\n var eventItems = new Array();\n\n var eventItem1 = {\n \"item\":\"apple\",\n \"quantity\":1,\n \"unit_price\":0.99,\n \"revenue\":0.99,\n \"attribute_sub1\":\"1\",\n \"attribute_sub2\":\"2\",\n \"attribute_sub3\":\"3\",\n \"attribute_sub4\":\"4\",\n \"attribute_sub5\":\"5\"\n };\n eventItems[0] = eventItem1;\n \n var eventItem2 = {\n \"item\":\"banana\",\n \"quantity\":2,\n \"unit_price\":0.50,\n \"revenue\":1\n };\n eventItems[1] = eventItem2;\n \n mat.trackActionWithItems(\n success,\n failure,\n \"purchase\",\n false,\n eventItems,\n \"ref1\",\n 0.99,\n \"USD\"\n );\n","readmeFilename":"README.md","_id":"com.mobileapptracking.matplugin@1.0.0","dist":{"shasum":"0b57d93ddb1ad2ee6738e1083f5fb5cc6ecf3d2d","tarball":"http://registry.cordova.io/com.mobileapptracking.matplugin/-/com.mobileapptracking.matplugin-1.0.0.tgz"},"_from":"/home/johng/Dev/phonegap-mat-plugin/","_npmVersion":"1.3.4","_npmUser":{"name":"john-gu","email":"john.gu@hasoffers.com"},"maintainers":[{"name":"john-gu","email":"john.gu@hasoffers.com"}]}},"readme":"# MAT PhoneGap Plugin\n\nThe MobileAppTracking (MAT) Plugin for PhoneGap provides basic application install\nand event tracking functionality.\n\nTo track installs, you must first integrate the PhoneGap plugin with your app.\nYou may also add and track additional events beyond an app install (such as purchases,\ngame levels, and any other user engagement).\n\nThis document outlines the MAT PhoneGap plugin integration.\n\n\n## Installing the Plugin\n\nHere we have outlined several ways to include the MAT Plugin in your PhoneGap project.\nYou may use whichever method best fits into your build process.\n\n\n### Plugman\n\nRun the following [plugman](https://github.com/apache/cordova-plugman) command from your project's `platforms\\[PLATFORM]\\` folder:\n\n plugman install --platform [PLATFORM] --project [PROJECT-PATH] --plugin [PLUGIN-PATH]\n\n [PLATFORM] = android or ios\n [PROJECT-PATH] = path to folder of your phonegap project\n [PLUGIN-PATH] = path to folder of this plugin\n\n\n### Cordova/PhoneGap CLI\n\nRun the follow command-line interface commands from your project's folder:\n\nCordova:\n\n cordova plugin add [PLUGIN-PATH]\n\nCordova Registry:\n\n cordova plugin add com.mobileapptracking.matplugin\n\nPhoneGap:\n\n phonegap local plugin add [PLUGIN-PATH]\n\n### Manual Android Installation\n\n1. Add the following to your `res/xml/config.xml` file:\n\n <feature name=\"MATPlugin\" >\n <param name=\"android-package\" value=\"com.mobileapptracking.MATPlugin\" />\n </feature>\n\n2. Add `com/mobileapptracking/MATPlugin.java` from MAT PhoneGap's `src/android` folder to your Android project's `src` folder.\n You may simply copy the `com` folder from repo to your `src` folder.\n\n3. Add necessary plugin permissions to your `AndroidManifest.xml`.\n\n <uses-permission android:name=\"android.permission.INTERNET\" />\n <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n <uses-permission android:name=\"android.permission.READ_PHONE_STATE\" /> <!-- optional, for collecting device IMEI -->\n <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" /> <!-- optional, for collecting MAC address -->\n\n4. Copy the `MATPlugin.js` file from MAT PhoneGap's `www` folder into your application's `assets/www` folder.\n\n5. Import the MATPlugin.js script in your html file:\n \n <script type=\"text/javascript\" src=\"MATPlugin.js\"></script>\n\n### Manual iOS Installation\n\n1. Make sure the PhoneGap project exists, if not:\n\n phonegap create <PROJECT-NAME>\n\n2. Make sure the iOS project has been created, if not:\n\n cd <PROJECT-NAME>\n phonegap build ios\n\n3. Copy the MATPlugin.js file to the `platforms/ios/www` folder\n\n4. Import the MATPlugin.js script in your html file:\n \n <script type=\"text/javascript\" src=\"MATPlugin.js\"></script>\n\n5. Create a folder `platforms/ios/Plugins/com.mobileapptracking.MATPlugin`. \n\n6. Copy and paste the files -- `MATPlugin.h`, `MATPlugin.m`, `MobileAppTracker.h`, `MobileAppTracker.a` -- from the downloaded MAT plugin's `src/ios` folder.\n\n7. Open the iOS project in Xcode.\n\n8. In the Project Explorer, Ctrl+Click Plugins folder and click **Add Files To _\"`<PROJECT-NAME>`\"_**. \n Browse to the folder mentioned in #4 above and add the `.h` and `.m` files to the project.\n\n9. Go to the project settings Build Phase page. In the Link Binary With Libraries section add the required frameworks:\n\n MobileAppTracker.a -- from the folder mentioned in #4 above\n AdSupport.framework -- Optional\n CoreTelephony.framework\n MobileCoreServices.framework\n SystemConfiguration.framework\n\n\n10. Copy the MATPlugin feature tag to **platforms/ios/_`<PROJECT-NAME>`_/config.xml** file.\n\n <feature name=\"MATPlugin\">\n <param name=\"ios-package\" value=\"MATPlugin\" />\n <param name=\"onload\" value=\"true\" />\n </feature>\n\n\n## Integration\n\nNow that the plugin is installed, here are instructions on how to use the MobileAppTracking plugin.\n\nFor a complete example, see the implementation in the `example/www/index.html` file of the plugin folder.\n\nThe MobileAppTracking methods are available in a window.plugins.matPlugin object.\n\nYou can create a JavaScript var to easily access the MAT object defined in MATPlugin.js:\n\n var mat = window.plugins.matPlugin;\n\nThe MAT object can be used to call methods defined in MatPlugin.js.\n\nAfter receiving your `deviceready` event, initialize the MAT tracker with the `initTracker` function, passing in\na success callback, error callback, your MAT advertiser ID and key:\n\n mat.initTracker(success, failure, \"advertiser_id\",\"advertiser_key\");\n\n### Installs and Updates\n\nAs the success of attributing app events after the initial install is dependent upon first tracking that install, \nwe require that the install is the first event tracked. To track install of your mobile app, use the `trackInstall` \nmethod. If users have already installed your app prior to SDK implementation, then these users should be tracked as updates.\n\n#### Track Installs\n\nTo track installs of your mobile app, use the Track Install method. Track Install is used to track when users install your \nmobile app on their device and will only record one conversion per install in reports.\n\n mat.trackInstall(success, failure);\n\nThe `trackInstall` method automatically tracks updates of your app if the app version differs from the last app version it saw.\n\n#### Handling Installs Prior to SDK Implementation - Track as Updates\n\nWhat if your app already has thousands or millions of users prior to SDK implementation? What happens when these users update \nthe app to the new version that contains the MAT SDK?\n\nMAT provides you two ways to make sure that the existing users do not count towards new app installs.\n\n1. Call SDK method `trackUpdate` instead of `trackInstall`.\n\n If you are integrating MAT into an existing app where you have users you’ve seen before, you can track an update yourself with the `trackUpdate` method.\n\n mat.trackUpdate(success, failure);\n\n2. Import prior installs to the platform.\n\nThese methods are useful if you already have an app in the store and plan to add the MAT SDK in a new version. \nLearn how to [handle installs prior to SDK implementation here](http://support.mobileapptracking.com/entries/22621001-Handling-Installs-prior-to-SDK-implementation).\n\nIf the code used to differentiate installs versus app updates is not properly implemented, then you will notice \na [spike of total installs](http://support.mobileapptracking.com/entries/22900598-Spike-of-Total-Installs-on-First-day-of-SDK) on the first day of the SDK implementation.\n\n\n### Events\n\nAfter the install has been tracked, the `trackAction` method is intended to be used to track user actions such as reaching a \ncertain level in a game or making an in-app purchase. The `trackAction` method allows you to define the event name dynamically.\n\n trackAction(success, failure, eventName, isId, referenceId, revenue, currency)\n\nwhere\n\n success = success callback\n failure = failure callback\n eventName = name of event to track\n isId = whether eventName is passing event name or event ID # from MAT\n referenceId = advertiser ref ID to associate with event\n revenue = revenue amount to associate with event as double\n currency = ISO 4217 currency code of revenue\n\nYou need to supply the \"eventName\" field with the appropriate value for the event; e.g. \"registration\". If the event does\nnot exist, it will be dynamically created in our site. You may pass a revenue value, currency code,\nor whether you are using an event ID or event name, as optional fields.\n\n#### Registration\n\nIf you have a registration process, it's recommended to track it by calling trackAction set to \"registration\".\n\n mat.trackAction(success, failure, \"registration\", false, \"some_username\", 0, \"USD\");\n\nYou can find these events in the platform by viewing Reports > Event Logs. Then filter the report by the \"registration\" event.\n\nWhile our platform always blocks the tracking of duplicate installs, by default it does not block duplicate event requests. \nHowever, a registration event may be an event that you only want tracked once per device/user. \nPlease see [block duplicate requests setting for events](http://support.mobileapptracking.com/entries/22927312-Block-Duplicate-Request-Setting-for-Events) for further information.\n\n#### Purchases\n\nThe best way to analyze the value of your publishers and marketing campaigns is to track revenue from in-app purchases.\nBy tracking in-app purchases for a user, the data can be correlated back to the install and analyzed on a cohort basis \nto determine revenue per install and lifetime value.\n\n mat.trackAction(success, failure, \"purchase\", false, \"\", 0.99, \"USD\");\n\n__Track In-App Purchases__\nThe basic way to track purchases is to track an event with a name of purchase and then define the revenue (sale amount) and currency code.\n\n__Note__: Pass the revenue in as a Double and the currency of the amount if necessary. Currency is set to \"USD\" by default.\nSee [Setting Currency Code](http://support.mobileapptracking.com/entries/23697946-Customize-SDK-Settings) for currencies we support.\n\nYou can find these events in platform by viewing Reports > Logs > Events. Then filter the report by the \"purchase\" event.\n\n#### Opens\n\nThe SDK allows you to analyze user engagement by tracking unique opens. The SDK has built in functionality to only track one \"open\" event\nper user on any given day to minimize footprint. All subsequent \"open\" events fired on the same day are ignored and will not show up on the platform.\n\n mat.trackAction(success, failure, \"open\", false, \"\", 0, \"USD\");\n\nYou can find counts of Opens by viewing Reports > Mobile Apps. Include the parameter of Opens to see the aggregated count.\nThe platform does not provide logs of Opens. If you track Opens using a name other than \"open\" then these tracked events will\ncost the same price as all other events to track.\n\n#### Other Events\n\nYou can track other events in your app dynamically by calling `trackAction`. The `trackAction` method is intended for tracking\nany user actions. This method allows you to define the event name.\n\nTo dynamically track an event, replace \"eventName\" with the name of the event you want to track. The tracking engine\nwill then look up the event by the name. If an event with the defined name doesn’t exist, the tracking engine will automatically\ncreate an event for you with that name. An Event Name has to be alphanumeric.\n\nYou can find these events in platform by viewing Reports->Logs->Event Logs.\n\nThe max event limit per site is 100. Learn more about the [max limit of events](http://support.mobileapptracking.com/entries/22803093-Max-Event-Limit-per-Site).\n\nWhile our platform always blocks the tracking of duplicate installs, by default it does not block duplicate event requests. \nHowever, there may be other types of events that you only want tracked once per device/user. Please see [block duplicate requests setting for events](http://support.mobileapptracking.com/entries/22927312-Block-Duplicate-Request-Setting-for-Events) for further information.\n\n\n### Testing Plugin Integration with SDK\n\nThese pages contain instructions on how to test whether the SDKs were successfully implemented for the various platforms:\n\n[Testing Android SDK Integration](http://support.mobileapptracking.com/entries/22541781-Testing-Android-SDK-integration)\n\n[Testing iOS SDK Integration](http://support.mobileapptracking.com/entries/22561876-testing-ios-sdk-integration)\n\n\n### Debug Mode and Duplicates\n\n__Debugging__\n\nWhen the Debug mode is enabled in the SDK, the server responds with debug information about the success or failure of the\ntracking requests.\n\n__Note__: For Android, debug mode log output can be found in LogCat under the tag \"MobileAppTracker\".\n\nTo debug log messages that show the event status and server response, call the `setDebugMode` method with Boolean true:\n\n mat.setDebugMode(success, failure, true);\n\n__Allow Duplicates__\n\nThe platform rejects installs from devices it has seen before. For testing purposes, you may want to bypass this behavior\nand fire multiple installs from the same testing device.\n \nThere are two methods you can employ to do so: (1) calling the `setAllowDuplicates` method, and (2) set up a test profile.\n\n(1) Call the `setAllowDuplicates` after initializing `MobileAppTracker`, with Boolean true:\n\n mat.setAllowDuplicates(success, failure, true);\n\n(2) Set up a [test profile](http://support.mobileapptracking.com/entries/22541401-Test-Profiles). A Test Profile should be \nused when you want to allow duplicate installs and/or events from a device you are using from testing and don't want to \nimplement setAllowDuplicateRequests in the code and instead allow duplicate requests from the platform.\n\n\n**_The setDebugMode and setAllowDuplicates calls are meant for use only during debugging and testing. Please be sure to disable these for release builds._**\n\n\n### Additional Resources\n\n#### Custom Settings\n\nThe SDK supports several custom identifiers that you can use as alternate means to identify your installs or events.\nCall these setters before calling the corresponding trackInstall or trackAction code.\n\n__OpenUDID__ (iOS only)\n\nThis sets the OpenUDID of the device. Can be generated with the official implementation at [http://OpenUDID.org](http://OpenUDID.org).\nCalling this will do nothing on Android apps.\n\n mat.setOpenUDID(success, failure, \"your_open_udid\");\n\n__TRUSTe ID__\n\nIf you are integrating with the TRUSTe SDK, you can pass in your TRUSTe ID with `setTRUSTeId`, which populates the \"TPID\" field.\n\n mat.setTrusteTPID(success, failure, \"your_truste_id\");\n\n__User ID__\n\nIf you have a user ID of your own that you wish to track, pass it in as a string with `setUserId`. This populates the \"User ID\"\nfield in our reporting, and also the postback variable {user_id}.\n\n mat.setUserId(success, failure, \"custom_user_id\");\n\nThe SDK supports several custom identifiers that you can use as alternate means to identify your installs or events.\nPlease navigate to the [Custom SDK Settings](http://support.mobileapptracking.com/entries/23738686-Customize-SDK-Settings) page for more information.\n\n#### Event Items\n\nWhile an event is like your receipt for a purchase, the event items are the individual items you purchased.\nEvent items allow you to define multiple items for a single event. The `trackAction` method can include this event item data.\n\nThe function for tracking event items looks like this:\n\n trackActionWithItems(success, failure, eventName, isId, items, referenceId, revenue, currency)\n\nitems is an array of \"event items\" that have the following format:\n\n {\n \"item\":\"item_name\", // name of the item\n \"quantity\":1, // # of items\n \"unit_price\":0.99, // individual unit price\n \"revenue\":0.99, // total revenue of event item, defaults to quantity x unit price\n \"attribute_sub1\":\"1\", // attribute1 for your use (optional)\n \"attribute_sub2\":\"2\", // attribute2 for your use (optional)\n \"attribute_sub3\":\"3\", // attribute3 for your use (optional)\n \"attribute_sub4\":\"4\", // attribute4 for your use (optional)\n \"attribute_sub5\":\"5\" // attribute5 for your use (optional)\n }\n\nSample tracking code:\n\n var eventItems = new Array();\n\n var eventItem1 = {\n \"item\":\"apple\",\n \"quantity\":1,\n \"unit_price\":0.99,\n \"revenue\":0.99,\n \"attribute_sub1\":\"1\",\n \"attribute_sub2\":\"2\",\n \"attribute_sub3\":\"3\",\n \"attribute_sub4\":\"4\",\n \"attribute_sub5\":\"5\"\n };\n eventItems[0] = eventItem1;\n \n var eventItem2 = {\n \"item\":\"banana\",\n \"quantity\":2,\n \"unit_price\":0.50,\n \"revenue\":1\n };\n eventItems[1] = eventItem2;\n \n mat.trackActionWithItems(\n success,\n failure,\n \"purchase\",\n false,\n eventItems,\n \"ref1\",\n 0.99,\n \"USD\"\n );\n","maintainers":[{"name":"john-gu","email":"john.gu@hasoffers.com"}],"time":{"modified":"2013-12-04T22:30:49.252Z","created":"2013-12-04T22:30:47.543Z","1.0.0":"2013-12-04T22:30:49.252Z"},"_attachments":{"com.mobileapptracking.matplugin-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-VlHGUmlr9FfN7yTJ0soAHQ==","length":519672,"stub":true}}}},
{"id":"com.newjf","key":"com.newjf","value":{"rev":"3-005952764c8e22d57a3773f34abb171f"},"doc":{"_id":"com.newjf","_rev":"3-005952764c8e22d57a3773f34abb171f","name":"com.newjf","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"version":"0.2.0","name":"com.newjf","cordova_name":"Zjf","engines":[],"readme":"ERROR: No README data found!","readmeFilename":"readme.md","_id":"com.newjf@0.2.0","dist":{"shasum":"714da6124ba1b348a93708ea879afb34ae7f080d","tarball":"http://registry.cordova.io/com.newjf/-/com.newjf-0.2.0.tgz"},"_from":"D:\\gitfortest","_npmVersion":"1.3.4","_npmUser":{"name":"zjf","email":"zjf276744763@qq.com"},"maintainers":[{"name":"zjf","email":"zjf276744763@qq.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"zjf","email":"zjf276744763@qq.com"}],"time":{"modified":"2013-10-14T09:49:23.509Z","created":"2013-10-14T09:48:17.640Z","0.2.0":"2013-10-14T09:49:23.509Z"},"_attachments":{"com.newjf-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-u7uEzTboZwxGXVTUMwD8yw==","length":5040533,"stub":true}}}},
{"id":"com.phonegap.plugins.barcodescanner","key":"com.phonegap.plugins.barcodescanner","value":{"rev":"3-5ed58cdbc3e5c8df4580d8b93ac6ea9f"},"doc":{"_id":"com.phonegap.plugins.barcodescanner","_rev":"3-5ed58cdbc3e5c8df4580d8b93ac6ea9f","name":"com.phonegap.plugins.barcodescanner","description":"Scans Barcodes.","dist-tags":{"latest":"0.6.0"},"versions":{"0.6.0":{"version":"0.6.0","name":"com.phonegap.plugins.barcodescanner","cordova_name":"BarcodeScanner","description":"Scans Barcodes.","license":"MIT","engines":[{"name":"cordova","version":">=2.0.0"}],"readme":"ERROR: No README data found!","_id":"com.phonegap.plugins.barcodescanner@0.6.0","dist":{"shasum":"a5f00457383e2e0df5332e54fd36d1aa0dd0f506","tarball":"http://registry.cordova.io/com.phonegap.plugins.barcodescanner/-/com.phonegap.plugins.barcodescanner-0.6.0.tgz"},"_from":"plugins/barcodescanner","_npmVersion":"1.3.4","_npmUser":{"name":"tony","email":"tony.mwebaze@gmail.com"},"maintainers":[{"name":"tony","email":"tony.mwebaze@gmail.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"tony","email":"tony.mwebaze@gmail.com"}],"time":{"modified":"2013-09-27T15:27:08.657Z","created":"2013-09-27T15:27:04.039Z","0.6.0":"2013-09-27T15:27:08.657Z"},"_attachments":{"com.phonegap.plugins.barcodescanner-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-Euvz+V77PRZsRTASvB2JxA==","length":5830,"stub":true}}}},
{"id":"com.phonegap.plugins.cdvplugintwitter","key":"com.phonegap.plugins.cdvplugintwitter","value":{"rev":"5-fe23afd2bbadea59df9d51ed0d6a3cb2"},"doc":{"_id":"com.phonegap.plugins.cdvplugintwitter","_rev":"5-fe23afd2bbadea59df9d51ed0d6a3cb2","name":"com.phonegap.plugins.cdvplugintwitter","description":"A quick adaption of the previous Twitter plugin to work with Cordova 3.0.0+","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.phonegap.plugins.cdvplugintwitter","cordova_name":"CDVPluginTwitter","description":"A quick adaption of the previous Twitter plugin to work with Cordova 3.0.0+","keywords":["twitter","ios","cordova"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"CDVPluginTwitter\n================\n\nAn adaption of the twitter plugin but adapted for PhoneGap 3.0\n","readmeFilename":"README.md","_id":"com.phonegap.plugins.cdvplugintwitter@1.0.0","dist":{"shasum":"db07a8165b6b69753504c465c7ddfb927a3b365a","tarball":"http://registry.cordova.io/com.phonegap.plugins.cdvplugintwitter/-/com.phonegap.plugins.cdvplugintwitter-1.0.0.tgz"},"_from":"CDVPluginTwitter/","_npmVersion":"1.3.4","_npmUser":{"name":"plidstone","email":"plidstone@gmail.com"},"maintainers":[{"name":"plidstone","email":"plidstone@gmail.com"}]},"1.0.1":{"version":"1.0.1","name":"com.phonegap.plugins.cdvplugintwitter","cordova_name":"CDVPluginTwitter","description":"A quick adaption of the previous Twitter plugin to work with Cordova 3.0.0+","keywords":["twitter","ios","cordova"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"CDVPluginTwitter\n================\n\nAn adaption of the twitter plugin but adapted for PhoneGap 3.0\n\niOS\n===\nThe Twitter Framework and the Accounts framework need to be added in the build phases tab","readmeFilename":"README.md","_id":"com.phonegap.plugins.cdvplugintwitter@1.0.1","dist":{"shasum":"0de6e69cdfbc1ec98f092681ba47229cbb73057a","tarball":"http://registry.cordova.io/com.phonegap.plugins.cdvplugintwitter/-/com.phonegap.plugins.cdvplugintwitter-1.0.1.tgz"},"_from":"CDVPluginTwitter/","_npmVersion":"1.3.4","_npmUser":{"name":"plidstone","email":"plidstone@gmail.com"},"maintainers":[{"name":"plidstone","email":"plidstone@gmail.com"}]}},"readme":"CDVPluginTwitter\n================\n\nAn adaption of the twitter plugin but adapted for PhoneGap 3.0\n","maintainers":[{"name":"plidstone","email":"plidstone@gmail.com"}],"time":{"modified":"2013-12-12T12:21:21.192Z","created":"2013-11-11T13:43:29.033Z","1.0.0":"2013-11-11T13:43:30.030Z","1.0.1":"2013-12-12T12:21:21.192Z"},"_attachments":{"com.phonegap.plugins.cdvplugintwitter-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-8OnIsCDqwsPeK5BMH7mx5Q==","length":3781,"stub":true},"com.phonegap.plugins.cdvplugintwitter-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-n8c5KwhhdthdASXZd2Jrrw==","length":3622,"stub":true}}}},
{"id":"com.phonegap.plugins.mapkit","key":"com.phonegap.plugins.mapkit","value":{"rev":"7-04f16db151b66617c1d784a26b6d30c9"},"doc":{"_id":"com.phonegap.plugins.mapkit","_rev":"7-04f16db151b66617c1d784a26b6d30c9","name":"com.phonegap.plugins.mapkit","description":"MapKit plugin for iOS and Android =================================","dist-tags":{"latest":"0.9.2"},"versions":{"0.0.1":{"version":"0.0.1","name":"com.phonegap.plugins.mapkit","cordova_name":"MapKit","license":"Apache","engines":[],"readme":"MapKit plugin for iOS and Android\n=================================\n\nUses *Apple Maps* on iOS and *Google Maps v2* on Android\n\nCurrently only works/tested on Android and iOS. Requires Cordova 3.0+ (will not work on earlier versions without modifications).\n\n![Cordova Map 1](http://i.imgur.com/Mf6oeXal.png)\n\n![Cordova Map 2](http://i.imgur.com/XaaBGeGl.png)\n\n![Cordova Map 3](http://i.imgur.com/3IoDj0Rl.png)\n\n![Cordova Map 4](http://i.imgur.com/Bfzik6Ml.png)\n\n\nAndroid specific\n----------------\n\nYou need a [Google Maps Android v2 API KEY](https://code.google.com/apis/console/) from google and you need to specify it when you install the plugin\n\nYou can install this plugin with [plugman](https://npmjs.org/package/plugman)\n\n plugman install --platform android --project android-mapkit-example/ --plugin /path/to/MapKit --variable API_KEY=\"YOUR_API_KEY_FROM_GOOGLE\"\n\n\nSample code\n-----------\n\n var app = {\n showMap: function() {\n var pins = [[49.28115, -123.10450], [49.27503, -123.12138], [49.28286, -123.11891]];\n var error = function() {\n console.log('error');\n };\n var success = function() {\n mapKit.addMapPins(pins, function() { \n console.log('adMapPins success'); \n },\n function() { console.log('error'); });\n };\n mapKit.showMap(success, error);\n },\n hideMap: function() {\n var success = function() {\n console.log('Map hidden');\n };\n var error = function() {\n console.log('error');\n };\n mapKit.hideMap(success, error);\n },\n clearMapPins: function() {\n var success = function() {\n console.log('Map Pins cleared!');\n };\n var error = function() {\n console.log('error');\n };\n mapKit.clearMapPins(success, error);\n },\n changeMapType: function() {\n var success = function() {\n console.log('Map Type Changed');\n };\n var error = function() {\n console.log('error');\n };\n mapKit.changeMapType(mapKit.mapType.MAP_TYPE_SATELLITE, success, error);\n }\n }\n\nConfiguration\n-------------\n\nEdit the options in MapKit.js to suit your needs\n\n this.options = {\n height: 460, // height of the map (width is always full size for now)\n diameter: 1000, // unused for now\n atBottom: true, // bottom or top of the webview\n lat: 49.281468, // initial camera position latitude\n lon: -123.104446 // initial camera position latitude\n };\n\nSample App\n----------\n\nCheckout the sample/ application as a boilerplate!\n\nMissing features\n----------------\n\nInfo bubbles: Simple info bubbles supported (title, snippet and custom icons for markers). Custom info bubbles not supported (i.e HTML bubbles etc..).\n\nLicense\n-------\n\nApache\n","readmeFilename":"README.md","description":"MapKit plugin for iOS and Android =================================","_id":"com.phonegap.plugins.mapkit@0.0.1","dist":{"shasum":"375b37d279a221a9e5aa5c2fded1f9c16af17033","tarball":"http://registry.cordova.io/com.phonegap.plugins.mapkit/-/com.phonegap.plugins.mapkit-0.0.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"anis","email":"anis@adobe.com"},"maintainers":[{"name":"anis","email":"anis@adobe.com"}]},"0.9.1":{"version":"0.9.1","name":"com.phonegap.plugins.mapkit","cordova_name":"MapKit","license":"Apache","engines":[],"readme":"MapKit plugin for iOS and Android\n=================================\n\nUses *Apple Maps* on iOS and *Google Maps v2* on Android\n\nCurrently only works/tested on Android and iOS. Requires Cordova 3.0+ (will not work on earlier versions without modifications).\n\n![Cordova Map 1](http://i.imgur.com/Mf6oeXal.png)\n\n![Cordova Map 2](http://i.imgur.com/XaaBGeGl.png)\n\n![Cordova Map 3](http://i.imgur.com/3IoDj0Rl.png)\n\n![Cordova Map 4](http://i.imgur.com/Bfzik6Ml.png)\n\n\nAndroid specific\n----------------\n\nYou need a [Google Maps Android v2 API KEY](https://code.google.com/apis/console/) from google and you need to specify it when you install the plugin\n\nYou can install this plugin with [plugman](https://npmjs.org/package/plugman)\n\n plugman install --platform android --project android-mapkit-example/ --plugin /path/to/MapKit --variable API_KEY=\"YOUR_API_KEY_FROM_GOOGLE\"\n\n\nSample code\n-----------\n\n var app = {\n showMap: function() {\n var pins = [[49.28115, -123.10450], [49.27503, -123.12138], [49.28286, -123.11891]];\n var error = function() {\n console.log('error');\n };\n var success = function() {\n mapKit.addMapPins(pins, function() { \n console.log('adMapPins success'); \n },\n function() { console.log('error'); });\n };\n mapKit.showMap(success, error);\n },\n hideMap: function() {\n var success = function() {\n console.log('Map hidden');\n };\n var error = function() {\n console.log('error');\n };\n mapKit.hideMap(success, error);\n },\n clearMapPins: function() {\n var success = function() {\n console.log('Map Pins cleared!');\n };\n var error = function() {\n console.log('error');\n };\n mapKit.clearMapPins(success, error);\n },\n changeMapType: function() {\n var success = function() {\n console.log('Map Type Changed');\n };\n var error = function() {\n console.log('error');\n };\n mapKit.changeMapType(mapKit.mapType.MAP_TYPE_SATELLITE, success, error);\n }\n }\n\nConfiguration\n-------------\n\nEdit the options in MapKit.js to suit your needs\n\n this.options = {\n height: 460, // height of the map (width is always full size for now)\n diameter: 1000, // unused for now\n atBottom: true, // bottom or top of the webview\n lat: 49.281468, // initial camera position latitude\n lon: -123.104446 // initial camera position latitude\n };\n\nSample App\n----------\n\nCheckout the sample/ application as a boilerplate!\n\nMissing features\n----------------\n\nInfo bubbles: Simple info bubbles supported (title, snippet and custom icons for markers). Custom info bubbles not supported (i.e HTML bubbles etc..).\n\nLicense\n-------\n\nApache\n","readmeFilename":"README.md","description":"MapKit plugin for iOS and Android =================================","_id":"com.phonegap.plugins.mapkit@0.9.1","dist":{"shasum":"4b5792c2ca660c30c91e1260363dcb91fb8e2b1e","tarball":"http://registry.cordova.io/com.phonegap.plugins.mapkit/-/com.phonegap.plugins.mapkit-0.9.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"anis","email":"anis@adobe.com"},"maintainers":[{"name":"anis","email":"anis@adobe.com"}]},"0.9.2":{"version":"0.9.2","name":"com.phonegap.plugins.mapkit","cordova_name":"MapKit","license":"Apache","engines":[],"readme":"MapKit plugin for iOS and Android\n=================================\n\nUses *Apple Maps* on iOS and *Google Maps v2* on Android\n\nCurrently only works/tested on Android and iOS. Requires Cordova 3.0+ (will not work on earlier versions without modifications).\n\n![Cordova Map 1](http://i.imgur.com/Mf6oeXal.png)\n\n![Cordova Map 2](http://i.imgur.com/XaaBGeGl.png)\n\n![Cordova Map 3](http://i.imgur.com/3IoDj0Rl.png)\n\n![Cordova Map 4](http://i.imgur.com/Bfzik6Ml.png)\n\n\nAndroid specific\n----------------\n\nYou need a [Google Maps Android v2 API KEY](https://code.google.com/apis/console/) from google and you need to specify it when you install the plugin\n\nYou can install this plugin with [plugman](https://npmjs.org/package/plugman)\n\n plugman install --platform android --project android-mapkit-example/ --plugin /path/to/MapKit --variable API_KEY=\"YOUR_API_KEY_FROM_GOOGLE\"\n\n\nSample code\n-----------\n\n var app = {\n showMap: function() {\n var pins = [[49.28115, -123.10450], [49.27503, -123.12138], [49.28286, -123.11891]];\n var error = function() {\n console.log('error');\n };\n var success = function() {\n mapKit.addMapPins(pins, function() { \n console.log('adMapPins success'); \n },\n function() { console.log('error'); });\n };\n mapKit.showMap(success, error);\n },\n hideMap: function() {\n var success = function() {\n console.log('Map hidden');\n };\n var error = function() {\n console.log('error');\n };\n mapKit.hideMap(success, error);\n },\n clearMapPins: function() {\n var success = function() {\n console.log('Map Pins cleared!');\n };\n var error = function() {\n console.log('error');\n };\n mapKit.clearMapPins(success, error);\n },\n changeMapType: function() {\n var success = function() {\n console.log('Map Type Changed');\n };\n var error = function() {\n console.log('error');\n };\n mapKit.changeMapType(mapKit.mapType.MAP_TYPE_SATELLITE, success, error);\n }\n }\n\nConfiguration\n-------------\n\nEdit the options in MapKit.js to suit your needs\n\n this.options = {\n height: 460, // height of the map (width is always full size for now)\n diameter: 1000, // unused for now\n atBottom: true, // bottom or top of the webview\n lat: 49.281468, // initial camera position latitude\n lon: -123.104446 // initial camera position latitude\n };\n\nSample App\n----------\n\nCheckout the sample/ application as a boilerplate!\n\nMissing features\n----------------\n\nInfo bubbles: Simple info bubbles supported (title, snippet and custom icons for markers). Custom info bubbles not supported (i.e HTML bubbles etc..).\n\nLicense\n-------\n\nApache\n","readmeFilename":"README.md","description":"MapKit plugin for iOS and Android =================================","_id":"com.phonegap.plugins.mapkit@0.9.2","dist":{"shasum":"8ccb6553295b4ccea58dc036c3999d4645bc5eb5","tarball":"http://registry.cordova.io/com.phonegap.plugins.mapkit/-/com.phonegap.plugins.mapkit-0.9.2.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"anis","email":"anis@adobe.com"},"maintainers":[{"name":"anis","email":"anis@adobe.com"}]}},"readme":"MapKit plugin for iOS and Android\n=================================\n\nUses *Apple Maps* on iOS and *Google Maps v2* on Android\n\nCurrently only works/tested on Android and iOS. Requires Cordova 3.0+ (will not work on earlier versions without modifications).\n\n![Cordova Map 1](http://i.imgur.com/Mf6oeXal.png)\n\n![Cordova Map 2](http://i.imgur.com/XaaBGeGl.png)\n\n![Cordova Map 3](http://i.imgur.com/3IoDj0Rl.png)\n\n![Cordova Map 4](http://i.imgur.com/Bfzik6Ml.png)\n\n\nAndroid specific\n----------------\n\nYou need a [Google Maps Android v2 API KEY](https://code.google.com/apis/console/) from google and you need to specify it when you install the plugin\n\nYou can install this plugin with [plugman](https://npmjs.org/package/plugman)\n\n plugman install --platform android --project android-mapkit-example/ --plugin /path/to/MapKit --variable API_KEY=\"YOUR_API_KEY_FROM_GOOGLE\"\n\n\nSample code\n-----------\n\n var app = {\n showMap: function() {\n var pins = [[49.28115, -123.10450], [49.27503, -123.12138], [49.28286, -123.11891]];\n var error = function() {\n console.log('error');\n };\n var success = function() {\n mapKit.addMapPins(pins, function() { \n console.log('adMapPins success'); \n },\n function() { console.log('error'); });\n };\n mapKit.showMap(success, error);\n },\n hideMap: function() {\n var success = function() {\n console.log('Map hidden');\n };\n var error = function() {\n console.log('error');\n };\n mapKit.hideMap(success, error);\n },\n clearMapPins: function() {\n var success = function() {\n console.log('Map Pins cleared!');\n };\n var error = function() {\n console.log('error');\n };\n mapKit.clearMapPins(success, error);\n },\n changeMapType: function() {\n var success = function() {\n console.log('Map Type Changed');\n };\n var error = function() {\n console.log('error');\n };\n mapKit.changeMapType(mapKit.mapType.MAP_TYPE_SATELLITE, success, error);\n }\n }\n\nConfiguration\n-------------\n\nEdit the options in MapKit.js to suit your needs\n\n this.options = {\n height: 460, // height of the map (width is always full size for now)\n diameter: 1000, // unused for now\n atBottom: true, // bottom or top of the webview\n lat: 49.281468, // initial camera position latitude\n lon: -123.104446 // initial camera position latitude\n };\n\nSample App\n----------\n\nCheckout the sample/ application as a boilerplate!\n\nMissing features\n----------------\n\nInfo bubbles: Simple info bubbles supported (title, snippet and custom icons for markers). Custom info bubbles not supported (i.e HTML bubbles etc..).\n\nLicense\n-------\n\nApache\n","maintainers":[{"name":"anis","email":"anis@adobe.com"}],"time":{"modified":"2013-10-03T01:26:55.186Z","created":"2013-10-03T00:06:14.002Z","0.0.1":"2013-10-03T00:06:17.509Z","0.9.1":"2013-10-03T00:06:42.910Z","0.9.2":"2013-10-03T01:26:55.186Z"},"_attachments":{"com.phonegap.plugins.mapkit-0.9.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-kHZ5RLZA+0cWYhyytmg/Tw==","length":1900354,"stub":true},"com.phonegap.plugins.mapkit-0.9.1.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-EIahlOv2KrNWVg1CSksIVQ==","length":1900111,"stub":true},"com.phonegap.plugins.mapkit-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-n6XpwJHXrrFYFukfZa66PQ==","length":1900116,"stub":true}}}},
{"id":"com.photokandy.nativecontrols","key":"com.photokandy.nativecontrols","value":{"rev":"5-094d85a375f392b6036b39bb47544632"},"doc":{"_id":"com.photokandy.nativecontrols","_rev":"5-094d85a375f392b6036b39bb47544632","name":"com.photokandy.nativecontrols","description":"Native Controls (alpha; iOS 7 only for now)","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.photokandy.nativecontrols","cordova_name":"Native Controls","description":"Native Controls (alpha; iOS 7 only for now)","license":"MIT","keywords":["native"," controls"," ios"," ios7"],"engines":[{"name":"cordova","version":">=2.9.0"}],"readme":"# PKNativeControls\n\n@author Kerri Shotts\n@email kerrishotts@gmail.com\n@version 1.0.0\n\nImplements some basic native controls for iOS. This library should be\nconsidered \"alpha\" release, since it's very new. It currently only supports iOS 7, but\nsupport is planned to extend to iOS 6 as well.\n\nThe library has been designed so as to be simple to code against: generally you don't\nneed to worry about a lot of asynchronous code except for event-handling. It's also\nsomewhat iOS-centric, so although the protocol could easily be implemented for another\nplatform, the lingo is iOS-inspired.\n\nThe license is MIT, so feel free to use, enhance, etc. If you do make changes that would\nbenefit the community, it would be great if you would contribute them back to the original\nplugin, but that is not required.\n\n## License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this\nsoftware and associated documentation files (the \"Software\"), to deal in the Software\nwithout restriction, including without limitation the rights to use, copy, modify,\nmerge, publish, distribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be included in all copies\nor substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\nPURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT\nOR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n## Repository\n\nAvailable at https://github.com/photokandyStudios/PKNativeControls\n\n## Minimum Requirements\n\n* Cordova 2.9 or higher (tested 3.3)\n* iOS 7 or higher (for now; iOS 6 support coming)\n\n## Installation\n\nAdd the plugin using Cordova's CLI:\n\ncordova plugin add com.photokandy.nativecontrols\n\n## Use\n\nAll interaction with the library is through `window.nativeControls`. There are several \nmethods that can be used to instantiate various native controls:\n\n* NavigationBar\n* NavigationItem\n* BarButton\n* ToolBar\n* MessageBox\n* ActionSheet\n\nThere are also utility methods:\n\n* Rect\n* Color\n\nMore native controls are planned for future releases.\n\n### Navigation Bars\n\n```\nvar navigationBar = window.nativeControls.NavigationBar();\nnavigationBar.tintColor = window.nativeControls.Color ( \"red\" );\nnavigationBar.barTintColor = window.nativeControls.Color ( \"white\" );\nnavigationBar.addToView();\n```\n\nThis will create a navigation bar at the top of the window with a white background and a\nred tint color (for any buttons).\n\nNavigation bars can be re-oriented on the screen:\n\n```\nnavigationBar.frame = window.nativeControls.Rect ( 320, 0, 768-320, 64 );\n```\n\nNavigation bars in iOS 7 usually carry translucency (blurring of the background); this can be \nturned off if desired:\n\n```\nnavigationBar.translucent = false;\n```\n\nNote: your content is not moved out of the way of the navigation bar. You need to apply\nthe appropriate padding, margins, or positioning in order to keep your content out of the\nway. The benefit here is if you allow the content to scroll under the navigation bar, you\ncan inherit the translucent effect present in iOS 7.\n\n### Navigation Bar Items\n\nNavigation bars by themselves aren't terribly interesting. In order to display text or\ncontrols, you need to create a navigation bar item:\n\n```\nvar navigationBarItem = window.nativeControls.NavigationBarItem();\nnavigationBarItem.title = \"View Title\";\n```\n\nAt this point, one can add Bar Buttons to the left or right side:\n\n```\nnavigationBarItem.leftButtons = [ button1, button2 ];\nnavigationBarItem.rightButtons = [ button3, button4 ];\n```\n\nAfter adding buttons, it can be pushed onto a navigation bar:\n\n```\nnavigationBar.push ( navigationBarItem );\n```\n\nIf further items are pushed, a back button appears with the title of the previous item. The\nuser could pop it manually (by pressing the back button), or this will pop it programmatically:\n\n```\nnavigationBar.pop ();\n```\n\n### Bar Buttons\n\nBar buttons can be added to navigation items and tool bars. They can be a text label or\nan icon. They will be tinted with their parent container's tint color (unless overridden).\n\n```\nvar button1 = window.nativeControls.BarButton();\nbutton1.title = \"Add\"\nvar button2 = window.nativeControls.BarButton();\nbutton2.image = \"/path/to/image\" -- no .png or @2x\n```\n\nIn order to respond to a button tap, you can attach an event handler:\n\n```\nbutton1.addEventListener ( \"tap\", function (evt) { ... } );\n```\n\nYou can also remove event listeners when you no longer need to respond to the event.\n\nImages will use \"@2x\" retina assets automatically if provided, and will scale them appropriately\nif @1x retina assets are not provided. If the image is in the \"www\" directory, or a subdirectory,\nrefer to it like so:\n\n```\nbutton3.image = \"/www/img/book\";\n```\n\n### Tool Bars\n\nTool bars can be created like this:\n\n```\nvar toolbar = window.nativeControls.ToolBar();\ntoolbar.buttons = [button1, button2];\ntoolbar.tintColor = window.nativeControls.Color (\"blue\");\ntoolbar.addToView();\n```\n\nToolbars can also be positioned by changing their `frame` property.\n\n### Message Boxes and Action Sheets\n\nThese are lumped together, because although they are presentationally different (on iPhone),\nthey are very similar logically.\n\nA message box can be created as follows:\n\n```\nvar messageBox = window.nativeControls.MessageBox();\nmessageBox.title = \"Title of the message\";\nmessageBox.text = \"Are you sure?\";\nmessageBox.addButtons ( \"Yes\", \"No\", \"Cancel\" );\nmessageBox.cancelButtonIndex = 2; -- zero-based\nmessageBox.addEventListener ( \"tap\", function ( evt ) { console.log ( evt.data ); } );\nmessageBox.show();\n```\n\nMessage boxes can be hidden by calling `hide` -- any event handler will be called with the\ncancel button index.\n\nAlert boxes are created very similarly, except they don't support the `text` property. \nFurthermore, they add an additional property called `destructiveButtonIndex` that can\nbe used to specify which button will have a destructive effect, like so:\n\n```\nvar actionSheet = window.nativeControls.ActionSheet();\nactionSheet.title = \"Title of sheet\";\nactionSheet.addButtons ( \"Delete\", \"Share\", \"Cancel\" );\nactionSheet.cancelButtonIndex = 2;\nactionSheet.destructiveButtonIndex = 0;\nactionSheet.show();\n```\n\n","readmeFilename":"readme.md","_id":"com.photokandy.nativecontrols@1.0.0","dist":{"shasum":"9b0440f3778af06029e821a44a7e15dedc741eba","tarball":"http://registry.cordova.io/com.photokandy.nativecontrols/-/com.photokandy.nativecontrols-1.0.0.tgz"},"_from":"PKNativeControls","_npmVersion":"1.3.4","_npmUser":{"name":"kerrishotts","email":"kerrishotts@gmail.com"},"maintainers":[{"name":"kerrishotts","email":"kerrishotts@gmail.com"}]},"1.0.1":{"version":"1.0.1","name":"com.photokandy.nativecontrols","cordova_name":"Native Controls","description":"Native Controls (alpha; iOS 7 only for now)","license":"MIT","keywords":["native"," controls"," ios"," ios7"],"engines":[{"name":"cordova","version":">=2.9.0"}],"readme":"# PKNativeControls\n\n@author Kerri Shotts\n@email kerrishotts@gmail.com\n@version 1.0.0\n\nImplements some basic native controls for iOS. This library should be\nconsidered \"alpha\" release, since it's very new. It currently only supports iOS 7, but\nsupport is planned to extend to iOS 6 as well.\n\nThe library has been designed so as to be simple to code against: generally you don't\nneed to worry about a lot of asynchronous code except for event-handling. It's also\nsomewhat iOS-centric, so although the protocol could easily be implemented for another\nplatform, the lingo is iOS-inspired.\n\nThe license is MIT, so feel free to use, enhance, etc. If you do make changes that would\nbenefit the community, it would be great if you would contribute them back to the original\nplugin, but that is not required.\n\n## License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this\nsoftware and associated documentation files (the \"Software\"), to deal in the Software\nwithout restriction, including without limitation the rights to use, copy, modify,\nmerge, publish, distribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be included in all copies\nor substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\nPURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT\nOR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n## Repository\n\nAvailable at https://github.com/photokandyStudios/PKNativeControls\n\n## Minimum Requirements\n\n* Cordova 2.9 or higher (tested 3.3)\n* iOS 7 or higher (for now; iOS 6 support coming)\n\n## Installation\n\nAdd the plugin using Cordova's CLI:\n\ncordova plugin add com.photokandy.nativecontrols\n\n## Use\n\nAll interaction with the library is through `window.nativeControls`. There are several \nmethods that can be used to instantiate various native controls:\n\n* NavigationBar\n* NavigationItem\n* BarButton\n* ToolBar\n* MessageBox\n* ActionSheet\n\nThere are also utility methods:\n\n* Rect\n* Color\n\nMore native controls are planned for future releases.\n\n### Navigation Bars\n\n```\nvar navigationBar = window.nativeControls.NavigationBar();\nnavigationBar.tintColor = window.nativeControls.Color ( \"red\" );\nnavigationBar.barTintColor = window.nativeControls.Color ( \"white\" );\nnavigationBar.addToView();\n```\n\nThis will create a navigation bar at the top of the window with a white background and a\nred tint color (for any buttons).\n\nNavigation bars can be re-oriented on the screen:\n\n```\nnavigationBar.frame = window.nativeControls.Rect ( 320, 0, 768-320, 64 );\n```\n\nNavigation bars in iOS 7 usually carry translucency (blurring of the background); this can be \nturned off if desired:\n\n```\nnavigationBar.translucent = false;\n```\n\nNote: your content is not moved out of the way of the navigation bar. You need to apply\nthe appropriate padding, margins, or positioning in order to keep your content out of the\nway. The benefit here is if you allow the content to scroll under the navigation bar, you\ncan inherit the translucent effect present in iOS 7.\n\n### Navigation Bar Items\n\nNavigation bars by themselves aren't terribly interesting. In order to display text or\ncontrols, you need to create a navigation bar item:\n\n```\nvar navigationBarItem = window.nativeControls.NavigationBarItem();\nnavigationBarItem.title = \"View Title\";\n```\n\nAt this point, one can add Bar Buttons to the left or right side:\n\n```\nnavigationBarItem.leftButtons = [ button1, button2 ];\nnavigationBarItem.rightButtons = [ button3, button4 ];\n```\n\nAfter adding buttons, it can be pushed onto a navigation bar:\n\n```\nnavigationBar.push ( navigationBarItem );\n```\n\nIf further items are pushed, a back button appears with the title of the previous item. The\nuser could pop it manually (by pressing the back button), or this will pop it programmatically:\n\n```\nnavigationBar.pop ();\n```\n\nNote: When pushing and popping navigation items, be careful not to do anything else with a navigation bar or item\nduring the animation process, or you will corrupt the view hierarchy. As iOS animations are fixed-duration, it's best\nto delay about 400ms (maybe a little longer) to get around any corruption.\n\nNavigation items can fire events when they are popped and pushed with the `pop` and `push` events.\n\n### Bar Buttons\n\nBar buttons can be added to navigation items and tool bars. They can be a text label or\nan icon. They will be tinted with their parent container's tint color (unless overridden).\n\n```\nvar button1 = window.nativeControls.BarButton();\nbutton1.title = \"Add\"\nvar button2 = window.nativeControls.BarButton();\nbutton2.image = \"/path/to/image\" -- no .png or @2x\n```\n\nIn order to respond to a button tap, you can attach an event handler:\n\n```\nbutton1.addEventListener ( \"tap\", function (evt) { ... } );\n```\n\nYou can also remove event listeners when you no longer need to respond to the event.\n\nImages will use \"@2x\" retina assets automatically if provided, and will scale them appropriately\nif @1x retina assets are not provided. If the image is in the \"www\" directory, or a subdirectory,\nrefer to it like so:\n\n```\nbutton3.image = \"/www/img/book\";\n```\n\n### Tool Bars\n\nTool bars can be created like this:\n\n```\nvar toolbar = window.nativeControls.ToolBar();\ntoolbar.buttons = [button1, button2];\ntoolbar.tintColor = window.nativeControls.Color (\"blue\");\ntoolbar.addToView();\n```\n\nToolbars can also be positioned by changing their `frame` property.\n\n### Message Boxes and Action Sheets\n\nThese are lumped together, because although they are presentationally different (on iPhone),\nthey are very similar logically.\n\nA message box can be created as follows:\n\n```\nvar messageBox = window.nativeControls.MessageBox();\nmessageBox.title = \"Title of the message\";\nmessageBox.text = \"Are you sure?\";\nmessageBox.addButtons ( \"Yes\", \"No\", \"Cancel\" );\nmessageBox.cancelButtonIndex = 2; -- zero-based\nmessageBox.addEventListener ( \"tap\", function ( evt ) { console.log ( evt.data ); } );\nmessageBox.show();\n```\n\nMessage boxes can be hidden by calling `hide` -- any event handler will be called with the\ncancel button index.\n\nAlert boxes are created very similarly, except they don't support the `text` property. \nFurthermore, they add an additional property called `destructiveButtonIndex` that can\nbe used to specify which button will have a destructive effect, like so:\n\n```\nvar actionSheet = window.nativeControls.ActionSheet();\nactionSheet.title = \"Title of sheet\";\nactionSheet.addButtons ( \"Delete\", \"Share\", \"Cancel\" );\nactionSheet.cancelButtonIndex = 2;\nactionSheet.destructiveButtonIndex = 0;\nactionSheet.show();\n```\n\nInput boxes are Message boxes with a different `alertType`:\n\n```\nmessageBox.alertType = \"input\" // or secureInput, default, userNameAndPassword\nmessageBox.inputText = \"default text\";\nmessageBox.passwordText = \"default password\"; // only if userNameAndPassword\n```\n\nInput boxes can fire additional events: `inputChanged` and `passwordChanged`. They also pass along the contents\nof the input fields when a `tap` occurs. The way this is done currently is hacky in the extreme, but it works as\nlong as the user input isn't going to consist of pipes (|).\n\n```\nmessageBox.addEventLister ( \"tap\", function ( evt )\n{\n var data = evt.data.split(\"|||\");\n var buttonPressed = data[0];\n var inputText = data[1];\n var passwordText = data[2];\n}\n```\n\n\n\n","readmeFilename":"readme.md","_id":"com.photokandy.nativecontrols@1.0.1","dist":{"shasum":"03ac72078286657f14d0cece86448adbeedd6b93","tarball":"http://registry.cordova.io/com.photokandy.nativecontrols/-/com.photokandy.nativecontrols-1.0.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"kerrishotts","email":"kerrishotts@gmail.com"},"maintainers":[{"name":"kerrishotts","email":"kerrishotts@gmail.com"}]}},"readme":"# PKNativeControls\n\n@author Kerri Shotts\n@email kerrishotts@gmail.com\n@version 1.0.0\n\nImplements some basic native controls for iOS. This library should be\nconsidered \"alpha\" release, since it's very new. It currently only supports iOS 7, but\nsupport is planned to extend to iOS 6 as well.\n\nThe library has been designed so as to be simple to code against: generally you don't\nneed to worry about a lot of asynchronous code except for event-handling. It's also\nsomewhat iOS-centric, so although the protocol could easily be implemented for another\nplatform, the lingo is iOS-inspired.\n\nThe license is MIT, so feel free to use, enhance, etc. If you do make changes that would\nbenefit the community, it would be great if you would contribute them back to the original\nplugin, but that is not required.\n\n## License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this\nsoftware and associated documentation files (the \"Software\"), to deal in the Software\nwithout restriction, including without limitation the rights to use, copy, modify,\nmerge, publish, distribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be included in all copies\nor substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\nPURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT\nOR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\n## Repository\n\nAvailable at https://github.com/photokandyStudios/PKNativeControls\n\n## Minimum Requirements\n\n* Cordova 2.9 or higher (tested 3.3)\n* iOS 7 or higher (for now; iOS 6 support coming)\n\n## Installation\n\nAdd the plugin using Cordova's CLI:\n\ncordova plugin add com.photokandy.nativecontrols\n\n## Use\n\nAll interaction with the library is through `window.nativeControls`. There are several \nmethods that can be used to instantiate various native controls:\n\n* NavigationBar\n* NavigationItem\n* BarButton\n* ToolBar\n* MessageBox\n* ActionSheet\n\nThere are also utility methods:\n\n* Rect\n* Color\n\nMore native controls are planned for future releases.\n\n### Navigation Bars\n\n```\nvar navigationBar = window.nativeControls.NavigationBar();\nnavigationBar.tintColor = window.nativeControls.Color ( \"red\" );\nnavigationBar.barTintColor = window.nativeControls.Color ( \"white\" );\nnavigationBar.addToView();\n```\n\nThis will create a navigation bar at the top of the window with a white background and a\nred tint color (for any buttons).\n\nNavigation bars can be re-oriented on the screen:\n\n```\nnavigationBar.frame = window.nativeControls.Rect ( 320, 0, 768-320, 64 );\n```\n\nNavigation bars in iOS 7 usually carry translucency (blurring of the background); this can be \nturned off if desired:\n\n```\nnavigationBar.translucent = false;\n```\n\nNote: your content is not moved out of the way of the navigation bar. You need to apply\nthe appropriate padding, margins, or positioning in order to keep your content out of the\nway. The benefit here is if you allow the content to scroll under the navigation bar, you\ncan inherit the translucent effect present in iOS 7.\n\n### Navigation Bar Items\n\nNavigation bars by themselves aren't terribly interesting. In order to display text or\ncontrols, you need to create a navigation bar item:\n\n```\nvar navigationBarItem = window.nativeControls.NavigationBarItem();\nnavigationBarItem.title = \"View Title\";\n```\n\nAt this point, one can add Bar Buttons to the left or right side:\n\n```\nnavigationBarItem.leftButtons = [ button1, button2 ];\nnavigationBarItem.rightButtons = [ button3, button4 ];\n```\n\nAfter adding buttons, it can be pushed onto a navigation bar:\n\n```\nnavigationBar.push ( navigationBarItem );\n```\n\nIf further items are pushed, a back button appears with the title of the previous item. The\nuser could pop it manually (by pressing the back button), or this will pop it programmatically:\n\n```\nnavigationBar.pop ();\n```\n\n### Bar Buttons\n\nBar buttons can be added to navigation items and tool bars. They can be a text label or\nan icon. They will be tinted with their parent container's tint color (unless overridden).\n\n```\nvar button1 = window.nativeControls.BarButton();\nbutton1.title = \"Add\"\nvar button2 = window.nativeControls.BarButton();\nbutton2.image = \"/path/to/image\" -- no .png or @2x\n```\n\nIn order to respond to a button tap, you can attach an event handler:\n\n```\nbutton1.addEventListener ( \"tap\", function (evt) { ... } );\n```\n\nYou can also remove event listeners when you no longer need to respond to the event.\n\nImages will use \"@2x\" retina assets automatically if provided, and will scale them appropriately\nif @1x retina assets are not provided. If the image is in the \"www\" directory, or a subdirectory,\nrefer to it like so:\n\n```\nbutton3.image = \"/www/img/book\";\n```\n\n### Tool Bars\n\nTool bars can be created like this:\n\n```\nvar toolbar = window.nativeControls.ToolBar();\ntoolbar.buttons = [button1, button2];\ntoolbar.tintColor = window.nativeControls.Color (\"blue\");\ntoolbar.addToView();\n```\n\nToolbars can also be positioned by changing their `frame` property.\n\n### Message Boxes and Action Sheets\n\nThese are lumped together, because although they are presentationally different (on iPhone),\nthey are very similar logically.\n\nA message box can be created as follows:\n\n```\nvar messageBox = window.nativeControls.MessageBox();\nmessageBox.title = \"Title of the message\";\nmessageBox.text = \"Are you sure?\";\nmessageBox.addButtons ( \"Yes\", \"No\", \"Cancel\" );\nmessageBox.cancelButtonIndex = 2; -- zero-based\nmessageBox.addEventListener ( \"tap\", function ( evt ) { console.log ( evt.data ); } );\nmessageBox.show();\n```\n\nMessage boxes can be hidden by calling `hide` -- any event handler will be called with the\ncancel button index.\n\nAlert boxes are created very similarly, except they don't support the `text` property. \nFurthermore, they add an additional property called `destructiveButtonIndex` that can\nbe used to specify which button will have a destructive effect, like so:\n\n```\nvar actionSheet = window.nativeControls.ActionSheet();\nactionSheet.title = \"Title of sheet\";\nactionSheet.addButtons ( \"Delete\", \"Share\", \"Cancel\" );\nactionSheet.cancelButtonIndex = 2;\nactionSheet.destructiveButtonIndex = 0;\nactionSheet.show();\n```\n\n","maintainers":[{"name":"kerrishotts","email":"kerrishotts@gmail.com"}],"time":{"modified":"2014-01-06T07:37:52.150Z","created":"2014-01-06T02:14:46.042Z","1.0.0":"2014-01-06T02:14:46.930Z","1.0.1":"2014-01-06T07:37:52.150Z"},"_attachments":{"com.photokandy.nativecontrols-1.0.1.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-LYAogQAAF9srxh2Ct8+XtA==","length":15040,"stub":true},"com.photokandy.nativecontrols-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-VSxlbPKkuxXr1/aPZOIWYA==","length":11258,"stub":true}}}},
{"id":"com.pixelcode.phonegap.appirater","key":"com.pixelcode.phonegap.appirater","value":{"rev":"3-7464e84cb38da329c4c37670053817fc"},"doc":{"_id":"com.pixelcode.phonegap.appirater","_rev":"3-7464e84cb38da329c4c37670053817fc","name":"com.pixelcode.phonegap.appirater","description":"Cordova plugin to use the Appirater iOS dialog.","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"version":"0.0.1","name":"com.pixelcode.phonegap.appirater","cordova_name":"Appirater Plugin","description":"Cordova plugin to use the Appirater iOS dialog.","license":"MIT License","keywords":["cordova"," appirater"],"engines":[{"name":"cordova","version":">=3.0"}],"readme":"# Appirater plugin for PhoneGap\n\nThis plugin allows you to send \"significant events\" to the Appirater plugin from within PhoneGap.\n\n## Methods\n\n### addAppiraterEvent\n\n addAppiraterEvent()\n\nIncrements the significant event counter of Appirater.\n\nExample:\n\n window.plugins.CDVPluginAppirater.addAppiraterEvent();","readmeFilename":"readme.md","_id":"com.pixelcode.phonegap.appirater@0.0.1","dist":{"shasum":"09ea73d70ea978e88a4259bd48e972def54c730d","tarball":"http://registry.cordova.io/com.pixelcode.phonegap.appirater/-/com.pixelcode.phonegap.appirater-0.0.1.tgz"},"_from":"/Users/markwheeler/Documents/Websites/Adobe/PhoneGap/Appirater/","_npmVersion":"1.3.4","_npmUser":{"name":"pixelcode","email":"sub@pixelcode.co.uk"},"maintainers":[{"name":"pixelcode","email":"sub@pixelcode.co.uk"}]}},"readme":"# Appirater plugin for PhoneGap\n\nThis plugin allows you to send \"significant events\" to the Appirater plugin from within PhoneGap.\n\n## Methods\n\n### addAppiraterEvent\n\n addAppiraterEvent()\n\nIncrements the significant event counter of Appirater.\n\nExample:\n\n window.plugins.CDVPluginAppirater.addAppiraterEvent();","maintainers":[{"name":"pixelcode","email":"sub@pixelcode.co.uk"}],"time":{"modified":"2013-12-10T09:37:56.055Z","created":"2013-12-10T09:37:55.148Z","0.0.1":"2013-12-10T09:37:56.055Z"},"_attachments":{"com.pixelcode.phonegap.appirater-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-csiQHPqx8nDCpqhTbWfoKw==","length":1359,"stub":true}}}},
{"id":"com.plidstone.phonegap.plugins.video-thumbnail","key":"com.plidstone.phonegap.plugins.video-thumbnail","value":{"rev":"3-516fbd8a44b96e6d890f747871aaa0d3"},"doc":{"_id":"com.plidstone.phonegap.plugins.video-thumbnail","_rev":"3-516fbd8a44b96e6d890f747871aaa0d3","name":"com.plidstone.phonegap.plugins.video-thumbnail","description":"A plugin that allows a user to select a thumbnail from a given video, the video URL is passed to the plugin and a base64 encoded image is sent back, Cordova 3.0.0+","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"version":"0.0.1","name":"com.plidstone.phonegap.plugins.video-thumbnail","cordova_name":"VideoThumbnail","description":"A plugin that allows a user to select a thumbnail from a given video, the video URL is passed to the plugin and a base64 encoded image is sent back, Cordova 3.0.0+","keywords":["video","thumbnail","ios","cordova"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"VideoThumbnail\n================\n\nA plugin to allow the selection of a thumbnail from a video source, the path to the video is supplied to the function and a base64 encoded image is returned to the javascript. the thumbnail is taken from the srubbers current position.\n\nExample usage\n=============\nthumbnailSuccess: function(imageData) {\n var smallImage = document.getElementById('myimage');\n smallImage.src = \"data:image/jpeg;base64,\" + imageData;\n},\nthumbnailError: function(error) {\n console.log('error getting thumbnail')\n},\ngetThumbnail: function() {\n window.VideoThumbnail.getThumbnail(thumbnailSuccess, thumbnailError, app.mediaPath);\n},\n","readmeFilename":"README.md","_id":"com.plidstone.phonegap.plugins.video-thumbnail@0.0.1","dist":{"shasum":"426811a0681c45758a9445b67aad8abe45edb822","tarball":"http://registry.cordova.io/com.plidstone.phonegap.plugins.video-thumbnail/-/com.plidstone.phonegap.plugins.video-thumbnail-0.0.1.tgz"},"_from":"VideoThumbnail/","_npmVersion":"1.3.4","_npmUser":{"name":"plidstone","email":"plidstone@gmail.com"},"maintainers":[{"name":"plidstone","email":"plidstone@gmail.com"}]}},"readme":"VideoThumbnail\n================\n\nA plugin to allow the selection of a thumbnail from a video source, the path to the video is supplied to the function and a base64 encoded image is returned to the javascript. the thumbnail is taken from the srubbers current position.\n\nExample usage\n=============\nthumbnailSuccess: function(imageData) {\n var smallImage = document.getElementById('myimage');\n smallImage.src = \"data:image/jpeg;base64,\" + imageData;\n},\nthumbnailError: function(error) {\n console.log('error getting thumbnail')\n},\ngetThumbnail: function() {\n window.VideoThumbnail.getThumbnail(thumbnailSuccess, thumbnailError, app.mediaPath);\n},\n","maintainers":[{"name":"plidstone","email":"plidstone@gmail.com"}],"time":{"modified":"2013-12-12T12:22:09.143Z","created":"2013-12-12T12:22:08.301Z","0.0.1":"2013-12-12T12:22:09.143Z"},"_attachments":{"com.plidstone.phonegap.plugins.video-thumbnail-0.0.1.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-cGLkMjtW0BWIzzYsU+U8+w==","length":2855,"stub":true}}}},
{"id":"com.polyvi.plugins.weibo","key":"com.polyvi.plugins.weibo","value":{"rev":"3-6f3ad8e0783775006825728f9ebef133"},"doc":{"_id":"com.polyvi.plugins.weibo","_rev":"3-6f3ad8e0783775006825728f9ebef133","name":"com.polyvi.plugins.weibo","description":"Weibo plugin for Apache Cordova","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.4":{"version":"1.0.4","name":"com.polyvi.plugins.weibo","cordova_name":"weibo","description":"Weibo plugin for Apache Cordova","license":"Apache 2.0","keywords":["weibo"," cordova"],"engines":[{"name":"cordova","version":">=2.5.0"}],"readme":"##cordova-plugin-weibo\r\n\r\n1. To install this plugin, try\r\n\r\n ```cordova plugin add https://github.com/polyvi/cordova-plugin-weibo.git```\r\n\r\n and further follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\r\n\r\n2. If you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/guide_plugin_ref_plugman.md.html).\r\n","readmeFilename":"README.md","_id":"com.polyvi.plugins.weibo@1.0.4","dist":{"shasum":"1a660fa41ae7e4835be4f626922901e67c68e914","tarball":"http://registry.cordova.io/com.polyvi.plugins.weibo/-/com.polyvi.plugins.weibo-1.0.4.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"huanghf","email":"huanghf@polyvi.com"},"maintainers":[{"name":"huanghf","email":"huanghf@polyvi.com"}]}},"readme":"##cordova-plugin-weibo\r\n\r\n1. To install this plugin, try\r\n\r\n ```cordova plugin add https://github.com/polyvi/cordova-plugin-weibo.git```\r\n\r\n and further follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\r\n\r\n2. If you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/guide_plugin_ref_plugman.md.html).\r\n","maintainers":[{"name":"huanghf","email":"huanghf@polyvi.com"}],"time":{"modified":"2013-09-26T03:39:10.574Z","created":"2013-09-26T03:39:07.310Z","1.0.4":"2013-09-26T03:39:10.574Z"},"_attachments":{"com.polyvi.plugins.weibo-1.0.4.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-t+ih5TlZpGJtFUrkIdzH1Q==","length":9591,"stub":true}}}},
{"id":"com.red_folder.phonegap.plugin.backgroundservice","key":"com.red_folder.phonegap.plugin.backgroundservice","value":{"rev":"3-ace49af34fd282a7751609110fddc116"},"doc":{"_id":"com.red_folder.phonegap.plugin.backgroundservice","_rev":"3-ace49af34fd282a7751609110fddc116","name":"com.red_folder.phonegap.plugin.backgroundservice","description":"\r\n Framework code that allows the development and operation of an Android Background Service.\r\n ","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"version":"2.0.0","name":"com.red_folder.phonegap.plugin.backgroundservice","cordova_name":"Background Service Plugin - Core logic","description":"\r\n Framework code that allows the development and operation of an Android Background Service.\r\n ","license":"Apache 2.0 License","engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"# Background Service Plugin Core (bgs-core)\r\n\r\n## Quick summary\r\nThis repository provides the core functionality for the Background Service Plugin for Cordova. The functionality is not a complete plugin - it is intended to be extended by developers to create their own background service.\r\n\r\nAn example background service is provided in the https://github.com/Red-Folder/bgs-sample repository.\r\n\r\n## Getting started\r\nTo understand how to create your own background service it is advised that you read the following articles:\r\n\r\n* [Using the MyService Sample] (https://github.com/Red-Folder/bgs-core/wiki/Using-the-MyService-Sample)\r\n* [Build your own Background Service] (https://github.com/Red-Folder/bgs-core/wiki/Build-your-own-Background-Service)\r\n* [Build your own plugin] (https://github.com/Red-Folder/bgs-core/wiki/Build-your-own-plugin)\r\n\r\nFurther documentation can be found at https://github.com/Red-Folder/bgs-core/wiki\r\n\r\n## Questions and Support\r\nIf you have problems, then please log an issue against the bgs-core repository (https://github.com/Red-Folder/bgs-core/issues).\r\n\r\nAs the plugin is updated (for new features or fixes) I will tweet via @FolderRed and blog http://red-folder.blogspot.co.uk/\r\n\r\n## Older version\r\nThis version of the plugin is intended to work with Cordova 3.0.0+\r\n\r\nThe older version of the plugin is available at https://github.com/Red-Folder/Cordova-Plugin-BackgroundService. Please note however that this older repository is unlikely to be maintained going forwards. It is advised that you move to Cordova 3.x.x as soon as possible.\r\n\r\n## Spread the love\r\n\r\nIf you find the Background Service Plugin useful then spread the love.\r\n\r\nAll the work I do on the Plugin is done in my spare time - time I would otherwise be spending taking my wife out for a nice meal or helping my lad find vinyl records (he's currently very much into The Smiths, Fleetwood Mac and Kate Bush).\r\n\r\nThe Plugin is free and will always remain free. I will continue to develop, maintain and distribute the Plugin under the MIT License.\r\n\r\nhttps://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=E64TCFQ3NLHZ8\r\n\r\n## Licence\r\nCopyright 2013 Red Folder Consultancy Ltd\r\n \r\nLicensed under the Apache License, Version 2.0 (the \"License\"); \r\nyou may not use this file except in compliance with the License. \r\nYou may obtain a copy of the License at \r\n \r\nhttp://www.apache.org/licenses/LICENSE-2.0 \r\n \r\nUnless required by applicable law or agreed to in writing, software \r\ndistributed under the License is distributed on an \"AS IS\" BASIS, \r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. \r\nSee the License for the specific language governing permissions and \r\nlimitations under the License.","readmeFilename":"README.md","_id":"com.red_folder.phonegap.plugin.backgroundservice@2.0.0","dist":{"shasum":"47846b57791d213b331c92248fabdbe76d76646a","tarball":"http://registry.cordova.io/com.red_folder.phonegap.plugin.backgroundservice/-/com.red_folder.phonegap.plugin.backgroundservice-2.0.0.tgz"},"_from":"bgs-core","_npmVersion":"1.3.4","_npmUser":{"name":"redfolder","email":"markbryantaylor@gmail.com"},"maintainers":[{"name":"redfolder","email":"markbryantaylor@gmail.com"}]}},"readme":"# Background Service Plugin Core (bgs-core)\r\n\r\n## Quick summary\r\nThis repository provides the core functionality for the Background Service Plugin for Cordova. The functionality is not a complete plugin - it is intended to be extended by developers to create their own background service.\r\n\r\nAn example background service is provided in the https://github.com/Red-Folder/bgs-sample repository.\r\n\r\n## Getting started\r\nTo understand how to create your own background service it is advised that you read the following articles:\r\n\r\n* [Using the MyService Sample] (https://github.com/Red-Folder/bgs-core/wiki/Using-the-MyService-Sample)\r\n* [Build your own Background Service] (https://github.com/Red-Folder/bgs-core/wiki/Build-your-own-Background-Service)\r\n* [Build your own plugin] (https://github.com/Red-Folder/bgs-core/wiki/Build-your-own-plugin)\r\n\r\nFurther documentation can be found at https://github.com/Red-Folder/bgs-core/wiki\r\n\r\n## Questions and Support\r\nIf you have problems, then please log an issue against the bgs-core repository (https://github.com/Red-Folder/bgs-core/issues).\r\n\r\nAs the plugin is updated (for new features or fixes) I will tweet via @FolderRed and blog http://red-folder.blogspot.co.uk/\r\n\r\n## Older version\r\nThis version of the plugin is intended to work with Cordova 3.0.0+\r\n\r\nThe older version of the plugin is available at https://github.com/Red-Folder/Cordova-Plugin-BackgroundService. Please note however that this older repository is unlikely to be maintained going forwards. It is advised that you move to Cordova 3.x.x as soon as possible.\r\n\r\n## Spread the love\r\n\r\nIf you find the Background Service Plugin useful then spread the love.\r\n\r\nAll the work I do on the Plugin is done in my spare time - time I would otherwise be spending taking my wife out for a nice meal or helping my lad find vinyl records (he's currently very much into The Smiths, Fleetwood Mac and Kate Bush).\r\n\r\nThe Plugin is free and will always remain free. I will continue to develop, maintain and distribute the Plugin under the MIT License.\r\n\r\nhttps://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=E64TCFQ3NLHZ8\r\n\r\n## Licence\r\nCopyright 2013 Red Folder Consultancy Ltd\r\n \r\nLicensed under the Apache License, Version 2.0 (the \"License\"); \r\nyou may not use this file except in compliance with the License. \r\nYou may obtain a copy of the License at \r\n \r\nhttp://www.apache.org/licenses/LICENSE-2.0 \r\n \r\nUnless required by applicable law or agreed to in writing, software \r\ndistributed under the License is distributed on an \"AS IS\" BASIS, \r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. \r\nSee the License for the specific language governing permissions and \r\nlimitations under the License.","maintainers":[{"name":"redfolder","email":"markbryantaylor@gmail.com"}],"time":{"modified":"2014-01-06T21:43:26.945Z","created":"2014-01-06T21:43:25.551Z","2.0.0":"2014-01-06T21:43:26.945Z"},"_attachments":{"com.red_folder.phonegap.plugin.backgroundservice-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-zzEpisyHcDTne/IMZBte+w==","length":12757,"stub":true}}}},
{"id":"com.red_folder.phonegap.plugin.backgroundservice.sample","key":"com.red_folder.phonegap.plugin.backgroundservice.sample","value":{"rev":"3-b85e1bc68b90c096b83c440e978e03fc"},"doc":{"_id":"com.red_folder.phonegap.plugin.backgroundservice.sample","_rev":"3-b85e1bc68b90c096b83c440e978e03fc","name":"com.red_folder.phonegap.plugin.backgroundservice.sample","description":"\r\n Sample service to demonstrate the use of the Cordova Android Background Service\r\n ","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"version":"2.0.0","name":"com.red_folder.phonegap.plugin.backgroundservice.sample","cordova_name":"Background Service Plugin - Sample Background Service","description":"\r\n Sample service to demonstrate the use of the Cordova Android Background Service\r\n ","license":"Apache 2.0 License","engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"# Background Service Plugin Sample (bgs-sample)\r\n\r\n## Quick summary\r\nThis repository provides a sample background service built on the core functionality for the Background Service Plugin for Cordova (bgs-core). This repository is intended as a learning tool for those developers planning to use the bgs-core to create their own background service.\r\n\r\nThe bgs-core is provided in the https://github.com/Red-Folder/bgs-core repository.\r\n\r\n## Getting started\r\nTo understand how to create your own background service it is advised that you read the following articles:\r\n\r\n* [Using the MyService Sample] (https://github.com/Red-Folder/bgs-core/wiki/Using-the-MyService-Sample)\r\n* [Build your own Background Service] (https://github.com/Red-Folder/bgs-core/wiki/Build-your-own-Background-Service)\r\n* [Build your own plugin] (https://github.com/Red-Folder/bgs-core/wiki/Build-your-own-plugin)\r\n\r\nFurther documentation can be found at https://github.com/Red-Folder/bgs-core/wiki\r\n\r\n## Questions and Support\r\nIf you have problems, then please log an issue against the bgs-core repository (https://github.com/Red-Folder/bgs-core/issues).\r\n\r\nAs the plugin is updated (for new features or fixes) I will tweet via @FolderRed and blog http://red-folder.blogspot.co.uk/\r\n\r\n## Older version\r\nThis version of the plugin is intended to work with Cordova 3.0.0+\r\n\r\nThe older version of the plugin is available at https://github.com/Red-Folder/Cordova-Plugin-BackgroundService. Please note however that this older repository is unlikely to be maintained going forwards. It is advised that you move to Cordova 3.x.x as soon as possible.\r\n\r\n## Spread the love\r\n\r\nIf you find the Background Service Plugin useful then spread the love.\r\n\r\nAll the work I do on the Plugin is done in my spare time - time I would otherwise be spending taking my wife out for a nice meal or helping my lad find vinyl records (he's currently very much into The Smiths, Fleetwood Mac and Kate Bush).\r\n\r\nThe Plugin is free and will always remain free. I will continue to develop, maintain and distribute the Plugin under the MIT License.\r\n\r\nhttps://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=E64TCFQ3NLHZ8\r\n\r\n## Licence\r\nCopyright 2013 Red Folder Consultancy Ltd\r\n \r\nLicensed under the Apache License, Version 2.0 (the \"License\"); \r\nyou may not use this file except in compliance with the License. \r\nYou may obtain a copy of the License at \r\n \r\nhttp://www.apache.org/licenses/LICENSE-2.0 \r\n \r\nUnless required by applicable law or agreed to in writing, software \r\ndistributed under the License is distributed on an \"AS IS\" BASIS, \r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. \r\nSee the License for the specific language governing permissions and \r\nlimitations under the License.","readmeFilename":"README.md","_id":"com.red_folder.phonegap.plugin.backgroundservice.sample@2.0.0","dist":{"shasum":"eac7b6fa5c9dc3668957de6c0325bc59353060dd","tarball":"http://registry.cordova.io/com.red_folder.phonegap.plugin.backgroundservice.sample/-/com.red_folder.phonegap.plugin.backgroundservice.sample-2.0.0.tgz"},"_from":"bgs-sample","_npmVersion":"1.3.4","_npmUser":{"name":"redfolder","email":"markbryantaylor@gmail.com"},"maintainers":[{"name":"redfolder","email":"markbryantaylor@gmail.com"}]}},"readme":"# Background Service Plugin Sample (bgs-sample)\r\n\r\n## Quick summary\r\nThis repository provides a sample background service built on the core functionality for the Background Service Plugin for Cordova (bgs-core). This repository is intended as a learning tool for those developers planning to use the bgs-core to create their own background service.\r\n\r\nThe bgs-core is provided in the https://github.com/Red-Folder/bgs-core repository.\r\n\r\n## Getting started\r\nTo understand how to create your own background service it is advised that you read the following articles:\r\n\r\n* [Using the MyService Sample] (https://github.com/Red-Folder/bgs-core/wiki/Using-the-MyService-Sample)\r\n* [Build your own Background Service] (https://github.com/Red-Folder/bgs-core/wiki/Build-your-own-Background-Service)\r\n* [Build your own plugin] (https://github.com/Red-Folder/bgs-core/wiki/Build-your-own-plugin)\r\n\r\nFurther documentation can be found at https://github.com/Red-Folder/bgs-core/wiki\r\n\r\n## Questions and Support\r\nIf you have problems, then please log an issue against the bgs-core repository (https://github.com/Red-Folder/bgs-core/issues).\r\n\r\nAs the plugin is updated (for new features or fixes) I will tweet via @FolderRed and blog http://red-folder.blogspot.co.uk/\r\n\r\n## Older version\r\nThis version of the plugin is intended to work with Cordova 3.0.0+\r\n\r\nThe older version of the plugin is available at https://github.com/Red-Folder/Cordova-Plugin-BackgroundService. Please note however that this older repository is unlikely to be maintained going forwards. It is advised that you move to Cordova 3.x.x as soon as possible.\r\n\r\n## Spread the love\r\n\r\nIf you find the Background Service Plugin useful then spread the love.\r\n\r\nAll the work I do on the Plugin is done in my spare time - time I would otherwise be spending taking my wife out for a nice meal or helping my lad find vinyl records (he's currently very much into The Smiths, Fleetwood Mac and Kate Bush).\r\n\r\nThe Plugin is free and will always remain free. I will continue to develop, maintain and distribute the Plugin under the MIT License.\r\n\r\nhttps://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=E64TCFQ3NLHZ8\r\n\r\n## Licence\r\nCopyright 2013 Red Folder Consultancy Ltd\r\n \r\nLicensed under the Apache License, Version 2.0 (the \"License\"); \r\nyou may not use this file except in compliance with the License. \r\nYou may obtain a copy of the License at \r\n \r\nhttp://www.apache.org/licenses/LICENSE-2.0 \r\n \r\nUnless required by applicable law or agreed to in writing, software \r\ndistributed under the License is distributed on an \"AS IS\" BASIS, \r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. \r\nSee the License for the specific language governing permissions and \r\nlimitations under the License.","maintainers":[{"name":"redfolder","email":"markbryantaylor@gmail.com"}],"time":{"modified":"2014-01-06T21:47:04.625Z","created":"2014-01-06T21:47:03.445Z","2.0.0":"2014-01-06T21:47:04.625Z"},"_attachments":{"com.red_folder.phonegap.plugin.backgroundservice.sample-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-TOHye2ajUS0Tki0/Tqo+Ng==","length":4268,"stub":true}}}},
{"id":"com.risingj.cordova.livetiles","key":"com.risingj.cordova.livetiles","value":{"rev":"3-7af801b4431dcbcd2aa4f95adbd593c1"},"doc":{"_id":"com.risingj.cordova.livetiles","_rev":"3-7af801b4431dcbcd2aa4f95adbd593c1","name":"com.risingj.cordova.livetiles","description":"Cordova plugin for updating tiles on WP7 + WP8","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"version":"0.1.0","name":"com.risingj.cordova.livetiles","cordova_name":"LiveTiles","description":"Cordova plugin for updating tiles on WP7 + WP8","license":"Apache 2.0","keywords":["cordova","live tiles"],"engines":[],"readme":"Live Tiles plugin usage:\r\n===============\r\n\r\nTo install using plugman\r\n---\r\n\t\r\nFrom plugin registry:\r\n\t\r\n\t$ plugman install --project . --platform wp7|wp8 --plugin com.risingj.cordova.livetiles\r\n\r\nFrom the repo:\r\n\t\r\n\t$ plugman install --project . --platform wp7|wp8 --plugin https://github.com/purplecabbage/livetiles.git\r\n\r\nFrom a local clone:\r\n\t\r\n\t$ plugman install --project . --platform wp7|wp8 --plugin #path_to_local_clone#\r\n\r\nTo install using cordova-cli\r\n---\r\n\r\nFrom plugin registry:\r\n\r\n\t$ cordova plugin add com.risingj.cordova.livetiles\r\n\r\nFrom the repo:\r\n\r\n\t$ cordova plugin add https://github.com/purplecabbage/livetiles.git\r\n\r\nFrom a local clone:\r\n\r\n\t$ cordova plugin add #path_to_local_clone#\t\t\r\n\r\n \r\n\r\nSomewhere in your code, after device ready has fired \r\n---\r\n \r\n\t// Update the applications live tile\r\n\tLiveTiles.updateAppTile(success, fail, { \r\n\t\ttitle: 'title', \r\n\t\timage:'Images/appbar.next.rest.png', \r\n\t\tcount: 5, \r\n\t\tbackTitle: 'Back title', \r\n\t\tbackContent:'Back side', \r\n\t\tbackImage : 'Images/appbar.close.rest.png'\r\n\t}); \r\n\r\n\t// create a secondary tile\r\n\tLiveTiles.createSecondaryTile(success, fail, { \r\n\t\ttitle: 'title', \r\n\t\timage: 'Images/appbar.save.rest.png', \r\n\t\tcount: 5, \r\n\t\tsecondaryTileUri: 'www/myPage.html',\r\n\t\tbackTitle:'back' \r\n\t});\r\n \r\n\r\n\t// update the secondary tile\r\n\tLiveTiles.updateSecondaryTile(success, fail, { \r\n\t\ttitle: 'title', \r\n\t\tcount: 5, \r\n\t\tsecondaryTileUri: 'www/myPage.html' \r\n\t});\r\n\r\n\t// remove the secondary tile\r\n\tLiveTiles.deleteSecondaryTile(success, fail, { \r\n\t\tsecondaryTileUri: 'www/myPage.html' \r\n\t});\r\n \r\n \r\n","readmeFilename":"README.md","_id":"com.risingj.cordova.livetiles@0.1.0","dist":{"shasum":"81eecc246ba3366b0f7bf61f640a790e24f6e888","tarball":"http://registry.cordova.io/com.risingj.cordova.livetiles/-/com.risingj.cordova.livetiles-0.1.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"purplecabbage","email":"purplecabbage@gmail.com"},"maintainers":[{"name":"purplecabbage","email":"purplecabbage@gmail.com"}]}},"readme":"Live Tiles plugin usage:\r\n===============\r\n\r\nTo install using plugman\r\n---\r\n\t\r\nFrom plugin registry:\r\n\t\r\n\t$ plugman install --project . --platform wp7|wp8 --plugin com.risingj.cordova.livetiles\r\n\r\nFrom the repo:\r\n\t\r\n\t$ plugman install --project . --platform wp7|wp8 --plugin https://github.com/purplecabbage/livetiles.git\r\n\r\nFrom a local clone:\r\n\t\r\n\t$ plugman install --project . --platform wp7|wp8 --plugin #path_to_local_clone#\r\n\r\nTo install using cordova-cli\r\n---\r\n\r\nFrom plugin registry:\r\n\r\n\t$ cordova plugin add com.risingj.cordova.livetiles\r\n\r\nFrom the repo:\r\n\r\n\t$ cordova plugin add https://github.com/purplecabbage/livetiles.git\r\n\r\nFrom a local clone:\r\n\r\n\t$ cordova plugin add #path_to_local_clone#\t\t\r\n\r\n \r\n\r\nSomewhere in your code, after device ready has fired \r\n---\r\n \r\n\t// Update the applications live tile\r\n\tLiveTiles.updateAppTile(success, fail, { \r\n\t\ttitle: 'title', \r\n\t\timage:'Images/appbar.next.rest.png', \r\n\t\tcount: 5, \r\n\t\tbackTitle: 'Back title', \r\n\t\tbackContent:'Back side', \r\n\t\tbackImage : 'Images/appbar.close.rest.png'\r\n\t}); \r\n\r\n\t// create a secondary tile\r\n\tLiveTiles.createSecondaryTile(success, fail, { \r\n\t\ttitle: 'title', \r\n\t\timage: 'Images/appbar.save.rest.png', \r\n\t\tcount: 5, \r\n\t\tsecondaryTileUri: 'www/myPage.html',\r\n\t\tbackTitle:'back' \r\n\t});\r\n \r\n\r\n\t// update the secondary tile\r\n\tLiveTiles.updateSecondaryTile(success, fail, { \r\n\t\ttitle: 'title', \r\n\t\tcount: 5, \r\n\t\tsecondaryTileUri: 'www/myPage.html' \r\n\t});\r\n\r\n\t// remove the secondary tile\r\n\tLiveTiles.deleteSecondaryTile(success, fail, { \r\n\t\tsecondaryTileUri: 'www/myPage.html' \r\n\t});\r\n \r\n \r\n","maintainers":[{"name":"purplecabbage","email":"purplecabbage@gmail.com"}],"time":{"modified":"2013-12-14T10:55:00.212Z","created":"2013-12-14T10:54:59.366Z","0.1.0":"2013-12-14T10:55:00.212Z"},"_attachments":{"com.risingj.cordova.livetiles-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-BF3eu73tZpUbCNCZKYgLkA==","length":3998,"stub":true}}}},
{"id":"com.risingj.cordova.maplauncher","key":"com.risingj.cordova.maplauncher","value":{"rev":"3-6f3dde858858a731fb756abfcc296be7"},"doc":{"_id":"com.risingj.cordova.maplauncher","_rev":"3-6f3dde858858a731fb756abfcc296be7","name":"com.risingj.cordova.maplauncher","description":"Cordova plugin launching the maps application with directions, a landmark, or search term.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"version":"0.1.0","name":"com.risingj.cordova.maplauncher","cordova_name":"MapLauncher","description":"Cordova plugin launching the maps application with directions, a landmark, or search term.","license":"Apache 2.0","keywords":["cordova","maps"],"engines":[],"readme":"MapLauncher plugin usage:\r\n===============\r\n\r\n\r\nThe MapLauncher plugin allows you to launch the Windows Phone Map application in a defined state.\r\nYou can either open maps in Directions view, or Map view, depending on the calls you make.\r\nThe user will need to press the back button to return to your app.\r\n\r\nSomewhere in your code :\r\n---\r\n\r\n // Search near the current location using a keyword :\r\n MapLauncher.searchNear(\"Malaysian Food\");\r\n\r\n // Search for a keyword near a specific location :\r\n MapLauncher.searchNear(\"Wedding Chapel\",{latitude:36.111224, longitude:-115.172194});\r\n\r\n // Get directions from the current location to a nearby keyword :\r\n MapLauncher.getDirections({label:\"Malaysian Food\"});\r\n\r\n // Get directions from a specific location to a nearby keyword :\r\n MapLauncher.getDirections({label:\"Malaysian Food\"},{coordinates:{latitude:36.111224, longitude:-115.172194}});\r\n \r\n ","readmeFilename":"README.md","_id":"com.risingj.cordova.maplauncher@0.1.0","dist":{"shasum":"d9b6d213c0741d9f20f29f7c50b74ce3add05483","tarball":"http://registry.cordova.io/com.risingj.cordova.maplauncher/-/com.risingj.cordova.maplauncher-0.1.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"purplecabbage","email":"purplecabbage@gmail.com"},"maintainers":[{"name":"purplecabbage","email":"purplecabbage@gmail.com"}]}},"readme":"MapLauncher plugin usage:\r\n===============\r\n\r\n\r\nThe MapLauncher plugin allows you to launch the Windows Phone Map application in a defined state.\r\nYou can either open maps in Directions view, or Map view, depending on the calls you make.\r\nThe user will need to press the back button to return to your app.\r\n\r\nSomewhere in your code :\r\n---\r\n\r\n // Search near the current location using a keyword :\r\n MapLauncher.searchNear(\"Malaysian Food\");\r\n\r\n // Search for a keyword near a specific location :\r\n MapLauncher.searchNear(\"Wedding Chapel\",{latitude:36.111224, longitude:-115.172194});\r\n\r\n // Get directions from the current location to a nearby keyword :\r\n MapLauncher.getDirections({label:\"Malaysian Food\"});\r\n\r\n // Get directions from a specific location to a nearby keyword :\r\n MapLauncher.getDirections({label:\"Malaysian Food\"},{coordinates:{latitude:36.111224, longitude:-115.172194}});\r\n \r\n ","maintainers":[{"name":"purplecabbage","email":"purplecabbage@gmail.com"}],"time":{"modified":"2013-12-16T05:50:31.865Z","created":"2013-12-16T05:50:30.797Z","0.1.0":"2013-12-16T05:50:31.865Z"},"_attachments":{"com.risingj.cordova.maplauncher-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-f/1jfF/ilA7xCnpko+/qEQ==","length":2558,"stub":true}}}},
{"id":"com.risingj.cordova.socialshare","key":"com.risingj.cordova.socialshare","value":{"rev":"3-78066f93ffda3f3bf7a6d821d01a55dc"},"doc":{"_id":"com.risingj.cordova.socialshare","_rev":"3-78066f93ffda3f3bf7a6d821d01a55dc","name":"com.risingj.cordova.socialshare","description":"Cordova plugin for sharing links, and text to social networks.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"version":"0.1.0","name":"com.risingj.cordova.socialshare","cordova_name":"Social Share","description":"Cordova plugin for sharing links, and text to social networks.","license":"Apache 2.0","keywords":["cordova","social","share","facebook","twitter"],"engines":[],"readme":"A simple plugin for sharing status updates and links to social networks. Easy fire and forget will post to user's installed accounts. User leaves your app to complete the process, and is returned afterwards.\r\n\r\n\r\nTo install using plugman\r\n---\r\n \r\nFrom plugin registry:\r\n \r\n $ plugman install --project . --platform wp7|wp8 --plugin com.risingj.cordova.socialshare\r\n\r\nFrom the repo:\r\n \r\n $ plugman install --project . --platform wp7|wp8 --plugin https://github.com/purplecabbage/social-share.git\r\n\r\nFrom a local clone:\r\n \r\n $ plugman install --project . --platform wp7|wp8 --plugin #path_to_local_clone#\r\n\r\nTo install using cordova-cli\r\n---\r\n\r\nFrom plugin registry:\r\n\r\n $ cordova plugin add com.risingj.cordova.socialshare\r\n\r\nFrom the repo:\r\n\r\n $ cordova plugin add https://github.com/purplecabbage/social-share.git\r\n\r\nFrom a local clone:\r\n\r\n $ cordova plugin add #path_to_local_clone# \r\n\r\nSample Usage \r\n===\r\n\r\nSomewhere in your code \r\n---\r\n\r\n function shareStatus()\r\n {\r\n SocialShare.shareStatus(\"This was shared from JS+PhoneGap+WP8 Yo! Using the SocialShare plugin.\");\r\n }\r\n\r\n function shareLink()\r\n {\r\n SocialShare.shareLink(\"SocialShare plugin for Apache Cordova\",\r\n \"https://github.com/purplecabbage/social-share\",\r\n \"Watch for updates here soon! Shared from JavaScript\");\r\n }\r\n\r\n\r\nIn your markup :\r\n---\r\n\r\n <input style=\"display:block;margin:40px 0px\" type=\"button\" onclick=\"shareLink()\" value=\"Share a Link\"/>\r\n <input style=\"display:block;margin:40px 0px\" type=\"button\" onclick=\"shareStatus()\" value=\"Update your Status\"/>\r\n","readmeFilename":"readme.md","_id":"com.risingj.cordova.socialshare@0.1.0","dist":{"shasum":"77569b331268d207549c1c84c52b31082c648584","tarball":"http://registry.cordova.io/com.risingj.cordova.socialshare/-/com.risingj.cordova.socialshare-0.1.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"purplecabbage","email":"purplecabbage@gmail.com"},"maintainers":[{"name":"purplecabbage","email":"purplecabbage@gmail.com"}]}},"readme":"A simple plugin for sharing status updates and links to social networks. Easy fire and forget will post to user's installed accounts. User leaves your app to complete the process, and is returned afterwards.\r\n\r\n\r\nTo install using plugman\r\n---\r\n \r\nFrom plugin registry:\r\n \r\n $ plugman install --project . --platform wp7|wp8 --plugin com.risingj.cordova.socialshare\r\n\r\nFrom the repo:\r\n \r\n $ plugman install --project . --platform wp7|wp8 --plugin https://github.com/purplecabbage/social-share.git\r\n\r\nFrom a local clone:\r\n \r\n $ plugman install --project . --platform wp7|wp8 --plugin #path_to_local_clone#\r\n\r\nTo install using cordova-cli\r\n---\r\n\r\nFrom plugin registry:\r\n\r\n $ cordova plugin add com.risingj.cordova.socialshare\r\n\r\nFrom the repo:\r\n\r\n $ cordova plugin add https://github.com/purplecabbage/social-share.git\r\n\r\nFrom a local clone:\r\n\r\n $ cordova plugin add #path_to_local_clone# \r\n\r\nSample Usage \r\n===\r\n\r\nSomewhere in your code \r\n---\r\n\r\n function shareStatus()\r\n {\r\n SocialShare.shareStatus(\"This was shared from JS+PhoneGap+WP8 Yo! Using the SocialShare plugin.\");\r\n }\r\n\r\n function shareLink()\r\n {\r\n SocialShare.shareLink(\"SocialShare plugin for Apache Cordova\",\r\n \"https://github.com/purplecabbage/social-share\",\r\n \"Watch for updates here soon! Shared from JavaScript\");\r\n }\r\n\r\n\r\nIn your markup :\r\n---\r\n\r\n <input style=\"display:block;margin:40px 0px\" type=\"button\" onclick=\"shareLink()\" value=\"Share a Link\"/>\r\n <input style=\"display:block;margin:40px 0px\" type=\"button\" onclick=\"shareStatus()\" value=\"Update your Status\"/>\r\n","maintainers":[{"name":"purplecabbage","email":"purplecabbage@gmail.com"}],"time":{"modified":"2013-12-17T08:02:30.045Z","created":"2013-12-17T08:02:29.172Z","0.1.0":"2013-12-17T08:02:30.045Z"},"_attachments":{"com.risingj.cordova.socialshare-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-scb+IbwVQDaNDc2VuFk/Qg==","length":2326,"stub":true}}}},
{"id":"com.scringo.cordova.plugin.scringo","key":"com.scringo.cordova.plugin.scringo","value":{"rev":"3-14fc1667cea3060719045e9f4267d3bd"},"doc":{"_id":"com.scringo.cordova.plugin.scringo","_rev":"3-14fc1667cea3060719045e9f4267d3bd","name":"com.scringo.cordova.plugin.scringo","description":"Now you can create and manage your mobile community with Scringo for Cordova. For more information go to http://www.scringo.com","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.scringo.cordova.plugin.scringo","cordova_name":"Scringo Plugin for Cordova iOS","description":"Now you can create and manage your mobile community with Scringo for Cordova. For more information go to http://www.scringo.com","license":"Apache 2.0","keywords":["cordova","Scringo"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Scringo Plugin for Phonegap (Apache Cordova)\n============================================\nCreated by Guy Federovsky (guy@scringo.com)\n\nFollows the [Cordova Plugin spec](http://cordova.apache.org/docs/en/3.0.0/plugin_ref_spec.md), so that it works with [Plugman](https://github.com/apache/cordova-plugman). \nTo import the plugin please use [Plugman](http://npmjs.org/plugman) or the [Cordova CLI tool](http://npmjs.org/cordova). \n\nNote: For this to work you need to download and install **Scringo SDK** within your project. \nFor iOS, please see http://docs.scringo.com/ios-guides/hello/ for more details. \nFor Android, please see http://docs.scringo.com/android-guides/quickstart/ for more details. \n\nThe \"scringo\" variable is installed globally.\n\nQuick Example (initialization and Sidebar adding)\n-------------------------------------------------\n```js\nscringo.initWithAppId(\"YOUR SCRINGO APP ID\", \n function() { \n \tconsole.log(\"Done Init Scringo\"); \n \tscringo.addSidebar(toLeft); \n }, \n function(errorMessage) { \n \talert(\"Scringo failed to start: \" + errorMessage); \n }); \nscringo.setTestMode(1); \n```\n\nFull Example\n------------\n```html\n<!DOCTYPE html>\n<html>\n <head>\n <title>Cordova Scringo Example</title>\n \n <script type=\"text/javascript\" charset=\"utf-8\" src=\"phonegap.js\"></script>\n <script type=\"text/javascript\" charset=\"utf-8\">\n \n var deviceReady = false;\n \n /**\n * Function called when page has finished loading.\n */\n function init() {\n document.addEventListener(\"deviceready\", function() {\n scringo.initWithAppId(\"TEST_APP\", function() {\n console.log(\"Done Init Scringo\");\n }, function(errorMessage) {\n alert(\"Scringo failed to start: \" + errorMessage);\n });\n scringo.setTestMode(1);\n deviceReady = true;\n console.log(\"Device=\"+device.platform+\" \"+device.version);\n },\n false);\n window.setTimeout(function() {\n if (!deviceReady) {\n alert(\"Error: Apache Cordova did not initialize. Demo will not run correctly.\");\n }\n },\n 1000);\n }\n \n function addScringo() {\n scringo.addSidebar(1);\n }\n\n function openScringo() {\n scringo.isSidebarOpen(function(isOpen) {\n if (!isOpen) {\n scringo.openSidebar();\n }\n });\n }\n \n function openMenu() {\n scringo.openMenu(function(errorMessage) {alert(\"Failed opening Scringo Menu: \" + errorMessage);}, 0, 0);\n }\n \n function preloadQuizzes() {\n scringo.preloadQuizzes(function() {alert(\"Quizzes were preloaded\");});\n }\n\n function openQuiz() {\n scringo.openQuiz(1, 1);\n }\n\n function preloadChatRooms() {\n scringo.preloadChatRooms(function() {alert(\"Chat Rooms were preloaded\");});\n }\n \n function openChatRooms() {\n scringo.openChatRooms(1, 1);\n }\n \n function openMyProfile() {\n scringo.openMyProfile(1, 1);\n }\n \n function postToFeed() {\n scringo.postToFeed(\"Testing Phonegap client\", function(errorMessage) {alert(errorMessage);});\n }\n \n function getInboxBadgeNumber() {\n scringo.getFeatureBadgeNumber(1, function(badge) {alert(\"Inbox badge is \" + badge);}, function(errorMessage) {alert(errorMessage);});\n }\n \n function openChatWithTestUser() {\n scringo.openChatWithUser(\"testUser2\", 1, 1, function(errorMessage) {alert(errorMessage);});\n }\n \n </script>\n \n </head>\n <body onload=\"init();\" id=\"stage\" class=\"theme\">\n \n <h1>Scringo Sample</h1>\n <h2>Sidebar</h2>\n <div class=\"btn large\" onclick=\"addScringo();\">Add Scringo Sidebar</div>\n <div class=\"btn large\" onclick=\"openScringo();\">Open Scringo Sidebar</div>\n <h2>Screens</h2>\n <div class=\"btn large\" onclick=\"openMenu();\">Open Menu</div>\n <div class=\"btn large\" onclick=\"openQuiz();\">Open Quizzes</div>\n <div class=\"btn large\" onclick=\"openMyProfile();\">Open My Profile</div>\n <div class=\"btn large\" onclick=\"preloadChatRooms();\">Preload Chat Rooms</div>\n <div class=\"btn large\" onclick=\"openChatRooms();\">Open Chat Rooms</div>\n <h2>Advanced</h2>\n <div class=\"btn large\" onclick=\"postToFeed();\">Post To Feed</div>\n <div class=\"btn large\" onclick=\"getInboxBadgeNumber();\">Get Inbox Badge Number</div>\n <div class=\"btn large\" onclick=\"openChatWithTestUser();\">open Chat With Test User</div>\n <h2> </h2><div class=\"backBtn\" onclick=\"backHome();\">Back</div>\n </body>\n</html>\n```\n","readmeFilename":"README.md","_id":"com.scringo.cordova.plugin.scringo@1.0.0","dist":{"shasum":"19f1474a59cf6c37aa6c6f526c85833cae223b45","tarball":"http://registry.cordova.io/com.scringo.cordova.plugin.scringo/-/com.scringo.cordova.plugin.scringo-1.0.0.tgz"},"_from":"ScringoCordovaPlugin","_npmVersion":"1.3.4","_npmUser":{"name":"guyfeder","email":"guy@scringo.com"},"maintainers":[{"name":"guyfeder","email":"guy@scringo.com"}]}},"readme":"Scringo Plugin for Phonegap (Apache Cordova)\n============================================\nCreated by Guy Federovsky (guy@scringo.com)\n\nFollows the [Cordova Plugin spec](http://cordova.apache.org/docs/en/3.0.0/plugin_ref_spec.md), so that it works with [Plugman](https://github.com/apache/cordova-plugman). \nTo import the plugin please use [Plugman](http://npmjs.org/plugman) or the [Cordova CLI tool](http://npmjs.org/cordova). \n\nNote: For this to work you need to download and install **Scringo SDK** within your project. \nFor iOS, please see http://docs.scringo.com/ios-guides/hello/ for more details. \nFor Android, please see http://docs.scringo.com/android-guides/quickstart/ for more details. \n\nThe \"scringo\" variable is installed globally.\n\nQuick Example (initialization and Sidebar adding)\n-------------------------------------------------\n```js\nscringo.initWithAppId(\"YOUR SCRINGO APP ID\", \n function() { \n \tconsole.log(\"Done Init Scringo\"); \n \tscringo.addSidebar(toLeft); \n }, \n function(errorMessage) { \n \talert(\"Scringo failed to start: \" + errorMessage); \n }); \nscringo.setTestMode(1); \n```\n\nFull Example\n------------\n```html\n<!DOCTYPE html>\n<html>\n <head>\n <title>Cordova Scringo Example</title>\n \n <script type=\"text/javascript\" charset=\"utf-8\" src=\"phonegap.js\"></script>\n <script type=\"text/javascript\" charset=\"utf-8\">\n \n var deviceReady = false;\n \n /**\n * Function called when page has finished loading.\n */\n function init() {\n document.addEventListener(\"deviceready\", function() {\n scringo.initWithAppId(\"TEST_APP\", function() {\n console.log(\"Done Init Scringo\");\n }, function(errorMessage) {\n alert(\"Scringo failed to start: \" + errorMessage);\n });\n scringo.setTestMode(1);\n deviceReady = true;\n console.log(\"Device=\"+device.platform+\" \"+device.version);\n },\n false);\n window.setTimeout(function() {\n if (!deviceReady) {\n alert(\"Error: Apache Cordova did not initialize. Demo will not run correctly.\");\n }\n },\n 1000);\n }\n \n function addScringo() {\n scringo.addSidebar(1);\n }\n\n function openScringo() {\n scringo.isSidebarOpen(function(isOpen) {\n if (!isOpen) {\n scringo.openSidebar();\n }\n });\n }\n \n function openMenu() {\n scringo.openMenu(function(errorMessage) {alert(\"Failed opening Scringo Menu: \" + errorMessage);}, 0, 0);\n }\n \n function preloadQuizzes() {\n scringo.preloadQuizzes(function() {alert(\"Quizzes were preloaded\");});\n }\n\n function openQuiz() {\n scringo.openQuiz(1, 1);\n }\n\n function preloadChatRooms() {\n scringo.preloadChatRooms(function() {alert(\"Chat Rooms were preloaded\");});\n }\n \n function openChatRooms() {\n scringo.openChatRooms(1, 1);\n }\n \n function openMyProfile() {\n scringo.openMyProfile(1, 1);\n }\n \n function postToFeed() {\n scringo.postToFeed(\"Testing Phonegap client\", function(errorMessage) {alert(errorMessage);});\n }\n \n function getInboxBadgeNumber() {\n scringo.getFeatureBadgeNumber(1, function(badge) {alert(\"Inbox badge is \" + badge);}, function(errorMessage) {alert(errorMessage);});\n }\n \n function openChatWithTestUser() {\n scringo.openChatWithUser(\"testUser2\", 1, 1, function(errorMessage) {alert(errorMessage);});\n }\n \n </script>\n \n </head>\n <body onload=\"init();\" id=\"stage\" class=\"theme\">\n \n <h1>Scringo Sample</h1>\n <h2>Sidebar</h2>\n <div class=\"btn large\" onclick=\"addScringo();\">Add Scringo Sidebar</div>\n <div class=\"btn large\" onclick=\"openScringo();\">Open Scringo Sidebar</div>\n <h2>Screens</h2>\n <div class=\"btn large\" onclick=\"openMenu();\">Open Menu</div>\n <div class=\"btn large\" onclick=\"openQuiz();\">Open Quizzes</div>\n <div class=\"btn large\" onclick=\"openMyProfile();\">Open My Profile</div>\n <div class=\"btn large\" onclick=\"preloadChatRooms();\">Preload Chat Rooms</div>\n <div class=\"btn large\" onclick=\"openChatRooms();\">Open Chat Rooms</div>\n <h2>Advanced</h2>\n <div class=\"btn large\" onclick=\"postToFeed();\">Post To Feed</div>\n <div class=\"btn large\" onclick=\"getInboxBadgeNumber();\">Get Inbox Badge Number</div>\n <div class=\"btn large\" onclick=\"openChatWithTestUser();\">open Chat With Test User</div>\n <h2> </h2><div class=\"backBtn\" onclick=\"backHome();\">Back</div>\n </body>\n</html>\n```\n","maintainers":[{"name":"guyfeder","email":"guy@scringo.com"}],"time":{"modified":"2013-11-28T13:50:05.941Z","created":"2013-11-28T13:50:01.904Z","1.0.0":"2013-11-28T13:50:05.941Z"},"_attachments":{"com.scringo.cordova.plugin.scringo-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-dOBXxETV74ot/MSPf8aMdA==","length":10934,"stub":true}}}},
{"id":"com.shazron.cordova.plugin.keychainutil","key":"com.shazron.cordova.plugin.keychainutil","value":{"rev":"3-e491726268008dce7fb1a473cf8f61b8"},"doc":{"_id":"com.shazron.cordova.plugin.keychainutil","_rev":"3-e491726268008dce7fb1a473cf8f61b8","name":"com.shazron.cordova.plugin.keychainutil","description":"This plugin allows your app access to the iOS KeyChain from Cordova. See: https://developer.apple.com/library/mac/documentation/security/conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.shazron.cordova.plugin.keychainutil","cordova_name":"KeyChain Plugin for Cordova iOS","description":"This plugin allows your app access to the iOS KeyChain from Cordova. See: https://developer.apple.com/library/mac/documentation/security/conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html","license":"Apache 2.0","keywords":["keychain"],"engines":[{"name":"cordova","version":">=2.2.0"}],"readme":"Keychain Plugin for Apache Cordova\n=====================================\ncreated by Shazron Abdullah\n\n[Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0.html) except for the SFHFKeychainUtils code that is under **src/ios/SFHFKeychainUtils**\n\nFollows the [Cordova Plugin spec](http://cordova.apache.org/docs/en/3.0.0/plugin_ref_spec.md), so that it works with [Plugman](https://github.com/apache/cordova-plugman), or you can install it manually below.\n \nManually importing the plugin is not supported anymore, please use [Plugman](http://npmjs.org/plugman) or the [Cordova CLI tool](http://npmjs.org/cordova) \n\nThe \"Keychain\" object definition is installed globally. \n\nThe plugin's JavaScript functions are called after creating the plugin object thus:\n \n var kc = new Keychain();\n kc.getForKey(win, fail, \"some_key\", \"some_servicename\");\n \n**Important:**\n\n If you are saving a JSON string value in setForKey, for example after applying JSON.stringify on an object, you must escape the characters in that string, if not you cannot retrieve it using getForKey. \n \n var obj = { foo: 'bar' };\n var value = JSON.stringify(obj);\n value = value \n .replace(/[\\\\]/g, '\\\\\\\\')\n .replace(/[\\\"]/g, '\\\\\\\"')\n .replace(/[\\/]/g, '\\\\/')\n .replace(/[\\b]/g, '\\\\b')\n .replace(/[\\f]/g, '\\\\f')\n .replace(/[\\n]/g, '\\\\n')\n .replace(/[\\r]/g, '\\\\r')\n .replace(/[\\t]/g, '\\\\t');\n \nSee the **example** folder for example usage.\n\n // Get a reference to the plugin first\n var kc = new Keychain();\n\n /*\n Retrieves a value for a key and servicename.\n \n @param successCallback returns the value as the argument to the callback when successful\n @param failureCallback returns the error string as the argument to the callback, for a failure\n @param key the key to retrieve\n @param servicename the servicename to use\n */\n kc.getForKey(successCallback, failureCallback, 'key', 'servicename');\n \n /*\n Sets a value for a key and servicename.\n \n @param successCallback returns when successful\n @param failureCallback returns the error string as the argument to the callback, for a failure\n @param key the key to set\n @param servicename the servicename to use\n @param value the value to set\n */\n kc.setForKey(successCallback, failureCallback, 'key', 'servicename', 'value');\n \n /*\n Removes a value for a key and servicename.\n \n @param successCallback returns when successful\n @param failureCallback returns the error string as the argument to the callback\n @param key the key to remove\n @param servicename the servicename to use\n */\n kc.removeForKey(successCallback, failureCallback, 'key', 'servicename');\n","readmeFilename":"README.md","_id":"com.shazron.cordova.plugin.keychainutil@1.0.0","dist":{"shasum":"beb4bd0de0b063c2aa82ab3908b4010a6ffa8ea2","tarball":"http://registry.cordova.io/com.shazron.cordova.plugin.keychainutil/-/com.shazron.cordova.plugin.keychainutil-1.0.0.tgz"},"_from":"KeychainPlugin/","_npmVersion":"1.3.4","_npmUser":{"name":"shazron","email":"shazron@apache.org"},"maintainers":[{"name":"shazron","email":"shazron@apache.org"}]}},"readme":"Keychain Plugin for Apache Cordova\n=====================================\ncreated by Shazron Abdullah\n\n[Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0.html) except for the SFHFKeychainUtils code that is under **src/ios/SFHFKeychainUtils**\n\nFollows the [Cordova Plugin spec](http://cordova.apache.org/docs/en/3.0.0/plugin_ref_spec.md), so that it works with [Plugman](https://github.com/apache/cordova-plugman), or you can install it manually below.\n \nManually importing the plugin is not supported anymore, please use [Plugman](http://npmjs.org/plugman) or the [Cordova CLI tool](http://npmjs.org/cordova) \n\nThe \"Keychain\" object definition is installed globally. \n\nThe plugin's JavaScript functions are called after creating the plugin object thus:\n \n var kc = new Keychain();\n kc.getForKey(win, fail, \"some_key\", \"some_servicename\");\n \n**Important:**\n\n If you are saving a JSON string value in setForKey, for example after applying JSON.stringify on an object, you must escape the characters in that string, if not you cannot retrieve it using getForKey. \n \n var obj = { foo: 'bar' };\n var value = JSON.stringify(obj);\n value = value \n .replace(/[\\\\]/g, '\\\\\\\\')\n .replace(/[\\\"]/g, '\\\\\\\"')\n .replace(/[\\/]/g, '\\\\/')\n .replace(/[\\b]/g, '\\\\b')\n .replace(/[\\f]/g, '\\\\f')\n .replace(/[\\n]/g, '\\\\n')\n .replace(/[\\r]/g, '\\\\r')\n .replace(/[\\t]/g, '\\\\t');\n \nSee the **example** folder for example usage.\n\n // Get a reference to the plugin first\n var kc = new Keychain();\n\n /*\n Retrieves a value for a key and servicename.\n \n @param successCallback returns the value as the argument to the callback when successful\n @param failureCallback returns the error string as the argument to the callback, for a failure\n @param key the key to retrieve\n @param servicename the servicename to use\n */\n kc.getForKey(successCallback, failureCallback, 'key', 'servicename');\n \n /*\n Sets a value for a key and servicename.\n \n @param successCallback returns when successful\n @param failureCallback returns the error string as the argument to the callback, for a failure\n @param key the key to set\n @param servicename the servicename to use\n @param value the value to set\n */\n kc.setForKey(successCallback, failureCallback, 'key', 'servicename', 'value');\n \n /*\n Removes a value for a key and servicename.\n \n @param successCallback returns when successful\n @param failureCallback returns the error string as the argument to the callback\n @param key the key to remove\n @param servicename the servicename to use\n */\n kc.removeForKey(successCallback, failureCallback, 'key', 'servicename');\n","maintainers":[{"name":"shazron","email":"shazron@apache.org"}],"time":{"modified":"2013-10-08T21:41:52.936Z","created":"2013-10-08T21:41:51.570Z","1.0.0":"2013-10-08T21:41:52.936Z"},"_attachments":{"com.shazron.cordova.plugin.keychainutil-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-4mlH5TURw3S+zrSM8GOpqQ==","length":8541,"stub":true}}}},
{"id":"com.simonmacdonald.imeiplugin","key":"com.simonmacdonald.imeiplugin","value":{"rev":"3-199a029a3e57f6b7db8a7ec4cb07f275"},"doc":{"_id":"com.simonmacdonald.imeiplugin","_rev":"3-199a029a3e57f6b7db8a7ec4cb07f275","name":"com.simonmacdonald.imeiplugin","description":"This plugin allows your to get hold of the IMEI number from an android device. Written by Simon MacDonald, updated to Cordova 3 by Nico Maas","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.simonmacdonald.imeiplugin","cordova_name":"IMEINumber","description":"This plugin allows your to get hold of the IMEI number from an android device. Written by Simon MacDonald, updated to Cordova 3 by Nico Maas","license":"MIT","keywords":["android"," phone number"],"engines":[{"name":"cordova-android","version":">=3.0.0"}],"readme":"# TelephoneNumber plugin for Phonegap #\n\nThe telephone number plugin allows you to retreive the devices phone numberfrom your PhoneGap application.\n\n## Adding the Plugin to your project ##\n\nUsing this plugin requires [Android PhoneGap](https://github.com/apache/incubator-cordova-android).\n\n1. To install the plugin, copy the www/telephonenumber.js file to your project's www folder and include a reference to it in your html file after cordova.js.\n\n &lt;script type=\"text/javascript\" charset=\"utf-8\" src=\"cordova.js\"&gt;&lt;/script&gt;<br/>\n &lt;script type=\"text/javascript\" charset=\"utf-8\" src=\"telephonenumber.js\"&gt;&lt;/script&gt;\n \n2. Create a directory within your project called \"src/com/simonmacdonald/cordova/plugins\" and copy src/com/simonmacdonald/cordova/plugins/TelephoneNumber.java into it.\n\n3. In your res/xml/config.xml file add the following line:\n\n &lt;plugin name=\"TelephoneNumber\" value=\"com.simonmacdonald.cordova.plugins.TelephoneNumber\"/&gt;\n\n## Using the plugin ##\n\nYou create a new object that represents the plugin using cordova.require. Then you can call the 'get' method on that object providing a success callback which will be called with a result value that is the devices phone number.\n\n<pre>\n /**\n\t* get the devices phone number.\n */\n get(success, failure)\n</pre>\n\nSample use:\n\n var telephoneNumber = cordova.require(\"cordova/plugin/telephonenumber\");\n telephoneNumber.get(function(result) {\n console.log(\"result = \" + result);\n }, function() {\n console.log(\"error\");\n });\n \n\n## RELEASE NOTES ##\n\n### December 6, 2012 ###\n\n* Initial release\n\n\n## BUGS AND CONTRIBUTIONS ##\n\n\n## LICENSE ##\n\nThis plugin is available under the MIT License (2008). \nThe text of the MIT license is reproduced below. \n\n---\n\n### The MIT License\n\nCopyright (c) <2012> <Simon MacDonald., et. al., >\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n ","readmeFilename":"README.md","_id":"com.simonmacdonald.imeiplugin@1.0.0","dist":{"shasum":"0cad23bb1da43f21eba336230b239a600a6f6498","tarball":"http://registry.cordova.io/com.simonmacdonald.imeiplugin/-/com.simonmacdonald.imeiplugin-1.0.0.tgz"},"_from":"Z:\\Projekte\\Nekohi\\IMEIPlugin","_npmVersion":"1.3.4","_npmUser":{"name":"nmaas87","email":"mail@nico-maas.de"},"maintainers":[{"name":"nmaas87","email":"mail@nico-maas.de"}]}},"readme":"# TelephoneNumber plugin for Phonegap #\n\nThe telephone number plugin allows you to retreive the devices phone numberfrom your PhoneGap application.\n\n## Adding the Plugin to your project ##\n\nUsing this plugin requires [Android PhoneGap](https://github.com/apache/incubator-cordova-android).\n\n1. To install the plugin, copy the www/telephonenumber.js file to your project's www folder and include a reference to it in your html file after cordova.js.\n\n &lt;script type=\"text/javascript\" charset=\"utf-8\" src=\"cordova.js\"&gt;&lt;/script&gt;<br/>\n &lt;script type=\"text/javascript\" charset=\"utf-8\" src=\"telephonenumber.js\"&gt;&lt;/script&gt;\n \n2. Create a directory within your project called \"src/com/simonmacdonald/cordova/plugins\" and copy src/com/simonmacdonald/cordova/plugins/TelephoneNumber.java into it.\n\n3. In your res/xml/config.xml file add the following line:\n\n &lt;plugin name=\"TelephoneNumber\" value=\"com.simonmacdonald.cordova.plugins.TelephoneNumber\"/&gt;\n\n## Using the plugin ##\n\nYou create a new object that represents the plugin using cordova.require. Then you can call the 'get' method on that object providing a success callback which will be called with a result value that is the devices phone number.\n\n<pre>\n /**\n\t* get the devices phone number.\n */\n get(success, failure)\n</pre>\n\nSample use:\n\n var telephoneNumber = cordova.require(\"cordova/plugin/telephonenumber\");\n telephoneNumber.get(function(result) {\n console.log(\"result = \" + result);\n }, function() {\n console.log(\"error\");\n });\n \n\n## RELEASE NOTES ##\n\n### December 6, 2012 ###\n\n* Initial release\n\n\n## BUGS AND CONTRIBUTIONS ##\n\n\n## LICENSE ##\n\nThis plugin is available under the MIT License (2008). \nThe text of the MIT license is reproduced below. \n\n---\n\n### The MIT License\n\nCopyright (c) <2012> <Simon MacDonald., et. al., >\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n ","maintainers":[{"name":"nmaas87","email":"mail@nico-maas.de"}],"time":{"modified":"2013-11-08T22:02:51.021Z","created":"2013-11-08T22:02:49.917Z","1.0.0":"2013-11-08T22:02:51.021Z"},"_attachments":{"com.simonmacdonald.imeiplugin-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-B2NZ9m9U3OAV0GuS6d+/vA==","length":2887,"stub":true}}}},
{"id":"com.simonmacdonald.telephonenumber","key":"com.simonmacdonald.telephonenumber","value":{"rev":"3-057872c141d288fcda00c0c4801acc26"},"doc":{"_id":"com.simonmacdonald.telephonenumber","_rev":"3-057872c141d288fcda00c0c4801acc26","name":"com.simonmacdonald.telephonenumber","description":"This plugin allows your to get hold of the telephone number from an android device","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"com.simonmacdonald.telephonenumber","cordova_name":"TelephoneNumber","description":"This plugin allows your to get hold of the telephone number from an android device","license":"MIT","keywords":["android"," phone number"],"engines":[{"name":"cordova-android","version":">=3.0.0"}],"readme":"# TelephoneNumber plugin for Phonegap #\n\nThe telephone number plugin allows you to retreive the devices phone numberfrom your PhoneGap application.\n\n## Adding the Plugin to your project ##\n\nUsing this plugin requires [Android PhoneGap](https://github.com/apache/incubator-cordova-android).\n\n1. To install the plugin, copy the www/telephonenumber.js file to your project's www folder and include a reference to it in your html file after cordova.js.\n\n &lt;script type=\"text/javascript\" charset=\"utf-8\" src=\"cordova.js\"&gt;&lt;/script&gt;<br/>\n &lt;script type=\"text/javascript\" charset=\"utf-8\" src=\"telephonenumber.js\"&gt;&lt;/script&gt;\n \n2. Create a directory within your project called \"src/com/simonmacdonald/cordova/plugins\" and copy src/com/simonmacdonald/cordova/plugins/TelephoneNumber.java into it.\n\n3. In your res/xml/config.xml file add the following line:\n\n &lt;plugin name=\"TelephoneNumber\" value=\"com.simonmacdonald.cordova.plugins.TelephoneNumber\"/&gt;\n\n## Using the plugin ##\n\nYou create a new object that represents the plugin using cordova.require. Then you can call the 'get' method on that object providing a success callback which will be called with a result value that is the devices phone number.\n\n<pre>\n /**\n\t* get the devices phone number.\n */\n get(success, failure)\n</pre>\n\nSample use:\n\n var telephoneNumber = cordova.require(\"cordova/plugin/telephonenumber\");\n telephoneNumber.get(function(result) {\n console.log(\"result = \" + result);\n }, function() {\n console.log(\"error\");\n });\n \n\n## RELEASE NOTES ##\n\n### December 6, 2012 ###\n\n* Initial release\n\n\n## BUGS AND CONTRIBUTIONS ##\n\n\n## LICENSE ##\n\nThis plugin is available under the MIT License (2008). \nThe text of the MIT license is reproduced below. \n\n---\n\n### The MIT License\n\nCopyright (c) <2012> <Simon MacDonald., et. al., >\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n ","readmeFilename":"README.md","_id":"com.simonmacdonald.telephonenumber@1.0.0","dist":{"shasum":"6c31e23eed5306538f714417003416b140285177","tarball":"http://registry.cordova.io/com.simonmacdonald.telephonenumber/-/com.simonmacdonald.telephonenumber-1.0.0.tgz"},"_from":"TelephoneNumberPlugin","_npmVersion":"1.3.4","_npmUser":{"name":"macdonst","email":"simon.macdonald@gmail.com"},"maintainers":[{"name":"macdonst","email":"simon.macdonald@gmail.com"}]}},"readme":"# TelephoneNumber plugin for Phonegap #\n\nThe telephone number plugin allows you to retreive the devices phone numberfrom your PhoneGap application.\n\n## Adding the Plugin to your project ##\n\nUsing this plugin requires [Android PhoneGap](https://github.com/apache/incubator-cordova-android).\n\n1. To install the plugin, copy the www/telephonenumber.js file to your project's www folder and include a reference to it in your html file after cordova.js.\n\n &lt;script type=\"text/javascript\" charset=\"utf-8\" src=\"cordova.js\"&gt;&lt;/script&gt;<br/>\n &lt;script type=\"text/javascript\" charset=\"utf-8\" src=\"telephonenumber.js\"&gt;&lt;/script&gt;\n \n2. Create a directory within your project called \"src/com/simonmacdonald/cordova/plugins\" and copy src/com/simonmacdonald/cordova/plugins/TelephoneNumber.java into it.\n\n3. In your res/xml/config.xml file add the following line:\n\n &lt;plugin name=\"TelephoneNumber\" value=\"com.simonmacdonald.cordova.plugins.TelephoneNumber\"/&gt;\n\n## Using the plugin ##\n\nYou create a new object that represents the plugin using cordova.require. Then you can call the 'get' method on that object providing a success callback which will be called with a result value that is the devices phone number.\n\n<pre>\n /**\n\t* get the devices phone number.\n */\n get(success, failure)\n</pre>\n\nSample use:\n\n var telephoneNumber = cordova.require(\"cordova/plugin/telephonenumber\");\n telephoneNumber.get(function(result) {\n console.log(\"result = \" + result);\n }, function() {\n console.log(\"error\");\n });\n \n\n## RELEASE NOTES ##\n\n### December 6, 2012 ###\n\n* Initial release\n\n\n## BUGS AND CONTRIBUTIONS ##\n\n\n## LICENSE ##\n\nThis plugin is available under the MIT License (2008). \nThe text of the MIT license is reproduced below. \n\n---\n\n### The MIT License\n\nCopyright (c) <2012> <Simon MacDonald., et. al., >\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n ","maintainers":[{"name":"macdonst","email":"simon.macdonald@gmail.com"}],"time":{"modified":"2013-10-21T16:59:54.465Z","created":"2013-10-21T16:59:54.042Z","1.0.0":"2013-10-21T16:59:54.465Z"},"_attachments":{"com.simonmacdonald.telephonenumber-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-2obSRfiPYjE6PkkQRndWOw==","length":2829,"stub":true}}}},
{"id":"com.smartmobilesoftware.inappbilling","key":"com.smartmobilesoftware.inappbilling","value":{"rev":"3-4aefb9de7c900fcf95f62103fd59947e"},"doc":{"_id":"com.smartmobilesoftware.inappbilling","_rev":"3-4aefb9de7c900fcf95f62103fd59947e","name":"com.smartmobilesoftware.inappbilling","description":"Use this In-app Billing plugin to sell digital goods, including one-time items and recurring subscriptions from your Cordova application. Main repo with full documentation located at: https://github.com/poiuytrez/AndroidInAppBilling","dist-tags":{"latest":"3.0.0"},"versions":{"3.0.0":{"version":"3.0.0","name":"com.smartmobilesoftware.inappbilling","cordova_name":"Android InAppBilling","description":"Use this In-app Billing plugin to sell digital goods, including one-time items and recurring subscriptions from your Cordova application. Main repo with full documentation located at: https://github.com/poiuytrez/AndroidInAppBilling","engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"In app billing documentation\n===================================\nRequirements\n-------------\nCordova 3.0, Android 2.2.1 and Android 4.2.2\n\n* Purchasing and querying managed in-app items: \nGoogle Play client version 3.9.16 \n* Purchasing and querying subscription items: \nGoogle Play client version 3.10.10 or higher\n\n* Plugman & Phonegap/Cordova 3 plugin compatible\n\nInstallation\n-------------\n\n* Get acquainted with the Android [In-app Billing documentation](http://developer.android.com/google/play/billing/index.html).\n\n### PhoneGap/Cordova >= 3.0\nFor PhoneGap/Cordova >= 3.0 this plugin can be installed with a single command:\n\n cordova plugin add <location of v3.zip>\n \n### Manually\n* Add in your `src` folder the `src/android/com` folder \nIt contains:\n * [Google Play In-app Billing library]( http://developer.android.com/guide/google/play/billing/billing_overview.html)\n\t* Cordova InAppBillingPlugin\n* Create a `plugins` folder in your project's `www` folder if it does not exist.\n* Create a `com.smartmobilesoftware.inappbilling` folder inside the `plugins` folder.\n* Copy `www/inappbilling.js` into `<path to project>/www/plugins/com.smartmobilesoftware.inappbilling/www`\n* In res/xml/config.xml, add \n\n```xml \n<feature name=\"InAppBillingPlugin\"> \n <param name=\"android-package\" value=\"com.smartmobilesoftware.inappbilling.InAppBillingPlugin\"/> \n</feature> \n```\n* Open the AndroidManifest.xml of your application\n\t* add this permission \n`<uses-permission android:name=\"com.android.vending.BILLING\" />`\n* Create a new file named `cordova_plugins.js` in the `<path to project>/www` folder if it does not exist.\n* Edit `cordova_plugins.js` and add a reference to the plugin to automatically load it:\n\n```javascript\n cordova.define('cordova/plugin_list', function(require, exports, module) {\n module.exports = [\n {\n \"file\": \"plugins/com.smartmobilesoftware.inappbilling/www/inappbilling.js\",\n \"id\": \"com.smartmobilesoftware.inappbilling.InAppBillingPlugin\",\n \"clobbers\": [\n \"inappbilling\"\n\t ]\n \t}\n ]\n });\n```\n\n### Finish setting up your app\n* Create a release apk of your app and sign it. \n* Create a new application in the Developer Console. \n* Upload your apk \n* Enter the app description, logo, etc. then click on save\n* Add in-app purchases items from the Developer Console (activate them but do not publish the app)\n* Click on Services and APIs to get your public license key\n* In src/android/com/smartmobilesoftware/inappbilling open InAppBillingPlugin.java\n\t* Add your public key (base64EncodedPublicKey)\n* Wait 6-8 hours\n* Install the signed app on your test device in release mode. The Google Account on the test device should not be the same as the developer account).\n* Read carefully the Google testing guide to learn how to test your app : http://developer.android.com/guide/google/play/billing/billing_testing.html\n\nUsage\n-------\n#### Initialization\nInitialize the billing plugin. The plugin must be inialized before calling any other methods. \n\n inappbilling.init(success, error, options)\nparameters\n* success : The success callback.\n* error : The error callback.\n* options : Sets the options for the plugin\n\t* Available Options :\n\t\t* showLog [true,false] : showLog enables plugin JS debug messages. Default : true\n\n#### Optional Initialization\n\n inappbilling.init(success, error, options, skus)\nparameters\n* success : The success callback.\n* error : The error callback.\n* options : Sets the options for the plugin\n\t* Available Options :\n\t\t* showLog [true,false] : showLog enables plugin JS debug messages. Default : true\n* skus : string or string[] of product skus. ie. \"prod1\" or [\"prod1\",\"prod2]\n\n#### Retrieve owned products\nThe list of owned products are retrieved from the local database.\n\n\tinappbilling.getPurchases(success, fail)\nparameters\n* success : The success callback. It provides an array of json object representing the owned products as a parameter. Example: \n\n [{\"purchaseToken\":\"tokenabc\",\"developerPayload\":\"mypayload1\",\n \"packageName\":\"com.example.MyPackage\",\"purchaseState\":0,\"orderId\":\"12345.6789\",\n \"purchaseTime\":1382517909216,\"productId\":\"example_subscription\"},\n {\"purchaseToken\":\"tokenxyz\",\"developerPayload\":\"mypayload2\",\n \"packageName\":\"com.example.MyPacakge\",\"purchaseState\":0,\"orderId\":\"98765.4321\",\n \"purchaseTime\":1382435077000,\"productId\":\"example_product\"}]\n\n* error : The error callback.\n\n#### Purchase\nPurchase an item. You cannot buy an item that you already own.\n\n inappbilling.buy(success, fail, productId)\nparameters\n* success : The success callback. It provides the productId of the purchased item as a parameter. Example :\nsword_001\n* error : The error callback.\n* productId : The in app billing porduct id (example \"sword_001\")\n\n#### Subscribe\nSubscribe to an item\n\n\tinappbilling.subscribe(success, fail, subcriptionId)\nparameters\n* success : The success callback.\n* error : The error callback.\n* productId : The in app billing porduct id (example \"premium_001\")\n\n#### Consume\nConsume an item. You can consume an item that you own. Example of consumable items : food, additional life pack, etc. Example of non-consumable item: levels pack. Once an item is consumed, it is not owned anymore.\n\n inappbilling.consumePurchase(success, fail, productId)\nparameters\n* success : The success callback. It provides a json object with the transaction details. Example : \n{\n\t\"orderId\":\"12999763169054705758.1321583410745163\",\n\t\"packageName\":\"com.smartmobilesoftware.trivialdrivecordova\",\n\t\"productId\":\"gas\",\n\t\"purchaseTime\":1369402680000,\n\t\"purchaseState\":0,\n\t\"purchaseToken\":\"ccroltzduesqaxtuuopnqcsc.AO-J1Oyao-HWamJo_6a4OQSlhflhOjQgYWbb-99VF2gcj_CB1dd1Sfp5d-olgouTWJ13Q6vc5zbl0SFfpofmpyuyeEmJ\"\n}\n\n* error : The error callback.\n* productId : The in app billing porduct id (example \"5_lifes\")\n\n#### Get Product(s) Details\nLoad the available product(s) to inventory. Not needed if you use the init(success, error, options, skus) method. Can be used to update inventory if you need to add more skus.\n\n\t\tinappbilling.getProductDetails(success, fail, skus)\n* success : The success callback.\n* error : The error callback.\n* skus : string or string[] of product skus. ie. \"prod1\" or [\"prod1\",\"prod2]\n\n#### Get Available Product(s)\nThe list of the available product(s) in inventory.\n\n\t\tinappbilling.getAvailableProducts(success, fail) \n* success : The success callback. It provides a json array of the list of owned products as a parameter. Example : \n{index:\n{\n\t\"title\":\"Infinite Gas\",\n\t\"price\":\"2.99\",\n\t\"type\":\"subs\",\n\t\"description\":\"Lots of Infinite Gas\",\n\t\"productId\":\"infinite_gas\",\n\t\"price_currency_code\":\"USD\"\n}}\n\n* error : The error callback.\n\n\nQuick example\n---------------\n```javascript\ninappbilling.init(successInit,errorCallback, {showLog:true})\n\nfunction successInit(result) { \n\t// display the extracted text \n\talert(result); \n\t// make the purchase\n\tinappbilling.buy(successPurchase, errorCallback,\"gas\");\n\t\n} \nfunction errorCallback(error) {\n alert(error); \n} \n\nfunction successPurchase(productId) {\n alert(\"Your item has been purchased!\");\n} \n```\n\nFull example\n----------------\n```html\n<!DOCTYPE HTML>\n<html>\n\t<head>\n\t\t<title>In App Billing</title>\n\t\t<script type=\"text/javascript\" charset=\"utf-8\" src=\"cordova-2.7.0.js\"></script>\n\t\t<script type=\"text/javascript\" charset=\"utf-8\" src=\"inappbilling.js\"></script>\n\t\t<script type=\"text/javascript\" charset=\"utf-8\">\n\t\t\tfunction successHandler (result) {\n var strResult = \"\";\n if(typeof result === 'object') {\n strResult = JSON.stringify(result);\n } else {\n strResult = result;\n }\n alert(\"SUCCESS: \\r\\n\"+strResult );\n }\n\t\t\t\n\t\t\tfunction errorHandler (error) {\n\t\t\t alert(\"ERROR: \\r\\n\"+error );\n\t\t\t}\n\n // Click on init button\n\t\t\tfunction init(){\n\t\t\t\t// Initialize the billing plugin\n\t\t\t\tinappbilling.init(successHandler, errorHandler, {showLog:true});\n\t\t\t}\n\n\t\t\t// Click on purchase button\n\t\t\tfunction buy(){\n\t\t\t\t// make the purchase\n\t\t\t\tinappbilling.buy(successHandler, errorHandler,\"gas\");\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// Click on ownedProducts button\n\t\t\tfunction ownedProducts(){\n\t\t\t\t// Initialize the billing plugin\n\t\t\t\tinappbilling.getPurchases(successHandler, errorHandler);\n\t\t\t\t\n\t\t\t}\n\n // Click on Consume purchase button\n function consumePurchase(){\n\n inappbilling.consumePurchase(successHandler, errorHandler, \"gas\");\n }\n\n // Click on subscribe button\n function subscribe(){\n // make the purchase\n inappbilling.subscribe(successHandler, errorHandler,\"infinite_gas\");\n\n }\n \n\t\t\t// Click on Query Details button\n\t\t\tfunction getDetails(){\n\t\t\t\t// Query the store for the product details\n\t\t\t\tinappbilling.getProductDetails(successHandler, errorHandler, [\"gas\",\"infinite_gas\"]);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// Click on Get Available Products button\n\t\t\tfunction getAvailable(){\n\t\t\t\t// Get the products available for purchase.\n\t\t\t\tinappbilling.getAvailableProducts(successHandler, errorHandler);\n\t\t\t\t\n\t\t\t}\t\t\t\t\t\t\n\t\t\t\n </script>\n\t\t\n\t</head>\n\t<body>\n\t\t<h1>Hello World</h1>\n\t\t<button onclick=\"init();\">Initalize the billing plugin</button>\n\t\t<button onclick=\"buy();\">Purchase</button>\n <button onclick=\"ownedProducts();\">Owned products</button>\n <button onclick=\"consumePurchase();\">Consume purchase</button>\n <button onclick=\"subscribe();\">Subscribe</button>\n <button onclick=\"getDetails();\">Query Details</button>\n <button onclick=\"getAvailable();\">Get Available Products</button>\n </body>\n</html>\n```\n\nCommon issues\n----------------\nIf you have an issue, make sure that you can answer to theses questions: \nDid you create your item in the Developer Console? \nIs the id for your item the same in the Developer Console and in your app? \nIs your item active? \nHave you waited at least a few hours since you activated your item and uploaded your apk on the Developer Console? \nAre you using a different Google account than your developer account to make the purchase? \nAre you testing on a real device, rather than the emulator? \nAre you using a signed apk? \nIs the version code of your app the same as the one uploaded on the Developer Console? \n \nIf any of these questions is answered with a \"no\", you probably need to fix that. \n\n\nMIT License\n----------------\n\nCopyright (c) 2012-2013 Guillaume Charhon - Smart Mobile Software\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n","readmeFilename":"README.md","_id":"com.smartmobilesoftware.inappbilling@3.0.0","dist":{"shasum":"75187a5c15b08709e684026bb3166f5fa49e52e1","tarball":"http://registry.cordova.io/com.smartmobilesoftware.inappbilling/-/com.smartmobilesoftware.inappbilling-3.0.0.tgz"},"_from":"v3/","_npmVersion":"1.3.4","_npmUser":{"name":"poiuytrez","email":"gcharhon@smartmobilesoftware.com"},"maintainers":[{"name":"poiuytrez","email":"gcharhon@smartmobilesoftware.com"}]}},"readme":"In app billing documentation\n===================================\nRequirements\n-------------\nCordova 3.0, Android 2.2.1 and Android 4.2.2\n\n* Purchasing and querying managed in-app items: \nGoogle Play client version 3.9.16 \n* Purchasing and querying subscription items: \nGoogle Play client version 3.10.10 or higher\n\n* Plugman & Phonegap/Cordova 3 plugin compatible\n\nInstallation\n-------------\n\n* Get acquainted with the Android [In-app Billing documentation](http://developer.android.com/google/play/billing/index.html).\n\n### PhoneGap/Cordova >= 3.0\nFor PhoneGap/Cordova >= 3.0 this plugin can be installed with a single command:\n\n cordova plugin add <location of v3.zip>\n \n### Manually\n* Add in your `src` folder the `src/android/com` folder \nIt contains:\n * [Google Play In-app Billing library]( http://developer.android.com/guide/google/play/billing/billing_overview.html)\n\t* Cordova InAppBillingPlugin\n* Create a `plugins` folder in your project's `www` folder if it does not exist.\n* Create a `com.smartmobilesoftware.inappbilling` folder inside the `plugins` folder.\n* Copy `www/inappbilling.js` into `<path to project>/www/plugins/com.smartmobilesoftware.inappbilling/www`\n* In res/xml/config.xml, add \n\n```xml \n<feature name=\"InAppBillingPlugin\"> \n <param name=\"android-package\" value=\"com.smartmobilesoftware.inappbilling.InAppBillingPlugin\"/> \n</feature> \n```\n* Open the AndroidManifest.xml of your application\n\t* add this permission \n`<uses-permission android:name=\"com.android.vending.BILLING\" />`\n* Create a new file named `cordova_plugins.js` in the `<path to project>/www` folder if it does not exist.\n* Edit `cordova_plugins.js` and add a reference to the plugin to automatically load it:\n\n```javascript\n cordova.define('cordova/plugin_list', function(require, exports, module) {\n module.exports = [\n {\n \"file\": \"plugins/com.smartmobilesoftware.inappbilling/www/inappbilling.js\",\n \"id\": \"com.smartmobilesoftware.inappbilling.InAppBillingPlugin\",\n \"clobbers\": [\n \"inappbilling\"\n\t ]\n \t}\n ]\n });\n```\n\n### Finish setting up your app\n* Create a release apk of your app and sign it. \n* Create a new application in the Developer Console. \n* Upload your apk \n* Enter the app description, logo, etc. then click on save\n* Add in-app purchases items from the Developer Console (activate them but do not publish the app)\n* Click on Services and APIs to get your public license key\n* In src/android/com/smartmobilesoftware/inappbilling open InAppBillingPlugin.java\n\t* Add your public key (base64EncodedPublicKey)\n* Wait 6-8 hours\n* Install the signed app on your test device in release mode. The Google Account on the test device should not be the same as the developer account).\n* Read carefully the Google testing guide to learn how to test your app : http://developer.android.com/guide/google/play/billing/billing_testing.html\n\nUsage\n-------\n#### Initialization\nInitialize the billing plugin. The plugin must be inialized before calling any other methods. \n\n inappbilling.init(success, error, options)\nparameters\n* success : The success callback.\n* error : The error callback.\n* options : Sets the options for the plugin\n\t* Available Options :\n\t\t* showLog [true,false] : showLog enables plugin JS debug messages. Default : true\n\n#### Optional Initialization\n\n inappbilling.init(success, error, options, skus)\nparameters\n* success : The success callback.\n* error : The error callback.\n* options : Sets the options for the plugin\n\t* Available Options :\n\t\t* showLog [true,false] : showLog enables plugin JS debug messages. Default : true\n* skus : string or string[] of product skus. ie. \"prod1\" or [\"prod1\",\"prod2]\n\n#### Retrieve owned products\nThe list of owned products are retrieved from the local database.\n\n\tinappbilling.getPurchases(success, fail)\nparameters\n* success : The success callback. It provides an array of json object representing the owned products as a parameter. Example: \n\n [{\"purchaseToken\":\"tokenabc\",\"developerPayload\":\"mypayload1\",\n \"packageName\":\"com.example.MyPackage\",\"purchaseState\":0,\"orderId\":\"12345.6789\",\n \"purchaseTime\":1382517909216,\"productId\":\"example_subscription\"},\n {\"purchaseToken\":\"tokenxyz\",\"developerPayload\":\"mypayload2\",\n \"packageName\":\"com.example.MyPacakge\",\"purchaseState\":0,\"orderId\":\"98765.4321\",\n \"purchaseTime\":1382435077000,\"productId\":\"example_product\"}]\n\n* error : The error callback.\n\n#### Purchase\nPurchase an item. You cannot buy an item that you already own.\n\n inappbilling.buy(success, fail, productId)\nparameters\n* success : The success callback. It provides the productId of the purchased item as a parameter. Example :\nsword_001\n* error : The error callback.\n* productId : The in app billing porduct id (example \"sword_001\")\n\n#### Subscribe\nSubscribe to an item\n\n\tinappbilling.subscribe(success, fail, subcriptionId)\nparameters\n* success : The success callback.\n* error : The error callback.\n* productId : The in app billing porduct id (example \"premium_001\")\n\n#### Consume\nConsume an item. You can consume an item that you own. Example of consumable items : food, additional life pack, etc. Example of non-consumable item: levels pack. Once an item is consumed, it is not owned anymore.\n\n inappbilling.consumePurchase(success, fail, productId)\nparameters\n* success : The success callback. It provides a json object with the transaction details. Example : \n{\n\t\"orderId\":\"12999763169054705758.1321583410745163\",\n\t\"packageName\":\"com.smartmobilesoftware.trivialdrivecordova\",\n\t\"productId\":\"gas\",\n\t\"purchaseTime\":1369402680000,\n\t\"purchaseState\":0,\n\t\"purchaseToken\":\"ccroltzduesqaxtuuopnqcsc.AO-J1Oyao-HWamJo_6a4OQSlhflhOjQgYWbb-99VF2gcj_CB1dd1Sfp5d-olgouTWJ13Q6vc5zbl0SFfpofmpyuyeEmJ\"\n}\n\n* error : The error callback.\n* productId : The in app billing porduct id (example \"5_lifes\")\n\n#### Get Product(s) Details\nLoad the available product(s) to inventory. Not needed if you use the init(success, error, options, skus) method. Can be used to update inventory if you need to add more skus.\n\n\t\tinappbilling.getProductDetails(success, fail, skus)\n* success : The success callback.\n* error : The error callback.\n* skus : string or string[] of product skus. ie. \"prod1\" or [\"prod1\",\"prod2]\n\n#### Get Available Product(s)\nThe list of the available product(s) in inventory.\n\n\t\tinappbilling.getAvailableProducts(success, fail) \n* success : The success callback. It provides a json array of the list of owned products as a parameter. Example : \n{index:\n{\n\t\"title\":\"Infinite Gas\",\n\t\"price\":\"2.99\",\n\t\"type\":\"subs\",\n\t\"description\":\"Lots of Infinite Gas\",\n\t\"productId\":\"infinite_gas\",\n\t\"price_currency_code\":\"USD\"\n}}\n\n* error : The error callback.\n\n\nQuick example\n---------------\n```javascript\ninappbilling.init(successInit,errorCallback, {showLog:true})\n\nfunction successInit(result) { \n\t// display the extracted text \n\talert(result); \n\t// make the purchase\n\tinappbilling.buy(successPurchase, errorCallback,\"gas\");\n\t\n} \nfunction errorCallback(error) {\n alert(error); \n} \n\nfunction successPurchase(productId) {\n alert(\"Your item has been purchased!\");\n} \n```\n\nFull example\n----------------\n```html\n<!DOCTYPE HTML>\n<html>\n\t<head>\n\t\t<title>In App Billing</title>\n\t\t<script type=\"text/javascript\" charset=\"utf-8\" src=\"cordova-2.7.0.js\"></script>\n\t\t<script type=\"text/javascript\" charset=\"utf-8\" src=\"inappbilling.js\"></script>\n\t\t<script type=\"text/javascript\" charset=\"utf-8\">\n\t\t\tfunction successHandler (result) {\n var strResult = \"\";\n if(typeof result === 'object') {\n strResult = JSON.stringify(result);\n } else {\n strResult = result;\n }\n alert(\"SUCCESS: \\r\\n\"+strResult );\n }\n\t\t\t\n\t\t\tfunction errorHandler (error) {\n\t\t\t alert(\"ERROR: \\r\\n\"+error );\n\t\t\t}\n\n // Click on init button\n\t\t\tfunction init(){\n\t\t\t\t// Initialize the billing plugin\n\t\t\t\tinappbilling.init(successHandler, errorHandler, {showLog:true});\n\t\t\t}\n\n\t\t\t// Click on purchase button\n\t\t\tfunction buy(){\n\t\t\t\t// make the purchase\n\t\t\t\tinappbilling.buy(successHandler, errorHandler,\"gas\");\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// Click on ownedProducts button\n\t\t\tfunction ownedProducts(){\n\t\t\t\t// Initialize the billing plugin\n\t\t\t\tinappbilling.getPurchases(successHandler, errorHandler);\n\t\t\t\t\n\t\t\t}\n\n // Click on Consume purchase button\n function consumePurchase(){\n\n inappbilling.consumePurchase(successHandler, errorHandler, \"gas\");\n }\n\n // Click on subscribe button\n function subscribe(){\n // make the purchase\n inappbilling.subscribe(successHandler, errorHandler,\"infinite_gas\");\n\n }\n \n\t\t\t// Click on Query Details button\n\t\t\tfunction getDetails(){\n\t\t\t\t// Query the store for the product details\n\t\t\t\tinappbilling.getProductDetails(successHandler, errorHandler, [\"gas\",\"infinite_gas\"]);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t// Click on Get Available Products button\n\t\t\tfunction getAvailable(){\n\t\t\t\t// Get the products available for purchase.\n\t\t\t\tinappbilling.getAvailableProducts(successHandler, errorHandler);\n\t\t\t\t\n\t\t\t}\t\t\t\t\t\t\n\t\t\t\n </script>\n\t\t\n\t</head>\n\t<body>\n\t\t<h1>Hello World</h1>\n\t\t<button onclick=\"init();\">Initalize the billing plugin</button>\n\t\t<button onclick=\"buy();\">Purchase</button>\n <button onclick=\"ownedProducts();\">Owned products</button>\n <button onclick=\"consumePurchase();\">Consume purchase</button>\n <button onclick=\"subscribe();\">Subscribe</button>\n <button onclick=\"getDetails();\">Query Details</button>\n <button onclick=\"getAvailable();\">Get Available Products</button>\n </body>\n</html>\n```\n\nCommon issues\n----------------\nIf you have an issue, make sure that you can answer to theses questions: \nDid you create your item in the Developer Console? \nIs the id for your item the same in the Developer Console and in your app? \nIs your item active? \nHave you waited at least a few hours since you activated your item and uploaded your apk on the Developer Console? \nAre you using a different Google account than your developer account to make the purchase? \nAre you testing on a real device, rather than the emulator? \nAre you using a signed apk? \nIs the version code of your app the same as the one uploaded on the Developer Console? \n \nIf any of these questions is answered with a \"no\", you probably need to fix that. \n\n\nMIT License\n----------------\n\nCopyright (c) 2012-2013 Guillaume Charhon - Smart Mobile Software\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n","maintainers":[{"name":"poiuytrez","email":"gcharhon@smartmobilesoftware.com"}],"time":{"modified":"2013-12-17T12:58:25.025Z","created":"2013-12-17T12:58:23.637Z","3.0.0":"2013-12-17T12:58:25.025Z"},"_attachments":{"com.smartmobilesoftware.inappbilling-3.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-JKa+wBxf0vuuTpVCPmssGg==","length":29918,"stub":true}}}},
{"id":"com.testflightapp.cordova-plugin","key":"com.testflightapp.cordova-plugin","value":{"rev":"3-9fdc35b1f34d26cbc5021eeacb2b6716"},"doc":{"_id":"com.testflightapp.cordova-plugin","_rev":"3-9fdc35b1f34d26cbc5021eeacb2b6716","name":"com.testflightapp.cordova-plugin","description":"Cordova plugin for the TestFlight SDK 2.0","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"version":"2.0.0","name":"com.testflightapp.cordova-plugin","cordova_name":"TestFlight SDK Plugin","description":"Cordova plugin for the TestFlight SDK 2.0","license":"Apache 2.0 License","engines":[{"name":"cordova","version":">=2.9.0"}],"readme":"TestFlight Plugin for Apache Cordova\n=====================================\ncreated by Shazron Abdullah\n\n[Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0.html) except for the TestFlight 2.x SDK that is under **src/ios/TestFlight1.1**\n\n\nTo add this plugin just type:\n```cordova plugin add https://github.com/shazron/TestFlightPlugin.git```\n\t\t\t\nTo remove this plugin type:\n```cordova plugin remove com.testflightapp.cordova-plugin```\n\n\nThe plugin's JavaScript functions are called after creating the plugin object thus:\n \n var tf = new TestFlight();\n tf.takeOff(win, fail, \"some_team_token\");\n \nMake sure you create the object after the \"deviceready\" event has fired.\n \nSee the functions below (and the TestFlight SDK docs) for usage. Unfortunately all of TestFlight's SDK functions return void,\nand errors can only be gleaned from the run console, so check that for errors.\n\n // Get a reference to the plugin first\n var tf = new TestFlight();\n\n /*\n Add custom environment information\n If you want to track a user name from your application you can add it here\n \n @param successCallback function\n @param failureCallback function\n @param key string\n @param information string\n */\n tf.addCustomEnvironmentInformation(successCallback, failureCallback, 'key', 'information');\n\n /*\n Starts a TestFlight session\n \n @param successCallback function\n @param failureCallback function\n @param teamToken string\n */\n tf.takeOff(successCallback, failureCallback, 'teamToken');\n \n /*\n Sets custom options\n \n @param successCallback function\n @param failureCallback function\n @param options object i.e { reinstallCrashHandlers : true }\n */\n tf.setOptions(successCallback, failureCallback, options);\n \n /*\n Track when a user has passed a checkpoint after the flight has taken off. Eg. passed level 1, posted high score\n \n @param successCallback function\n @param failureCallback function\n @param checkpointName string\n */\n tf.passCheckpoint(successCallback, failureCallback, 'checkpointName');\n\n /*\n Send log message to testflight servers...\n \n @param successCallback function\n @param failureCallback function\n @param message string\n */\n tf.remoteLog(successCallback, failureCallback, 'message');\n \n /*\n Send log message to testflight servers... (async).\n Note that you might lose logs in a crash.\n \n @param successCallback function\n @param failureCallback function\n @param message string\n */\n tf.remoteLogAsync(successCallback, failureCallback, 'message');\n\n /*\n Submits custom feedback to the site. Sends the data in feedback to the site. \n This is to be used as the method to submit feedback from custom feedback forms.\n \n @param successCallback function\n @param failureCallback function\n @param feedback Your users feedback, method does nothing if feedback is nil\n */\n tf.submitFeedback(successCallback, failureCallback, 'feedback');\n \n /*\n Sets your own Device Identifier. \n \n If you do not provide the identifier you will still see all session data, with\n checkpoints and logs, but the data will be anonymized.\n \n @param successCallback function\n @param failureCallback function\n @param deviceIdentifer The current devices device identifier\n */\n tf.setDeviceIdentifier(successCallback, failureCallback, 'deviceIdentifier');\n\n /*\n Manually start a session.\n \n @param successCallback function\n @param failureCallback function\n */\n tf.manuallyStartSession(successCallback, failureCallback);\n\n /*\n Manually end a session.\n \n @param successCallback function\n @param failureCallback function\n */\n tf.manuallyEndSession(successCallback, failureCallback);\n","readmeFilename":"README.md","_id":"com.testflightapp.cordova-plugin@2.0.0","dist":{"shasum":"21211af028b6773732c1d4aeee9c76c6ed945b7d","tarball":"http://registry.cordova.io/com.testflightapp.cordova-plugin/-/com.testflightapp.cordova-plugin-2.0.0.tgz"},"_from":"TestFlightPlugin/","_npmVersion":"1.3.4","_npmUser":{"name":"shazron","email":"shazron@apache.org"},"maintainers":[{"name":"shazron","email":"shazron@apache.org"}]}},"readme":"TestFlight Plugin for Apache Cordova\n=====================================\ncreated by Shazron Abdullah\n\n[Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0.html) except for the TestFlight 2.x SDK that is under **src/ios/TestFlight1.1**\n\n\nTo add this plugin just type:\n```cordova plugin add https://github.com/shazron/TestFlightPlugin.git```\n\t\t\t\nTo remove this plugin type:\n```cordova plugin remove com.testflightapp.cordova-plugin```\n\n\nThe plugin's JavaScript functions are called after creating the plugin object thus:\n \n var tf = new TestFlight();\n tf.takeOff(win, fail, \"some_team_token\");\n \nMake sure you create the object after the \"deviceready\" event has fired.\n \nSee the functions below (and the TestFlight SDK docs) for usage. Unfortunately all of TestFlight's SDK functions return void,\nand errors can only be gleaned from the run console, so check that for errors.\n\n // Get a reference to the plugin first\n var tf = new TestFlight();\n\n /*\n Add custom environment information\n If you want to track a user name from your application you can add it here\n \n @param successCallback function\n @param failureCallback function\n @param key string\n @param information string\n */\n tf.addCustomEnvironmentInformation(successCallback, failureCallback, 'key', 'information');\n\n /*\n Starts a TestFlight session\n \n @param successCallback function\n @param failureCallback function\n @param teamToken string\n */\n tf.takeOff(successCallback, failureCallback, 'teamToken');\n \n /*\n Sets custom options\n \n @param successCallback function\n @param failureCallback function\n @param options object i.e { reinstallCrashHandlers : true }\n */\n tf.setOptions(successCallback, failureCallback, options);\n \n /*\n Track when a user has passed a checkpoint after the flight has taken off. Eg. passed level 1, posted high score\n \n @param successCallback function\n @param failureCallback function\n @param checkpointName string\n */\n tf.passCheckpoint(successCallback, failureCallback, 'checkpointName');\n\n /*\n Send log message to testflight servers...\n \n @param successCallback function\n @param failureCallback function\n @param message string\n */\n tf.remoteLog(successCallback, failureCallback, 'message');\n \n /*\n Send log message to testflight servers... (async).\n Note that you might lose logs in a crash.\n \n @param successCallback function\n @param failureCallback function\n @param message string\n */\n tf.remoteLogAsync(successCallback, failureCallback, 'message');\n\n /*\n Submits custom feedback to the site. Sends the data in feedback to the site. \n This is to be used as the method to submit feedback from custom feedback forms.\n \n @param successCallback function\n @param failureCallback function\n @param feedback Your users feedback, method does nothing if feedback is nil\n */\n tf.submitFeedback(successCallback, failureCallback, 'feedback');\n \n /*\n Sets your own Device Identifier. \n \n If you do not provide the identifier you will still see all session data, with\n checkpoints and logs, but the data will be anonymized.\n \n @param successCallback function\n @param failureCallback function\n @param deviceIdentifer The current devices device identifier\n */\n tf.setDeviceIdentifier(successCallback, failureCallback, 'deviceIdentifier');\n\n /*\n Manually start a session.\n \n @param successCallback function\n @param failureCallback function\n */\n tf.manuallyStartSession(successCallback, failureCallback);\n\n /*\n Manually end a session.\n \n @param successCallback function\n @param failureCallback function\n */\n tf.manuallyEndSession(successCallback, failureCallback);\n","maintainers":[{"name":"shazron","email":"shazron@apache.org"}],"time":{"modified":"2013-10-08T21:35:37.389Z","created":"2013-10-08T21:35:35.296Z","2.0.0":"2013-10-08T21:35:37.389Z"},"_attachments":{"com.testflightapp.cordova-plugin-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-5DVgHksnNCSrUzmYwH+fOQ==","length":481524,"stub":true}}}},
{"id":"com.verso.cordova.clipboard","key":"com.verso.cordova.clipboard","value":{"rev":"3-ac66ac92546f55cd6c492829e2b18375"},"doc":{"_id":"com.verso.cordova.clipboard","_rev":"3-ac66ac92546f55cd6c492829e2b18375","name":"com.verso.cordova.clipboard","description":"Clipboard management plugin for Cordova/PhoneGap","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"version":"0.1.0","name":"com.verso.cordova.clipboard","cordova_name":"Clipboard","description":"Clipboard management plugin for Cordova/PhoneGap","license":"MIT","keywords":["clipboard","copy","paste"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Clipboard\n=========\n\nClipboard management plugin for Cordova/PhoneGap that supports iOS, Android, and Windows Phone 8.\n\n## Usage\n\nInstall the plugin using the CLI, for instance with PhoneGap:\n\n\tphonegap local plugin add https://github.com/VersoSolutions/CordovaClipboard\n\nThe plugin creates the object `cordova.plugins.clipboard` with the methods `copy(text, onSuccess, onError)` and `paste(onSuccess, onError)`.\n\nExample:\n\n\tvar text = \"Hello World!\";\n\n\tcordova.plugins.clipboard.copy(text);\n\n\tcordova.plugins.clipboard.paste(function (text) { alert(text); });\n\n## Notes\n\n### All platforms\n\n- The plugin only works with text content.\n\n### Windows Phone\n\n- The Windows Phone platform doesn't allow applications to read the content of the clipboard. Using the `paste` method will return an error.\n\n### Android\n\n- The minimum supported API Level is 11. Make sure that `minSdkVersion` is larger or equal to 11 in `AndroidManifest.xml`.\n\n## Acknowledgements\n\nThis plugin was inspired by [ClipboardManagerPlugin](https://github.com/jacob/ClipboardManagerPlugin) (Android) and [ClipboardPlugin](https://github.com/phonegap/phonegap-plugins/tree/master/iPhone/ClipboardPlugin) (iOS).\n\n## License\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Verso Solutions LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies 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,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","readmeFilename":"README.md","_id":"com.verso.cordova.clipboard@0.1.0","dist":{"shasum":"be7c38548ea26844db8e967e79771d2fc46b3e22","tarball":"http://registry.cordova.io/com.verso.cordova.clipboard/-/com.verso.cordova.clipboard-0.1.0.tgz"},"_from":"CordovaClipboard","_npmVersion":"1.3.4","_npmUser":{"name":"ctrevisan","email":"ctrevisan@versocards.com"},"maintainers":[{"name":"ctrevisan","email":"ctrevisan@versocards.com"}]}},"readme":"Clipboard\n=========\n\nClipboard management plugin for Cordova/PhoneGap that supports iOS, Android, and Windows Phone 8.\n\n## Usage\n\nInstall the plugin using the CLI, for instance with PhoneGap:\n\n\tphonegap local plugin add https://github.com/VersoSolutions/CordovaClipboard\n\nThe plugin creates the object `cordova.plugins.clipboard` with the methods `copy(text, onSuccess, onError)` and `paste(onSuccess, onError)`.\n\nExample:\n\n\tvar text = \"Hello World!\";\n\n\tcordova.plugins.clipboard.copy(text);\n\n\tcordova.plugins.clipboard.paste(function (text) { alert(text); });\n\n## Notes\n\n### All platforms\n\n- The plugin only works with text content.\n\n### Windows Phone\n\n- The Windows Phone platform doesn't allow applications to read the content of the clipboard. Using the `paste` method will return an error.\n\n### Android\n\n- The minimum supported API Level is 11. Make sure that `minSdkVersion` is larger or equal to 11 in `AndroidManifest.xml`.\n\n## Acknowledgements\n\nThis plugin was inspired by [ClipboardManagerPlugin](https://github.com/jacob/ClipboardManagerPlugin) (Android) and [ClipboardPlugin](https://github.com/phonegap/phonegap-plugins/tree/master/iPhone/ClipboardPlugin) (iOS).\n\n## License\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Verso Solutions LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies 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,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n","maintainers":[{"name":"ctrevisan","email":"ctrevisan@versocards.com"}],"time":{"modified":"2013-12-15T10:06:17.269Z","created":"2013-12-15T10:06:16.232Z","0.1.0":"2013-12-15T10:06:17.269Z"},"_attachments":{"com.verso.cordova.clipboard-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-7vLWFTHScDGBRflNFWKCJQ==","length":3748,"stub":true}}}},
{"id":"com.wonkystar.phonegap.infantium","key":"com.wonkystar.phonegap.infantium","value":{"rev":"5-ceee543ec0b989fdd55cc3575f3cf59e"},"doc":{"_id":"com.wonkystar.phonegap.infantium","_rev":"5-ceee543ec0b989fdd55cc3575f3cf59e","name":"com.wonkystar.phonegap.infantium","description":"Infantium SDK Plugin for Phonegap","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"version":"0.1.0","name":"com.wonkystar.phonegap.infantium","cordova_name":"Infantium","description":"Infantium SDK Plugin for Phonegap","license":"MIT","keywords":["cordova","infantium","phonegap"],"engines":[],"readme":"infantium-phonegap\n==================\n\n## Phonegap Plugin for the Infantium SDK\n\n# Warning\n\nThis only concerns the Android version of the SDK and therefore will only work on Android versions of your Phonegap apps. \nAlso, this is the debug version of the Infantium SDK that you should use for development. You will need to switch to the production version later by just replacing the jar file in the libs folder of the Android project.\n\n# How to\n\nFirst you need to install the plugin:\n\n`cordova plugins add com.wonkystar.phonegap.infantium` to get the latest published version. \n\n`cordova plugins add https://github.com/WonkyStar/infantium-phonegap.git` if you want the latest version on Github.\n\n\nThis will add all the necessary libs to your Android app (Infantium SDK etc.). It will also add Infantium's required permissions and receiver to your Android Manifest.\n\nNow your will have access to Infantium's SDK in `window.plugins.infantium`. \nYou will find the functions' signatures in `www/infantium.js`.\n\nBesides `setup` (which requires your Infantium credentials and allows to set your device resolution if you _really_ want to), `setContentAppUUID` (which requires your Content App UUID) and `createGameplay` (which requires a Subcontent UUID) functions, all other functions require an object or an array of objects if they need arguments. Each function also accepts a single Node-style callback (with `(err, res)` as arguments). The plugin handles Phonegap's callbacks behind the scenes for a cleaner interface. \nAll the object field names are the same as the ones provided in Infantium's methods/constructors signature. You can also have a look in the converter methods of `src/android/Infantium.java`.\n\nThe plugin also has a `generateUUID` utility function which generates a UUID using Java. This is particularly useful for Infantium's `Element` which require a unique id. However, the functions `addElement` and `addElements` will be able to generate one on the fly for you and return it (or a list of id for `addElements`) if no id has been set and if the call is successful.\n\nInfantium also requires that you call a function when the app is paused and when it's resumed. To hook them into Phonegap, you can use [event listeners](http://docs.phonegap.com/en/3.1.0/cordova_events_events.md.html#pause).\n\n# Example\n\n```js\n\t// This needs to happen after 'deviceready'\n\t\n\tdocument.addEventListener(\"resume\", function() {\n\t\twindow.plugins.infantium.onResumeInfantium();\n\t}, false);\n\n\tdocument.addEventListener(\"pause\", function() {\n\t\twindow.plugins.infantium.onPauseInfantium();\n\t}, false);\n\n\twindow.plugins.infantium.setup(\"INFANTIUM API USER\", \"API USER KEY\", function() {\n\t \n\t window.plugins.infantium.setContentAppUUID(\"CONTENT UUID\", function() {\n\t \n\t window.plugins.infantium.getPlayerUUIDFromApp(function() {\n\n window.plugins.infantium.createGameplay(\"SUBCONTENT UUID\", function() {\n\n window.plugins.infantium.startPlaying(function() {\n window.plugins.infantium.addElement({\n color: \"0,0,0\",\n alpha: 1.0,\n type: 'Static_object',\n visual_type: 'Draw_object',\n visibility: 1.0,\n category: 'Polygon',\n subcategory: 'Freeshape',\n size: [10, 10],\n pos: [10, 10],\n extra_fields: [\n \t{\n \t\tname: 'something',\n type: 'string',\n value: 'something'\n \t},\n {\n \tname: 'thing',\n type: 'dict',\n value: '',\n fields: [\n \t{\n\t \tname: 'start',\n\t type: 'int',\n\t value: 5\n\t \t},\n {\n \tname: 'end',\n type: 'int',\n value: 15\n }\n \t]\n \t}\n ]\n }, function (err, id) {\n window.plugins.infantium.tapOnObjects({element_id: id, output: 'success'});\n });\n\n window.plugins.infantium.setSuccesses(1)\n \n window.plugins.infantium.addDynamicField({\n name: 'language',\n type: 'string',\n value: 'en-GB'\n });\n\n window.plugins.infantium.sendGameRawData(function() {\n window.plugins.infantium.closeGameplay();\n });\n });\n });\n\t });\n\t });\n\t});\n```\n\n# Troubleshooting\n\nIf you're having trouble with the `resume` or `pause` event not firing you can also inject code directly in your main activity by overriding `onResume` and `onPause` like so:\n\n```java\n\n@Override\nprotected void onPause() {\n super.onPause();\n \n Infantium_SDK infantium = Infantium_SDK.getInfantium_SDK(this);\n infantium.onPauseInfantium();\n}\n\n@Override\nprotected void onResume() {\n super.onResume();\n \n Infantium_SDK infantium = Infantium_SDK.getInfantium_SDK(this);\n infantium.onResumeInfantium();\n}\n```\n\nYou will also have to import the infantium SDK lib to do this by adding this with the other packages: `import com.infantium.android.sdk.Infantium_SDK`\n\n# Changelog\n\n- 0.1.0 - Implements all the methods in the walkthrough","readmeFilename":"README.md","_id":"com.wonkystar.phonegap.infantium@0.1.0","dist":{"shasum":"fc076481f8741a2bf19ed4523e5c91abec447441","tarball":"http://registry.cordova.io/com.wonkystar.phonegap.infantium/-/com.wonkystar.phonegap.infantium-0.1.0.tgz"},"_from":"./","_npmVersion":"1.3.4","_npmUser":{"name":"mathieuloutre","email":"mathieu@nightzookeeper.com"},"maintainers":[{"name":"mathieuloutre","email":"mathieu@nightzookeeper.com"}]},"0.1.1":{"version":"0.1.1","name":"com.wonkystar.phonegap.infantium","cordova_name":"Infantium","description":"Infantium SDK Plugin for Phonegap","license":"MIT","keywords":["cordova","infantium","phonegap"],"engines":[],"readme":"infantium-phonegap\n==================\n\n## Phonegap Plugin for the Infantium SDK\n\n# Warning\n\nThis only concerns the Android version of the SDK and therefore will only work on Android versions of your Phonegap apps. \nAlso, this is the debug version of the Infantium SDK that you should use for development. You will need to switch to the production version later by just replacing the jar file in the libs folder of the Android project.\n\n# How to\n\nFirst you need to install the plugin:\n\n`cordova plugins add com.wonkystar.phonegap.infantium` to get the latest published version. \n\n`cordova plugins add https://github.com/WonkyStar/infantium-phonegap.git` if you want the latest version on Github.\n\n\nThis will add all the necessary libs to your Android app (Infantium SDK etc.). It will also add Infantium's required permissions to your Android Manifest.\n\nNow your will have access to Infantium's SDK in `window.plugins.infantium`. \nYou will find the functions' signatures in `www/infantium.js`.\n\nBesides `setup` (which requires your Infantium credentials and allows to set your device resolution if you _really_ want to), `setContentAppUUID` (which requires your Content App UUID) and `createGameplay` (which requires a Subcontent UUID) functions, all other functions require an object or an array of objects if they need arguments. Each function also accepts a single Node-style callback (with `(err, res)` as arguments). The plugin handles Phonegap's callbacks behind the scenes for a cleaner interface. \nAll the object field names are the same as the ones provided in Infantium's methods/constructors signature. You can also have a look in the converter methods of `src/android/Infantium.java`.\n\nThe plugin also has a `generateUUID` utility function which generates a UUID using Java. This is particularly useful for Infantium's `Element` which require a unique id. However, the functions `addElement` and `addElements` will be able to generate one on the fly for you and return it (or a list of id for `addElements`) if no id has been set and if the call is successful.\n\nInfantium also requires that you call a function when the app is paused and when it's resumed. To hook them into Phonegap, you can use [event listeners](http://docs.phonegap.com/en/3.1.0/cordova_events_events.md.html#pause).\n\n# Example\n\n```js\n\t// This needs to happen after 'deviceready'\n\t\n\tdocument.addEventListener(\"resume\", function() {\n\t\twindow.plugins.infantium.onResumeInfantium();\n\t}, false);\n\n\tdocument.addEventListener(\"pause\", function() {\n\t\twindow.plugins.infantium.onPauseInfantium();\n\t}, false);\n\n\twindow.plugins.infantium.setup(\"INFANTIUM API USER\", \"API USER KEY\", function() {\n\t \n\t window.plugins.infantium.setContentAppUUID(\"CONTENT UUID\", function() {\n\t \n\t window.plugins.infantium.getPlayerUUIDFromApp(function() {\n\n window.plugins.infantium.createGameplay(\"SUBCONTENT UUID\", function() {\n\n window.plugins.infantium.startPlaying(function() {\n window.plugins.infantium.addElement({\n color: \"0,0,0\",\n alpha: 1.0,\n type: 'Static_object',\n visual_type: 'Draw_object',\n visibility: 1.0,\n category: 'Polygon',\n subcategory: 'Freeshape',\n size: [10, 10],\n pos: [10, 10],\n extra_fields: [\n \t{\n \t\tname: 'something',\n type: 'string',\n value: 'something'\n \t},\n {\n \tname: 'thing',\n type: 'dict',\n value: '',\n fields: [\n \t{\n\t \tname: 'start',\n\t type: 'int',\n\t value: 5\n\t \t},\n {\n \tname: 'end',\n type: 'int',\n value: 15\n }\n \t]\n \t}\n ]\n }, function (err, id) {\n window.plugins.infantium.tapOnObjects({element_id: id, output: 'success'});\n });\n\n window.plugins.infantium.setSuccesses(1)\n \n window.plugins.infantium.addDynamicField({\n name: 'language',\n type: 'string',\n value: 'en-GB'\n });\n\n window.plugins.infantium.sendGameRawData(function() {\n window.plugins.infantium.closeGameplay();\n });\n });\n });\n\t });\n\t });\n\t});\n```\n\n# Troubleshooting\n\nIf you're having trouble with the `resume` or `pause` event not firing you can also inject code directly in your main activity by overriding `onResume` and `onPause` like so:\n\n```java\n\n@Override\nprotected void onPause() {\n super.onPause();\n \n Infantium_SDK infantium = Infantium_SDK.getInfantium_SDK(this);\n infantium.onPauseInfantium();\n}\n\n@Override\nprotected void onResume() {\n super.onResume();\n \n Infantium_SDK infantium = Infantium_SDK.getInfantium_SDK(this);\n infantium.onResumeInfantium();\n}\n```\n\nYou will also have to import the infantium SDK lib to do this by adding this with the other packages: `import com.infantium.android.sdk.Infantium_SDK`\n\n# Changelog\n\n- 0.1.1 - Remove receiver from AndroidManifest.xml and update SDK\n- 0.1.0 - Implements all the methods in the walkthrough","readmeFilename":"README.md","_id":"com.wonkystar.phonegap.infantium@0.1.1","dist":{"shasum":"c1ea1d694ff0ef84e34ee923d6774c0337a4655b","tarball":"http://registry.cordova.io/com.wonkystar.phonegap.infantium/-/com.wonkystar.phonegap.infantium-0.1.1.tgz"},"_from":"./infantium-phonegap","_npmVersion":"1.3.4","_npmUser":{"name":"mathieuloutre","email":"mathieu@nightzookeeper.com"},"maintainers":[{"name":"mathieuloutre","email":"mathieu@nightzookeeper.com"}]}},"readme":"infantium-phonegap\n==================\n\n## Phonegap Plugin for the Infantium SDK\n\n# Warning\n\nThis only concerns the Android version of the SDK and therefore will only work on Android versions of your Phonegap apps. \nAlso, this is the debug version of the Infantium SDK that you should use for development. You will need to switch to the production version later by just replacing the jar file in the libs folder of the Android project.\n\n# How to\n\nFirst you need to install the plugin:\n\n`cordova plugins add com.wonkystar.phonegap.infantium` to get the latest published version. \n\n`cordova plugins add https://github.com/WonkyStar/infantium-phonegap.git` if you want the latest version on Github.\n\n\nThis will add all the necessary libs to your Android app (Infantium SDK etc.). It will also add Infantium's required permissions and receiver to your Android Manifest.\n\nNow your will have access to Infantium's SDK in `window.plugins.infantium`. \nYou will find the functions' signatures in `www/infantium.js`.\n\nBesides `setup` (which requires your Infantium credentials and allows to set your device resolution if you _really_ want to), `setContentAppUUID` (which requires your Content App UUID) and `createGameplay` (which requires a Subcontent UUID) functions, all other functions require an object or an array of objects if they need arguments. Each function also accepts a single Node-style callback (with `(err, res)` as arguments). The plugin handles Phonegap's callbacks behind the scenes for a cleaner interface. \nAll the object field names are the same as the ones provided in Infantium's methods/constructors signature. You can also have a look in the converter methods of `src/android/Infantium.java`.\n\nThe plugin also has a `generateUUID` utility function which generates a UUID using Java. This is particularly useful for Infantium's `Element` which require a unique id. However, the functions `addElement` and `addElements` will be able to generate one on the fly for you and return it (or a list of id for `addElements`) if no id has been set and if the call is successful.\n\nInfantium also requires that you call a function when the app is paused and when it's resumed. To hook them into Phonegap, you can use [event listeners](http://docs.phonegap.com/en/3.1.0/cordova_events_events.md.html#pause).\n\n# Example\n\n```js\n\t// This needs to happen after 'deviceready'\n\t\n\tdocument.addEventListener(\"resume\", function() {\n\t\twindow.plugins.infantium.onResumeInfantium();\n\t}, false);\n\n\tdocument.addEventListener(\"pause\", function() {\n\t\twindow.plugins.infantium.onPauseInfantium();\n\t}, false);\n\n\twindow.plugins.infantium.setup(\"INFANTIUM API USER\", \"API USER KEY\", function() {\n\t \n\t window.plugins.infantium.setContentAppUUID(\"CONTENT UUID\", function() {\n\t \n\t window.plugins.infantium.getPlayerUUIDFromApp(function() {\n\n window.plugins.infantium.createGameplay(\"SUBCONTENT UUID\", function() {\n\n window.plugins.infantium.startPlaying(function() {\n window.plugins.infantium.addElement({\n color: \"0,0,0\",\n alpha: 1.0,\n type: 'Static_object',\n visual_type: 'Draw_object',\n visibility: 1.0,\n category: 'Polygon',\n subcategory: 'Freeshape',\n size: [10, 10],\n pos: [10, 10],\n extra_fields: [\n \t{\n \t\tname: 'something',\n type: 'string',\n value: 'something'\n \t},\n {\n \tname: 'thing',\n type: 'dict',\n value: '',\n fields: [\n \t{\n\t \tname: 'start',\n\t type: 'int',\n\t value: 5\n\t \t},\n {\n \tname: 'end',\n type: 'int',\n value: 15\n }\n \t]\n \t}\n ]\n }, function (err, id) {\n window.plugins.infantium.tapOnObjects({element_id: id, output: 'success'});\n });\n\n window.plugins.infantium.setSuccesses(1)\n \n window.plugins.infantium.addDynamicField({\n name: 'language',\n type: 'string',\n value: 'en-GB'\n });\n\n window.plugins.infantium.sendGameRawData(function() {\n window.plugins.infantium.closeGameplay();\n });\n });\n });\n\t });\n\t });\n\t});\n```\n\n# Troubleshooting\n\nIf you're having trouble with the `resume` or `pause` event not firing you can also inject code directly in your main activity by overriding `onResume` and `onPause` like so:\n\n```java\n\n@Override\nprotected void onPause() {\n super.onPause();\n \n Infantium_SDK infantium = Infantium_SDK.getInfantium_SDK(this);\n infantium.onPauseInfantium();\n}\n\n@Override\nprotected void onResume() {\n super.onResume();\n \n Infantium_SDK infantium = Infantium_SDK.getInfantium_SDK(this);\n infantium.onResumeInfantium();\n}\n```\n\nYou will also have to import the infantium SDK lib to do this by adding this with the other packages: `import com.infantium.android.sdk.Infantium_SDK`\n\n# Changelog\n\n- 0.1.0 - Implements all the methods in the walkthrough","maintainers":[{"name":"mathieuloutre","email":"mathieu@nightzookeeper.com"}],"time":{"modified":"2013-12-03T21:23:46.665Z","created":"2013-11-20T13:24:25.123Z","0.1.0":"2013-11-20T13:24:26.530Z","0.1.1":"2013-12-03T21:23:46.665Z"},"_attachments":{"com.wonkystar.phonegap.infantium-0.1.1.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-8TXsdAsvB51hCSBsllWnuA==","length":117901,"stub":true},"com.wonkystar.phonegap.infantium-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-gEZueFref0iCFC8SulbXQQ==","length":118023,"stub":true}}}},
{"id":"com.zjf","key":"com.zjf","value":{"rev":"3-129cc6f0abeff1ffeb8816fdec894ab8"},"doc":{"_id":"com.zjf","_rev":"3-129cc6f0abeff1ffeb8816fdec894ab8","name":"com.zjf","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"version":"0.1.0","name":"com.zjf","cordova_name":"Zjf","engines":[],"readme":"ERROR: No README data found!","readmeFilename":"readme.md","_id":"com.zjf@0.1.0","dist":{"shasum":"5d3ab08b3795c19bcdd6baadda79d12db159a9fd","tarball":"http://registry.cordova.io/com.zjf/-/com.zjf-0.1.0.tgz"},"_from":"D:\\gitfortest","_npmVersion":"1.3.4","_npmUser":{"name":"zjf","email":"zjf276744763@qq.com"},"maintainers":[{"name":"zjf","email":"zjf276744763@qq.com"}]}},"readme":"ERROR: No README data found!","maintainers":[{"name":"zjf","email":"zjf276744763@qq.com"}],"time":{"modified":"2013-10-11T07:19:46.318Z","created":"2013-10-11T07:19:17.743Z","0.1.0":"2013-10-11T07:19:46.318Z"},"_attachments":{"com.zjf-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-v/S+7ErafIOvNK1QX/Q88Q==","length":5040408,"stub":true}}}},
{"id":"de.appplant.cordova.plugin.background-mode","key":"de.appplant.cordova.plugin.background-mode","value":{"rev":"3-71ef81a552840524c120086b948e7508"},"doc":{"_id":"de.appplant.cordova.plugin.background-mode","_rev":"3-71ef81a552840524c120086b948e7508","name":"de.appplant.cordova.plugin.background-mode","description":"A bunch of background mode plugins for Cordova 3.x.x","dist-tags":{"latest":"0.4.0"},"versions":{"0.4.0":{"version":"0.4.0","name":"de.appplant.cordova.plugin.background-mode","cordova_name":"BackgroundMode","description":"A bunch of background mode plugins for Cordova 3.x.x","license":"GPL v2 License","keywords":["background"," ios"," windows phone 8"," wp8"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova BackgroundMode-Plugin\n==============================\n\nA bunch of background mode plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS** (>=5)\n- **WP8**\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-background-mode.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.background-mode\n```\n\n## Release Notes\n#### Version 0.4.0 (10.10.2013)\n- Added WP8 support<br>\n The plugin turns the app into an location tracking app *(for the time it runs in the background)*.\n\n#### Version 0.2.1 (09.10.2013)\n- Added js interface to manually enable/disable the background mode.\n\n#### Version 0.2.0 (08.10.2013)\n- Added iOS (>= 5) support<br>\n The plugin turns the app into an location tracking app for the time it runs in the background.\n\n## Using the plugin\nSimply add the plugin to your project and the app will run while in background.\n\nThe plugin creates the object ```window.plugin.backgroundMode``` with two methods:\n\n### enable()\nThe method enables the background mode. The mode is activated once the app has entered the background and will be deactivated after the app has entered the foreground.<br>\nPlease be aware, to activate the background mode the app needs to be in foreground.\n\n```javascript\n/**\n * Enables the background mode. The app will not pause while in background.\n */\nwindow.plugin.backgroundMode.enable();\n```\n\n### disable()\nThe method disables the background mode. If the mode is disabled while the app is running in the background, the app will be paused immediately.\n```javascript\n/**\n * Disables the background mode. The app will pause in background as usual.\n */\nwindow.plugin.backgroundMode.disable();\n```\n\n## Quirks\n\n### The app crashes under iOS\nIf the app crashes after installing the plugin, make sure that your `*-Info.plist` is valid.\nDo to some bugs in cordova or Plugman please reset all occurences like\n```xml\n<key>NSMainNibFile</key>\n<string>\n\n</string>\n```\nto\n```xml\n<key>NSMainNibFile</key>\n<string></string>\n```\n\n### Location tracking under iOS\n**iOS 5-6**<br>\nThe app still runs in background, even if the location service is not actived.\n\n**iOS 7**<br>\nThe location service needs to be enabled.\n\n### Optimization under WP8\nBy default the plugin will track for geo updates while the application is in background and foreground. To stop tracking in foreground, the `MainPage.xaml.cs` file needs the following 2 methods:\n```c#\nnamespace your.own.namespace\n{\n public partial class MainPage : PhoneApplicationPage\n {\n /// </summary>\n /// The page (the app) will enter the background and the background mode\n /// needs to be activated.\n /// </summary>\n protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)\n {\n Cordova.Extension.Commands.BackgroundMode.Activate();\n }\n\n /// </summary>\n /// The page (the app) will enter the foreground and the background mode\n /// needs to be deactivated.\n /// </summary>\n protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)\n {\n Cordova.Extension.Commands.BackgroundMode.Deactivate();\n }\n }\n}\n```\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.background-mode@0.4.0","dist":{"shasum":"8ec874cd0b31c833f1a87257886c9baf40ae7d0e","tarball":"http://registry.cordova.io/de.appplant.cordova.plugin.background-mode/-/de.appplant.cordova.plugin.background-mode-0.4.0.tgz"},"_from":"cordova-plugin-background-mode/","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}]}},"readme":"Cordova BackgroundMode-Plugin\n==============================\n\nA bunch of background mode plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS** (>=5)\n- **WP8**\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-background-mode.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.background-mode\n```\n\n## Release Notes\n#### Version 0.4.0 (10.10.2013)\n- Added WP8 support<br>\n The plugin turns the app into an location tracking app *(for the time it runs in the background)*.\n\n#### Version 0.2.1 (09.10.2013)\n- Added js interface to manually enable/disable the background mode.\n\n#### Version 0.2.0 (08.10.2013)\n- Added iOS (>= 5) support<br>\n The plugin turns the app into an location tracking app for the time it runs in the background.\n\n## Using the plugin\nSimply add the plugin to your project and the app will run while in background.\n\nThe plugin creates the object ```window.plugin.backgroundMode``` with two methods:\n\n### enable()\nThe method enables the background mode. The mode is activated once the app has entered the background and will be deactivated after the app has entered the foreground.<br>\nPlease be aware, to activate the background mode the app needs to be in foreground.\n\n```javascript\n/**\n * Enables the background mode. The app will not pause while in background.\n */\nwindow.plugin.backgroundMode.enable();\n```\n\n### disable()\nThe method disables the background mode. If the mode is disabled while the app is running in the background, the app will be paused immediately.\n```javascript\n/**\n * Disables the background mode. The app will pause in background as usual.\n */\nwindow.plugin.backgroundMode.disable();\n```\n\n## Quirks\n\n### The app crashes under iOS\nIf the app crashes after installing the plugin, make sure that your `*-Info.plist` is valid.\nDo to some bugs in cordova or Plugman please reset all occurences like\n```xml\n<key>NSMainNibFile</key>\n<string>\n\n</string>\n```\nto\n```xml\n<key>NSMainNibFile</key>\n<string></string>\n```\n\n### Location tracking under iOS\n**iOS 5-6**<br>\nThe app still runs in background, even if the location service is not actived.\n\n**iOS 7**<br>\nThe location service needs to be enabled.\n\n### Optimization under WP8\nBy default the plugin will track for geo updates while the application is in background and foreground. To stop tracking in foreground, the `MainPage.xaml.cs` file needs the following 2 methods:\n```c#\nnamespace your.own.namespace\n{\n public partial class MainPage : PhoneApplicationPage\n {\n /// </summary>\n /// The page (the app) will enter the background and the background mode\n /// needs to be activated.\n /// </summary>\n protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)\n {\n Cordova.Extension.Commands.BackgroundMode.Activate();\n }\n\n /// </summary>\n /// The page (the app) will enter the foreground and the background mode\n /// needs to be deactivated.\n /// </summary>\n protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)\n {\n Cordova.Extension.Commands.BackgroundMode.Deactivate();\n }\n }\n}\n```\n","maintainers":[{"name":"katzer","email":"katzer@appplant.de"}],"time":{"modified":"2013-10-29T15:23:34.642Z","created":"2013-10-29T15:23:33.335Z","0.4.0":"2013-10-29T15:23:34.642Z"},"_attachments":{"de.appplant.cordova.plugin.background-mode-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-nCmooEBx7m97YcOVCKUJaA==","length":10884,"stub":true}}}},
{"id":"de.appplant.cordova.plugin.badge","key":"de.appplant.cordova.plugin.badge","value":{"rev":"7-dbc67565e9d714fd16e105e4e2df5c3a"},"doc":{"_id":"de.appplant.cordova.plugin.badge","_rev":"7-dbc67565e9d714fd16e105e4e2df5c3a","name":"de.appplant.cordova.plugin.badge","description":"A bunch of badge number plugins for Cordova 3.x.x","dist-tags":{"latest":"0.5.0"},"versions":{"0.4.0":{"version":"0.4.0","name":"de.appplant.cordova.plugin.badge","cordova_name":"Badge","description":"A bunch of badge notification plugins for Cordova 3.x.x","license":"GPL v2 License","keywords":["badge"," notification"," live tiles"," ios"," windows phone 8"," wp8"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova Badge-Plugin\n====================\n\nA bunch of badge notification plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**\n- **WP8**\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-badge.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.badge\n```\n\n## Release Notes\n#### Version 0.4.0 (07.10.2013)\n- Added WP8 support\n- **Note:** The former `plugin.badge` namespace is not longer available.\n\n#### Version 0.2.1 (15.08.2013)\n- Added new namespace `plugin.notification.badge`<br>\n **Note:** The former `plugin.badge` namespace is deprecated now and will be removed in the next major release.\n\n#### Version 0.2.0 (11.08.2013)\n- Added iOS support<br>\n *Based on the Badge iOS plugin made by* ***Joseph Stuhr***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.notification.badge``` with two methods:\n\n### set()\nTo set the badge number:\n```javascript\nwindow.plugin.notification.badge.set(_number_);\n```\n\n### clear()\nTo clear the badge:\n```javascript\nwindow.plugin.notification.badge.clear();\nwindow.plugin.notification.badge.set(0); // alternative\n```\n\n#### Example\nTo set the badge number to **1**:\n```javascript\nwindow.plugin.notification.badge.set(1);\n// or\nwindow.plugin.notification.badge.set('1');\n```\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.badge@0.4.0","dist":{"shasum":"2dea9163979449781a6e60119fded585c0f4ba3c","tarball":"http://registry.cordova.io/de.appplant.cordova.plugin.badge/-/de.appplant.cordova.plugin.badge-0.4.0.tgz"},"_from":"cordova-plugin-badge/","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}]},"0.4.1":{"version":"0.4.1","name":"de.appplant.cordova.plugin.badge","cordova_name":"Badge","description":"A bunch of badge notification plugins for Cordova 3.x.x","license":"Apache 2.0","keywords":["badge"," notification"," live tiles"," ios"," windows phone 8"," wp8"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova Badge-Plugin\n====================\n\nA bunch of badge number plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**\n- **WP8**\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-badge.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.badge\n```\n\n## Release Notes\n#### Version 0.4.1 (04.12.2013)\n- Release under the Apache 2.0 license.\n\n#### Version 0.4.0 (07.10.2013)\n- Added WP8 support\n- **Note:** The former `plugin.badge` namespace is not longer available.\n\n#### Version 0.2.1 (15.08.2013)\n- Added new namespace `plugin.notification.badge`<br>\n **Note:** The former `plugin.badge` namespace is deprecated now and will be removed in the next major release.\n\n#### Version 0.2.0 (11.08.2013)\n- Added iOS support<br>\n *Based on the Badge iOS plugin made by* ***Joseph Stuhr***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.notification.badge``` with two methods:\n\n### set()\nThe method takes the badge number as an argument. The argument needs to be a number or a string which can be parsed to a number.\n```javascript\nwindow.plugin.notification.badge.set(Number);\n```\n\n### clear()\nClearing the badge number is equivalent to set a zero number.\n```javascript\nwindow.plugin.notification.badge.clear();\n// or\nwindow.plugin.notification.badge.set(0);\n```\n\n## Example\nSets the badge number to **1**:\n```javascript\nwindow.plugin.notification.badge.set(1);\n// or\nwindow.plugin.notification.badge.set('1');\n```\n\n## Quirks\n### TypeError: Cannot read property 'currentVersion' of null\nAlong with Cordova 3.2 and Windows Phone 8 the `version.bat` script has to be renamed to `version`.\n\nOn Mac or Linux\n```\nmv platforms/wp8/cordova/version.bat platforms/wp8/cordova/version\n```\nOn Windows\n```\nren platforms\\wp8\\cordova\\version.bat platforms\\wp8\\cordova\\version\n```\n\n## Contributing\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create new Pull Request\n\n## License\n\nThis software is released under the [Apache 2.0 License](http://opensource.org/licenses/Apache-2.0).\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.badge@0.4.1","dist":{"shasum":"fe0828cfe6b3bdda68ca966c066261f60960a863","tarball":"http://registry.cordova.io/de.appplant.cordova.plugin.badge/-/de.appplant.cordova.plugin.badge-0.4.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}]},"0.5.0":{"version":"0.5.0","name":"de.appplant.cordova.plugin.badge","cordova_name":"Badge","description":"A bunch of badge number plugins for Cordova 3.x.x","license":"Apache 2.0","keywords":["badge"," notification"," live tiles"," ios"," windows phone 8"," wp8"," android"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova Badge-Plugin\n====================\n\nA bunch of badge number plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**\n- **WP8**\n- **Android** *(SDK >=11)*<br>\nSee [Notification Guide](http://developer.android.com/guide/topics/ui/notifiers/notifications.html) for detailed informations and screenshots.\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-badge.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.badge\n```\n\n## PhoneGap Build\nAdd the following xml to your config.xml to always use the latest version of this plugin:\n```\n<gap:plugin name=\"de.appplant.cordova.plugin.badge\" />\n```\nor to use this exact version:\n```\n<gap:plugin name=\"de.appplant.cordova.plugin.badge\" version=\"0.4.1\" />\n```\nMore informations can be found [here](https://build.phonegap.com/plugins/330).\n\n## Release Notes\n#### Version 0.5.0 (04.01.2014)\n- Added Android support\n\n#### Version 0.4.1 (04.12.2013)\n- Release under the Apache 2.0 license.\n\n#### Version 0.4.0 (07.10.2013)\n- Added WP8 support\n- **Note:** The former `plugin.badge` namespace is not longer available.\n\n#### Version 0.2.1 (15.08.2013)\n- Added new namespace `plugin.notification.badge`<br>\n **Note:** The former `plugin.badge` namespace is deprecated now and will be removed in the next major release.\n\n#### Version 0.2.0 (11.08.2013)\n- Added iOS support<br>\n *Based on the Badge iOS plugin made by* ***Joseph Stuhr***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.notification.badge``` with two methods:\n\n### set()\nThe method takes the badge number as an argument. The argument needs to be a number or a string which can be parsed to a number.\n```javascript\nwindow.plugin.notification.badge.set(Number);\n```\n\n### clear()\nClearing the badge number is equivalent to set a zero number.\n```javascript\nwindow.plugin.notification.badge.clear();\n// or\nwindow.plugin.notification.badge.set(0);\n```\n\n## Example\nSets the badge number to **1**:\n```javascript\nwindow.plugin.notification.badge.set(1);\n// or\nwindow.plugin.notification.badge.set('1');\n```\n\n## Platform specifics\n### Specify custom notification title on Android\nThe default format for the title is `%d new messages`. But it can be customized/localized through the string ressource `notification_badge_title`.\n```xml\n<!-- res/values/string.xml -->\n\n<?xml version='1.0' encoding='utf-8'?>\n<resources>\n\t...\n <string name=\"notification_badge_title\">%d new messages</string>\n ...\n</resources>\n```\n\n## Quirks\n### TypeError: Cannot read property 'currentVersion' of null\nAlong with Cordova 3.2 and Windows Phone 8 the `version.bat` script has to be renamed to `version`.\n\nOn Mac or Linux\n```\nmv platforms/wp8/cordova/version.bat platforms/wp8/cordova/version\n```\nOn Windows\n```\nren platforms\\wp8\\cordova\\version.bat platforms\\wp8\\cordova\\version\n```\n\n## Contributing\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create new Pull Request\n\n## License\n\nThis software is released under the [Apache 2.0 License](http://opensource.org/licenses/Apache-2.0).\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.badge@0.5.0","dist":{"shasum":"a3ff78286f685125f50d1f3017b353a3be5df9d7","tarball":"http://registry.cordova.io/de.appplant.cordova.plugin.badge/-/de.appplant.cordova.plugin.badge-0.5.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}]}},"readme":"Cordova Badge-Plugin\n====================\n\nA bunch of badge notification plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**\n- **WP8**\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-badge.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.badge\n```\n\n## Release Notes\n#### Version 0.4.0 (07.10.2013)\n- Added WP8 support\n- **Note:** The former `plugin.badge` namespace is not longer available.\n\n#### Version 0.2.1 (15.08.2013)\n- Added new namespace `plugin.notification.badge`<br>\n **Note:** The former `plugin.badge` namespace is deprecated now and will be removed in the next major release.\n\n#### Version 0.2.0 (11.08.2013)\n- Added iOS support<br>\n *Based on the Badge iOS plugin made by* ***Joseph Stuhr***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.notification.badge``` with two methods:\n\n### set()\nTo set the badge number:\n```javascript\nwindow.plugin.notification.badge.set(_number_);\n```\n\n### clear()\nTo clear the badge:\n```javascript\nwindow.plugin.notification.badge.clear();\nwindow.plugin.notification.badge.set(0); // alternative\n```\n\n#### Example\nTo set the badge number to **1**:\n```javascript\nwindow.plugin.notification.badge.set(1);\n// or\nwindow.plugin.notification.badge.set('1');\n```\n","maintainers":[{"name":"katzer","email":"katzer@appplant.de"}],"time":{"modified":"2014-01-04T18:45:46.126Z","created":"2013-10-29T15:22:33.954Z","0.4.0":"2013-10-29T15:22:35.113Z","0.4.1":"2013-12-04T21:24:51.477Z","0.5.0":"2014-01-04T18:45:46.126Z"},"_attachments":{"de.appplant.cordova.plugin.badge-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-IVImGKXFLWqaZWmzZQKcwQ==","length":8706,"stub":true},"de.appplant.cordova.plugin.badge-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-e55xdZJ1/IXWXoG/Bn12eA==","length":6973,"stub":true},"de.appplant.cordova.plugin.badge-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-9uZIan7CrUwMhFx9/Un1Dg==","length":9306,"stub":true}}}},
{"id":"de.appplant.cordova.plugin.email-composer","key":"de.appplant.cordova.plugin.email-composer","value":{"rev":"19-8dbd287226046f95f931e182289969d5"},"doc":{"_id":"de.appplant.cordova.plugin.email-composer","_rev":"19-8dbd287226046f95f931e182289969d5","name":"de.appplant.cordova.plugin.email-composer","description":"A bunch of email composition plugins for Cordova 3.x.x","dist-tags":{"latest":"0.7.1"},"versions":{"0.4.0":{"version":"0.4.0","name":"de.appplant.cordova.plugin.email-composer","cordova_name":"EmailComposer","description":"A bunch of email composition plugins for Cordova 3.x.x","license":"GPL v2 License","keywords":["email"," email intent"," email composer"," ios"," android"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova EmailComposer-Plugin\n====================\n\nA bunch of email composition plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**<br>\n*See [MFMailComposeViewController Class Reference](http://developer.apple.com/library/ios/documentation/MessageUI/Reference/MFMailComposeViewController_class/Reference/Reference.html) for detailed informations and screenshots.*\n- **Android**\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-email-composer.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.email-composer\n```\n\n## Release Notes\n#### Version 0.4.1 (not yet released)\n- [bugfix]: On Android, the `isServiceAvailable()` interface has returned string values instead of boolean values.\n\n#### Version 0.4.0 (20.08.2013)\n- Added Android support<br>\n *Based on the EmailComposerWithAttachments Android plugin made by* ***guidosabatini***\n\n#### Version 0.2.1 (15.08.2013)\n- [bugfix]: Email was not send in HTML format, if the `isHtml` flag was set.\n- [bugfix]: `email.open()` without a parameter throw an error.\n\n#### Version 0.2.0 (13.08.2013)\n- Added iOS support<br>\n *Based on the EmailComposer(WithAttachments) iOS plugin made by* ***Randy McMillan*** *and* ***guidosabatini***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.email``` with two methods:\n\n### isServiceAvailable()\nEmail service is only available on devices capable which are able to send emails. You can use this function to hide email functionality from users who will be unable to use it.<br>\nFunction takes a callback function, passed to which is a boolean property. Optionally the callback scope can be assigned as a second parameter.\n\n**Android:** Service is not available if no email accout is added on the device.\n\n```javascript\n/*\n * Find out if the sending of emails is available. Use this for showing/hiding email buttons.\n */\nwindow.plugin.email.isServiceAvailable(\n function (isAvailable) {\n alert(isavailable ? 'Service is available' : 'Service NOT available');\n }\n);\n```\n\n### open()\nYou can use this function to show the email view pre-filled with all kind of properties (see example below).<br>\nThe function takes a hash where each property is optional. If a callback function is given, it will be called with a result code about the user action.\n\n**iOS:** You can attach only PDF and images (the latter will be convertend in PNG format).<br>\n**Android:** Result codes for the callback function are not support.\n\n```javascript\n/*\n * Opens an email draft pre-filled with the passed properties.\n */\nwindow.plugin.email.open({\n subject: 'subject', // represents the subject of the email\n body: 'body', // represents the email body (could be HTML code, in this case set isHtml to true)\n isHtml: true, // indicats if the body is HTML or plain text\n recipients: [], // contains all the email addresses for TO field\n ccRecipients: [], // contains all the email addresses for CC field\n bccRecipients: [], // contains all the email addresses for BCC field\n attachments: [], // contains all full paths to the files you want to attach\n\n callback: function (code) {\n switch (code) {\n case 0: // email composition cancelled (cancel button pressed and draft not saved)\n case 1: // email saved (cancel button pressed but draft saved)\n case 2: // email sent\n case 3: // send failed\n case 4: // email not sent (something wrong happened e.g. service is not available)\n }\n },\n scope: this // execution scope of the callback function (default: window)\n});\n```\n\n```javascript\n/*\n * Opens a blank email draft.\n */\nwindow.plugin.email.open();\n```\n\n## Quirks\n\n### Testing in the Android Simulator\nIf you are using an emulator, you’ll need to configure the email client. If the email client is not configured, it will not respond to the Intent we’ll be discussing. If you want to see the chooser in action, you’ll need to configure a device using multiple messaging applications, such as the Gmail application and the Email application.\n\n**Note:** Google APIs will give you access to adding accounts.\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.email-composer@0.4.0","dist":{"shasum":"e1f55bc3da04c73bded219b0b9391fa03434b1df","tarball":"http://cordova.iriscouch.com/registry/_design/scratch/_rewrite/de.appplant.cordova.plugin.email-composer/-/de.appplant.cordova.plugin.email-composer-0.4.0.tgz"},"_from":"cordova-plugin-email-composer/","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}],"directories":{}},"0.4.1":{"version":"0.4.1","name":"de.appplant.cordova.plugin.email-composer","cordova_name":"EmailComposer","description":"A bunch of email composition plugins for Cordova 3.x.x","license":"GPL v2 License","keywords":["email"," email intent"," email composer"," ios"," android"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova EmailComposer-Plugin\n====================\n\nA bunch of email composition plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**<br>\n*See [MFMailComposeViewController Class Reference](http://developer.apple.com/library/ios/documentation/MessageUI/Reference/MFMailComposeViewController_class/Reference/Reference.html) for detailed informations and screenshots.*\n\n- **Android**\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-email-composer.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.email-composer\n```\n\n## Release Notes\n#### Version 0.4.1 (03.11.2013)\n- [bugfix]: On Android, the `isServiceAvailable()` interface has returned string values instead of boolean values.\n- [bugfix]: Sometimes the device said that no email app is available because of the missing mime type.\n\n#### Version 0.4.0 (20.08.2013)\n- Added Android support<br>\n *Based on the EmailComposerWithAttachments Android plugin made by* ***guidosabatini***\n\n#### Version 0.2.1 (15.08.2013)\n- [bugfix]: Email was not send in HTML format, if the `isHtml` flag was set.\n- [bugfix]: `email.open()` without a parameter throw an error.\n\n#### Version 0.2.0 (13.08.2013)\n- Added iOS support<br>\n *Based on the EmailComposer(WithAttachments) iOS plugin made by* ***Randy McMillan*** *and* ***guidosabatini***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.email``` with two methods:\n\n### isServiceAvailable()\nEmail service is only available on devices capable which are able to send emails. You can use this function to hide email functionality from users who will be unable to use it.<br>\nFunction takes a callback function, passed to which is a boolean property. Optionally the callback scope can be assigned as a second parameter.\n\n**Android:** Service is not available if no email accout is added on the device.\n\n```javascript\n/*\n * Find out if the sending of emails is available. Use this for showing/hiding email buttons.\n */\nwindow.plugin.email.isServiceAvailable(\n function (isAvailable) {\n alert(isavailable ? 'Service is available' : 'Service NOT available');\n }\n);\n```\n\n### open()\nYou can use this function to show the email view pre-filled with all kind of properties (see example below).<br>\nThe function takes a hash where each property is optional. If a callback function is given, it will be called with a result code about the user action.\n\n**iOS:** You can attach only PDF and images (the latter will be convertend in PNG format).<br>\n**Android:** Result codes for the callback function are not support.\n\n```javascript\n/*\n * Opens an email draft pre-filled with the passed properties.\n */\nwindow.plugin.email.open({\n subject: 'subject', // represents the subject of the email\n body: 'body', // represents the email body (could be HTML code, in this case set isHtml to true)\n isHtml: true, // indicats if the body is HTML or plain text\n recipients: [], // contains all the email addresses for TO field\n ccRecipients: [], // contains all the email addresses for CC field\n bccRecipients: [], // contains all the email addresses for BCC field\n attachments: [], // contains all full paths to the files you want to attach\n\n callback: function (code) {\n switch (code) {\n case 0: // email composition cancelled (cancel button pressed and draft not saved)\n case 1: // email saved (cancel button pressed but draft saved)\n case 2: // email sent\n case 3: // send failed\n case 4: // email not sent (something wrong happened e.g. service is not available)\n }\n },\n scope: this // execution scope of the callback function (default: window)\n});\n```\n\n```javascript\n/*\n * Opens a blank email draft.\n */\nwindow.plugin.email.open();\n```\n\n## Quirks\n\n### Testing in the Android Simulator\nIf you are using an emulator, you’ll need to configure the email client. If the email client is not configured, it will not respond to the Intent we are discussing. If you want to see the chooser in action, you’ll need to configure a device using multiple messaging applications, such as the Gmail application and the Email application.\n\n**Note:** Google APIs will give you access to adding accounts.\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.email-composer@0.4.1","dist":{"shasum":"d2c625df35e2bd69ce13133c20bb5dea288b4cde","tarball":"http://cordova.iriscouch.com/registry/_design/scratch/_rewrite/de.appplant.cordova.plugin.email-composer/-/de.appplant.cordova.plugin.email-composer-0.4.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}],"directories":{}},"0.4.2":{"version":"0.4.2","name":"de.appplant.cordova.plugin.email-composer","cordova_name":"EmailComposer","description":"A bunch of email composition plugins for Cordova 3.x.x","license":"GPL v2 License","keywords":["email"," email intent"," email composer"," ios"," android"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova EmailComposer-Plugin\n====================\n\nA bunch of email composition plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**<br>\n*See [MFMailComposeViewController Class Reference](http://developer.apple.com/library/ios/documentation/MessageUI/Reference/MFMailComposeViewController_class/Reference/Reference.html) for detailed informations and screenshots.*\n\n- **Android**\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-email-composer.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.email-composer\n```\n\n## Release Notes\n#### Version 0.4.2 (17.11.2013)\n- [feature:] Added alias `openDraft` to the `open` interface.\n\n#### Version 0.4.1 (03.11.2013)\n- [bugfix]: On Android, the `isServiceAvailable()` interface has returned string values instead of boolean values.\n- [bugfix]: Sometimes the device said that no email app is available because of the missing mime type.\n\n#### Version 0.4.0 (20.08.2013)\n- Added Android support<br>\n *Based on the EmailComposerWithAttachments Android plugin made by* ***guidosabatini***\n\n#### Version 0.2.1 (15.08.2013)\n- [bugfix]: Email was not send in HTML format, if the `isHtml` flag was set.\n- [bugfix]: `email.open()` without a parameter throw an error.\n\n#### Version 0.2.0 (13.08.2013)\n- Added iOS support<br>\n *Based on the EmailComposer(WithAttachments) iOS plugin made by* ***Randy McMillan*** *and* ***guidosabatini***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.email``` with two methods:\n\n### isServiceAvailable()\nEmail service is only available on devices capable which are able to send emails. You can use this function to hide email functionality from users who will be unable to use it.<br>\nFunction takes a callback function, passed to which is a boolean property. Optionally the callback scope can be assigned as a second parameter.\n\n**Android:** Service is not available if no email accout is added on the device.\n\n```javascript\n/*\n * Find out if the sending of emails is available. Use this for showing/hiding email buttons.\n */\nwindow.plugin.email.isServiceAvailable(\n function (isAvailable) {\n alert(isavailable ? 'Service is available' : 'Service NOT available');\n }\n);\n```\n\n### open() / openDraft()\nYou can use this function to show the email view pre-filled with all kind of properties (see example below).<br>\nThe function takes a hash where each property is optional. If a callback function is given, it will be called with a result code about the user action.\n\n**iOS:** You can attach only PDF and images (the latter will be convertend in PNG format).<br>\n**Android:** Result codes for the callback function are not support.\n\n```javascript\n/*\n * Opens an email draft pre-filled with the passed properties.\n */\nwindow.plugin.email.open({\n subject: 'subject', // represents the subject of the email\n body: 'body', // represents the email body (could be HTML code, in this case set isHtml to true)\n isHtml: true, // indicats if the body is HTML or plain text\n recipients: [], // contains all the email addresses for TO field\n ccRecipients: [], // contains all the email addresses for CC field\n bccRecipients: [], // contains all the email addresses for BCC field\n attachments: [], // contains all full paths to the files you want to attach\n\n callback: function (code) {\n switch (code) {\n case 0: // email composition cancelled (cancel button pressed and draft not saved)\n case 1: // email saved (cancel button pressed but draft saved)\n case 2: // email sent\n case 3: // send failed\n case 4: // email not sent (something wrong happened e.g. service is not available)\n }\n },\n scope: this // execution scope of the callback function (default: window)\n});\n```\n\n```javascript\n/*\n * Opens a blank email draft.\n */\nwindow.plugin.email.open();\n```\n\n## Example\n```html\n<!DOCTYPE html>\n<html>\n <head>\n <script type=\"text/javascript\" src=\"cordova.js\"></script>\n <script type=\"text/javascript\">\n function openDraft () {\n window.plugin.email.open({ subject: 'Hello World' });\n }\n </script>\n </head>\n <body>\n <a href=\"#\" onClick=\"openDraft()\">Send Me</a>\n </body>\n</html>\n```\n\n## Quirks\n\n### Testing in the Android Simulator\nIf you are using an emulator, you’ll need to configure the email client. If the email client is not configured, it will not respond to the Intent we are discussing. If you want to see the chooser in action, you’ll need to configure a device using multiple messaging applications, such as the Gmail application and the Email application.\n\n**Note:** Google APIs will give you access to adding accounts.\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.email-composer@0.4.2","dist":{"shasum":"2068c52d58df10e76165d47903df0cd99e4c91f7","tarball":"http://cordova.iriscouch.com/registry/_design/scratch/_rewrite/de.appplant.cordova.plugin.email-composer/-/de.appplant.cordova.plugin.email-composer-0.4.2.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}],"directories":{}},"0.6.0":{"version":"0.6.0","name":"de.appplant.cordova.plugin.email-composer","cordova_name":"EmailComposer","description":"A bunch of email composition plugins for Cordova 3.x.x","license":"GPL v2 License","keywords":["email"," email intent"," email composer"," ios"," android"," windows phone"," wp8"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova EmailComposer-Plugin\n====================\n\nA bunch of email composition plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**<br>\n*See [MFMailComposeViewController Class Reference](http://developer.apple.com/library/ios/documentation/MessageUI/Reference/MFMailComposeViewController_class/Reference/Reference.html) for detailed informations and screenshots.*\n\n- **Android**\n\n- **WP8**<br>\n*See [How to use the email compose task for Windows Phone](http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh394003.aspx) for detailed informations.*\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-email-composer.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.email-composer\n```\n\n## Release Notes\n#### Version 0.6.0 (17.11.2013)\n- Added WP8 support\n- [***deprecated:***] The `callback` property will be removed with v0.7.0.\n\n#### Version 0.4.2 (17.11.2013)\n- [feature:] Added alias `openDraft` to the `open` interface.\n\n#### Version 0.4.1 (03.11.2013)\n- [bugfix]: On Android, the `isServiceAvailable()` interface has returned string values instead of boolean values.\n- [bugfix]: Sometimes the device said that no email app is available because of the missing mime type.\n\n#### Version 0.4.0 (20.08.2013)\n- Added Android support<br>\n *Based on the EmailComposerWithAttachments Android plugin made by* ***guidosabatini***\n\n#### Version 0.2.1 (15.08.2013)\n- [bugfix]: Email was not send in HTML format, if the `isHtml` flag was set.\n- [bugfix]: `email.open()` without a parameter throw an error.\n\n#### Version 0.2.0 (13.08.2013)\n- Added iOS support<br>\n *Based on the EmailComposer(WithAttachments) iOS plugin made by* ***Randy McMillan*** *and* ***guidosabatini***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.email``` with two methods:\n\n### isServiceAvailable()\nEmail service is only available on devices capable which are able to send emails. You can use this function to hide email functionality from users who will be unable to use it.<br>\nFunction takes a callback function, passed to which is a boolean property. Optionally the callback scope can be assigned as a second parameter.\n\n**Android:** Service is not available if no email accout is added on the device.\n\n```javascript\n/*\n * Find out if the sending of emails is available. Use this for showing/hiding email buttons.\n */\nwindow.plugin.email.isServiceAvailable(\n function (isAvailable) {\n alert(isavailable ? 'Service is available' : 'Service NOT available');\n }\n);\n```\n\n### open() / openDraft()\nYou can use this function to show the email view pre-filled with all kind of properties (see example below).<br>\nThe function takes a hash where each property is optional. If a callback function is given, it will be called with a result code about the user action.\n\n**iOS:** You can attach only PDF and images (the latter will be convertend in PNG format).<br>\n**Android:** Result codes for the callback function are not support.\n\n```javascript\n/*\n * Opens an email draft pre-filled with the passed properties.\n */\nwindow.plugin.email.open({\n subject: 'subject', // represents the subject of the email\n body: 'body', // represents the email body (could be HTML code, in this case set isHtml to true)\n isHtml: true, // indicats if the body is HTML or plain text\n recipients: [], // contains all the email addresses for TO field\n ccRecipients: [], // contains all the email addresses for CC field\n bccRecipients: [], // contains all the email addresses for BCC field\n attachments: [], // contains all full paths to the files you want to attach\n\n callback: function (code) {\n switch (code) {\n case 0: // email composition cancelled (cancel button pressed and draft not saved)\n case 1: // email saved (cancel button pressed but draft saved)\n case 2: // email sent\n case 3: // send failed\n case 4: // email not sent (something wrong happened e.g. service is not available)\n }\n },\n scope: this // execution scope of the callback function (default: window)\n});\n```\n\n```javascript\n/*\n * Opens a blank email draft.\n */\nwindow.plugin.email.open();\n```\n\n## Example\n```html\n<!DOCTYPE html>\n<html>\n <head>\n <script type=\"text/javascript\" src=\"cordova.js\"></script>\n <script type=\"text/javascript\">\n function openDraft () {\n window.plugin.email.open({ subject: 'Hello World' });\n }\n </script>\n </head>\n <body>\n <a href=\"#\" onClick=\"openDraft()\">Send Me</a>\n </body>\n</html>\n```\n\n## Quirks\n\n### Email composer under Android and Windows Phone\nAn configured email account is required to send emails.<br>\n***WP8:*** If an email account is not set up on the phone, the application prompts the user to set up an account.\n\n### Limited support for Windows Phone 8\nAdding attachments and HTML formatted body are not supported.\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.email-composer@0.6.0","dist":{"shasum":"99d026a07957c91d6e40af0efbcf34e51e8be6b6","tarball":"http://cordova.iriscouch.com/registry/_design/scratch/_rewrite/de.appplant.cordova.plugin.email-composer/-/de.appplant.cordova.plugin.email-composer-0.6.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}],"directories":{}},"0.7.0":{"version":"0.7.0","name":"de.appplant.cordova.plugin.email-composer","cordova_name":"EmailComposer","description":"A bunch of email composition plugins for Cordova 3.x.x","license":"Apache 2.0","keywords":["email"," email intent"," email composer"," ios"," android"," windows phone"," wp8"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova EmailComposer-Plugin\n====================\n\nA bunch of email composition plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**<br>\n*See [MFMailComposeViewController Class Reference](http://developer.apple.com/library/ios/documentation/MessageUI/Reference/MFMailComposeViewController_class/Reference/Reference.html) for detailed informations and screenshots.*\n\n- **Android**\n\n- **WP8**<br>\n*See [How to use the email compose task for Windows Phone](http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh394003.aspx) for detailed informations.*\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-email-composer.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.email-composer\n```\n\n## Release Notes\n#### Version 0.7.0 (05.12.2013)\n- Release under the Apache 2.0 license.\n- [***change:***] Removed the `callback` property from the `open` interface.\n- [***change:***] Renamed the properties `recipients`, `ccRecipients`, `bccRecipients`.\n- [bugfix:] Plugin under WP8 throws an error, if recipients were given as arrays.\n- [enhancement:] `open` does not block the ui thread on iOS & Android anymore.\n\n#### Version 0.6.0 (17.11.2013)\n- Added WP8 support\n- [***deprecated:***] The `callback` property will be removed with v0.7.0.\n\n#### Version 0.4.2 (17.11.2013)\n- [feature:] Added alias `openDraft` to the `open` interface.\n\n#### Version 0.4.1 (03.11.2013)\n- [bugfix]: On Android, the `isServiceAvailable()` interface has returned string values instead of boolean values.\n- [bugfix]: Sometimes the device said that no email app is available because of the missing mime type.\n\n#### Version 0.4.0 (20.08.2013)\n- Added Android support<br>\n *Based on the EmailComposerWithAttachments Android plugin made by* ***guidosabatini***\n\n#### Version 0.2.1 (15.08.2013)\n- [bugfix]: Email was not send in HTML format, if the `isHtml` flag was set.\n- [bugfix]: `email.open()` without a parameter throw an error.\n\n#### Version 0.2.0 (13.08.2013)\n- Added iOS support<br>\n *Based on the EmailComposer(WithAttachments) iOS plugin made by* ***Randy McMillan*** *and* ***guidosabatini***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.email``` with two methods:\n\n### isServiceAvailable()\nEmail service is only available on devices capable which are able to send emails. You can use this function to hide email functionality from users who will be unable to use it.<br>\nFunction takes a callback function, passed to which is a boolean property. Optionally the callback scope can be assigned as a second parameter.\n\n**Android:** Service is not available if no email accout is added on the device.\n\n```javascript\n/*\n * Find out if the sending of emails is available. Use this for showing/hiding email buttons.\n */\nwindow.plugin.email.isServiceAvailable(\n function (isAvailable) {\n alert(isAvailable ? 'Service is available' : 'Service NOT available');\n }\n);\n```\n\n### open() / openDraft()\nYou can use this function to show the email view pre-filled with all kind of properties (see example below).<br>\nThe function takes a hash where each property is optional. If a callback function is given, it will be called with a result code about the user action.\n\n**iOS:** You can attach only PDF and images (the latter will be converted in PNG format).\n\n```javascript\n/*\n * Opens an email draft pre-filled with the passed properties.\n */\nwindow.plugin.email.open({\n to: Array, // contains all the email addresses for TO field\n cc: Array, // contains all the email addresses for CC field\n bcc: Array, // contains all the email addresses for BCC field\n attachments: Array, // contains all full paths to the files you want to attach\n subject: String, // represents the subject of the email\n body: String, // represents the email body (could be HTML code, in this case set isHtml to true)\n isHtml: Boolean, // indicats if the body is HTML or plain text\n});\n```\n\n```javascript\n/*\n * Opens a blank email draft.\n */\nwindow.plugin.email.open();\n```\n\n## Example\n```javascript\nwindow.plugin.email.open({\n to: ['max.mustermann@appplant.de'],\n cc: ['erika.mustermann@appplant.de'],\n bcc: ['john.doe@appplant.com', 'jane.doe@appplant.com'],\n subject: 'Hello World!',\n body: '<h3>TEST</h3><h2>TEST</h2><h1>TEST</h1>',\n isHtml: true\n});\n```\n\n## Quirks\n\n### Email composer under Android and Windows Phone\nAn configured email account is required to send emails.<br>\n**WP8:** If an email account is not set up on the phone, the application prompts the user to set up an account.\n\n### Limited support for Windows Phone 8\nAdding attachments and HTML formatted body are not supported.\n\n### TypeError: Cannot read property 'currentVersion' of null\nAlong with Cordova 3.2 and Windows Phone 8 the `version.bat` script has to be renamed to `version`.\n\nOn Mac or Linux\n```\nmv platforms/wp8/cordova/version.bat platforms/wp8/cordova/version\n```\nOn Windows\n```\nren platforms\\wp8\\cordova\\version.bat platforms\\wp8\\cordova\\version\n```\n### Compile error on iOS\nThe error indicates, that the `MessageUI.framework` is not linked to your project. The framework is linked automatically when the plugin was installed, but may removed later.\n```\nUndefined symbols for architecture i386:\n \"_OBJC_CLASS_$_MFMailComposeViewController\", referenced from:\n objc-class-ref in APPEmailComposer.o\nld: symbol(s) not found for architecture i386\nclang: error: linker command failed with exit code 1 (use -v to see invocation)\n```\n\n## Contributing\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create new Pull Request\n\n## License\n\nThis software is released under the [Apache 2.0 License](http://opensource.org/licenses/Apache-2.0).\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.email-composer@0.7.0","dist":{"shasum":"17ee38835b7f1202da20764c767f7ab2471b8154","tarball":"http://registry.cordova.io/de.appplant.cordova.plugin.email-composer/-/de.appplant.cordova.plugin.email-composer-0.7.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}]},"0.7.1":{"version":"0.7.1","name":"de.appplant.cordova.plugin.email-composer","cordova_name":"EmailComposer","description":"A bunch of email composition plugins for Cordova 3.x.x","license":"Apache 2.0","keywords":["email"," email intent"," email composer"," ios"," android"," windows phone"," wp8"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova EmailComposer-Plugin\n====================\n\nA bunch of email composition plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**<br>\n*See [MFMailComposeViewController Class Reference](http://developer.apple.com/library/ios/documentation/MessageUI/Reference/MFMailComposeViewController_class/Reference/Reference.html) for detailed informations and screenshots.*\n\n- **Android**\n\n- **WP8**<br>\n*See [How to use the email compose task for Windows Phone](http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh394003.aspx) for detailed informations.*\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-email-composer.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.email-composer\n```\n\n## PhoneGap Build\nAdd the following xml to your config.xml to always use the latest version of this plugin:\n```\n<gap:plugin name=\"de.appplant.cordova.plugin.email-composer\" />\n```\nor to use this exact version:\n```\n<gap:plugin name=\"de.appplant.cordova.plugin.email-composer\" version=\"0.7.0\" />\n```\nMore informations can be found [here](https://build.phonegap.com/plugins/333).\n\n## Release Notes\n#### Version 0.7.1 (17.12.2013)\n- [bugfix:] Only the last attachment was added to the email composer on android.\n\n#### Version 0.7.0 (05.12.2013)\n- Release under the Apache 2.0 license.\n- [***change:***] Removed the `callback` property from the `open` interface.\n- [***change:***] Renamed the properties `recipients`, `ccRecipients`, `bccRecipients`.\n- [bugfix:] Plugin under WP8 throws an error, if recipients were given as arrays.\n- [enhancement:] `open` does not block the ui thread on iOS & Android anymore.\n\n#### Version 0.6.0 (17.11.2013)\n- Added WP8 support\n- [***deprecated:***] The `callback` property will be removed with v0.7.0.\n\n#### Version 0.4.2 (17.11.2013)\n- [feature:] Added alias `openDraft` to the `open` interface.\n\n#### Version 0.4.1 (03.11.2013)\n- [bugfix]: On Android, the `isServiceAvailable()` interface has returned string values instead of boolean values.\n- [bugfix]: Sometimes the device said that no email app is available because of the missing mime type.\n\n#### Version 0.4.0 (20.08.2013)\n- Added Android support<br>\n *Based on the EmailComposerWithAttachments Android plugin made by* ***guidosabatini***\n\n#### Version 0.2.1 (15.08.2013)\n- [bugfix]: Email was not send in HTML format, if the `isHtml` flag was set.\n- [bugfix]: `email.open()` without a parameter throw an error.\n\n#### Version 0.2.0 (13.08.2013)\n- Added iOS support<br>\n *Based on the EmailComposer(WithAttachments) iOS plugin made by* ***Randy McMillan*** *and* ***guidosabatini***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.email``` with two methods:\n\n### isServiceAvailable()\nEmail service is only available on devices capable which are able to send emails. You can use this function to hide email functionality from users who will be unable to use it.<br>\nFunction takes a callback function, passed to which is a boolean property. Optionally the callback scope can be assigned as a second parameter.\n\n**Android:** Service is not available if no email accout is added on the device.\n\n```javascript\n/*\n * Find out if the sending of emails is available. Use this for showing/hiding email buttons.\n */\nwindow.plugin.email.isServiceAvailable(\n function (isAvailable) {\n alert(isAvailable ? 'Service is available' : 'Service NOT available');\n }\n);\n```\n\n### open() / openDraft()\nYou can use this function to show the email view pre-filled with all kind of properties (see example below).<br>\nThe function takes a hash where each property is optional. If a callback function is given, it will be called with a result code about the user action.\n\n**iOS:** You can attach only PDF and images (the latter will be converted in PNG format).\n\n```javascript\n/*\n * Opens an email draft pre-filled with the passed properties.\n */\nwindow.plugin.email.open({\n to: Array, // contains all the email addresses for TO field\n cc: Array, // contains all the email addresses for CC field\n bcc: Array, // contains all the email addresses for BCC field\n attachments: Array, // contains all full paths to the files you want to attach\n subject: String, // represents the subject of the email\n body: String, // represents the email body (could be HTML code, in this case set isHtml to true)\n isHtml: Boolean, // indicats if the body is HTML or plain text\n});\n```\n\n```javascript\n/*\n * Opens a blank email draft.\n */\nwindow.plugin.email.open();\n```\n\n## Example\n```javascript\nwindow.plugin.email.open({\n to: ['max.mustermann@appplant.de'],\n cc: ['erika.mustermann@appplant.de'],\n bcc: ['john.doe@appplant.com', 'jane.doe@appplant.com'],\n subject: 'Hello World!',\n body: '<h3>TEST</h3><h2>TEST</h2><h1>TEST</h1>',\n isHtml: true\n});\n```\n\n## Quirks\n\n### Email composer under Android and Windows Phone\nAn configured email account is required to send emails.<br>\n**WP8:** If an email account is not set up on the phone, the application prompts the user to set up an account.\n\n### Limited support for Windows Phone 8\nAdding attachments and HTML formatted body are not supported.\n\n### TypeError: Cannot read property 'currentVersion' of null\nAlong with Cordova 3.2 and Windows Phone 8 the `version.bat` script has to be renamed to `version`.\n\nOn Mac or Linux\n```\nmv platforms/wp8/cordova/version.bat platforms/wp8/cordova/version\n```\nOn Windows\n```\nren platforms\\wp8\\cordova\\version.bat platforms\\wp8\\cordova\\version\n```\n### Compile error on iOS\nThe error indicates, that the `MessageUI.framework` is not linked to your project. The framework is linked automatically when the plugin was installed, but may removed later.\n```\nUndefined symbols for architecture i386:\n \"_OBJC_CLASS_$_MFMailComposeViewController\", referenced from:\n objc-class-ref in APPEmailComposer.o\nld: symbol(s) not found for architecture i386\nclang: error: linker command failed with exit code 1 (use -v to see invocation)\n```\n\n## Contributing\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create new Pull Request\n\n## License\n\nThis software is released under the [Apache 2.0 License](http://opensource.org/licenses/Apache-2.0).\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.email-composer@0.7.1","dist":{"shasum":"48a8bd293833b11edb39cca0dda06ab890e955ad","tarball":"http://registry.cordova.io/de.appplant.cordova.plugin.email-composer/-/de.appplant.cordova.plugin.email-composer-0.7.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}]}},"readme":"Cordova EmailComposer-Plugin\n====================\n\nA bunch of email composition plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**<br>\n*See [MFMailComposeViewController Class Reference](http://developer.apple.com/library/ios/documentation/MessageUI/Reference/MFMailComposeViewController_class/Reference/Reference.html) for detailed informations and screenshots.*\n- **Android**\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-email-composer.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.email-composer\n```\n\n## Release Notes\n#### Version 0.4.1 (not yet released)\n- [bugfix]: On Android, the `isServiceAvailable()` interface has returned string values instead of boolean values.\n\n#### Version 0.4.0 (20.08.2013)\n- Added Android support<br>\n *Based on the EmailComposerWithAttachments Android plugin made by* ***guidosabatini***\n\n#### Version 0.2.1 (15.08.2013)\n- [bugfix]: Email was not send in HTML format, if the `isHtml` flag was set.\n- [bugfix]: `email.open()` without a parameter throw an error.\n\n#### Version 0.2.0 (13.08.2013)\n- Added iOS support<br>\n *Based on the EmailComposer(WithAttachments) iOS plugin made by* ***Randy McMillan*** *and* ***guidosabatini***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.email``` with two methods:\n\n### isServiceAvailable()\nEmail service is only available on devices capable which are able to send emails. You can use this function to hide email functionality from users who will be unable to use it.<br>\nFunction takes a callback function, passed to which is a boolean property. Optionally the callback scope can be assigned as a second parameter.\n\n**Android:** Service is not available if no email accout is added on the device.\n\n```javascript\n/*\n * Find out if the sending of emails is available. Use this for showing/hiding email buttons.\n */\nwindow.plugin.email.isServiceAvailable(\n function (isAvailable) {\n alert(isavailable ? 'Service is available' : 'Service NOT available');\n }\n);\n```\n\n### open()\nYou can use this function to show the email view pre-filled with all kind of properties (see example below).<br>\nThe function takes a hash where each property is optional. If a callback function is given, it will be called with a result code about the user action.\n\n**iOS:** You can attach only PDF and images (the latter will be convertend in PNG format).<br>\n**Android:** Result codes for the callback function are not support.\n\n```javascript\n/*\n * Opens an email draft pre-filled with the passed properties.\n */\nwindow.plugin.email.open({\n subject: 'subject', // represents the subject of the email\n body: 'body', // represents the email body (could be HTML code, in this case set isHtml to true)\n isHtml: true, // indicats if the body is HTML or plain text\n recipients: [], // contains all the email addresses for TO field\n ccRecipients: [], // contains all the email addresses for CC field\n bccRecipients: [], // contains all the email addresses for BCC field\n attachments: [], // contains all full paths to the files you want to attach\n\n callback: function (code) {\n switch (code) {\n case 0: // email composition cancelled (cancel button pressed and draft not saved)\n case 1: // email saved (cancel button pressed but draft saved)\n case 2: // email sent\n case 3: // send failed\n case 4: // email not sent (something wrong happened e.g. service is not available)\n }\n },\n scope: this // execution scope of the callback function (default: window)\n});\n```\n\n```javascript\n/*\n * Opens a blank email draft.\n */\nwindow.plugin.email.open();\n```\n\n## Quirks\n\n### Testing in the Android Simulator\nIf you are using an emulator, you’ll need to configure the email client. If the email client is not configured, it will not respond to the Intent we’ll be discussing. If you want to see the chooser in action, you’ll need to configure a device using multiple messaging applications, such as the Gmail application and the Email application.\n\n**Note:** Google APIs will give you access to adding accounts.\n","maintainers":[{"name":"katzer","email":"katzer@appplant.de"}],"time":{"modified":"2013-12-19T16:19:21.754Z","created":"2013-10-29T15:23:16.502Z","0.4.0":"2013-10-29T15:23:17.893Z","0.4.1":"2013-11-03T10:14:00.597Z","0.4.2":"2013-11-17T09:31:11.157Z","0.6.0":"2013-11-17T11:47:18.909Z","0.7.0":"2013-12-05T11:18:44.160Z","0.7.1":"2013-12-19T16:19:21.754Z"},"_attachments":{"de.appplant.cordova.plugin.email-composer-0.7.1.tgz":{"content_type":"application/octet-stream","revpos":18,"digest":"md5-tbPe3u6D+KtipVyACd/ScA==","length":12318,"stub":true},"de.appplant.cordova.plugin.email-composer-0.7.0.tgz":{"content_type":"application/octet-stream","revpos":16,"digest":"md5-oYotjzYpChCiiq+fF+ue8w==","length":12182,"stub":true},"de.appplant.cordova.plugin.email-composer-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-H5MyMZY8A4yh1d96xi3ltQ==","length":14367,"stub":true},"de.appplant.cordova.plugin.email-composer-0.4.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-jpZeHFwS7p4OQhcrVpbW7w==","length":13469,"stub":true},"de.appplant.cordova.plugin.email-composer-0.4.1.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-UuhSshX9AS/bZ0F+WCkmeQ==","length":13266,"stub":true},"de.appplant.cordova.plugin.email-composer-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-a5gwcBJfl4/2OUkKlZrqlw==","length":13184,"stub":true}}}},
{"id":"de.appplant.cordova.plugin.local-notification","key":"de.appplant.cordova.plugin.local-notification","value":{"rev":"3-d3dd1109431a965c808c85fd2b890d0b"},"doc":{"_id":"de.appplant.cordova.plugin.local-notification","_rev":"3-d3dd1109431a965c808c85fd2b890d0b","name":"de.appplant.cordova.plugin.local-notification","description":"A bunch of local-notification plugins for Cordova 3.x.x","dist-tags":{"latest":"0.6.3"},"versions":{"0.6.3":{"version":"0.6.3","name":"de.appplant.cordova.plugin.local-notification","cordova_name":"LocalNotification","description":"A bunch of local-notification plugins for Cordova 3.x.x","license":"Apache 2.0","keywords":["notification"," local notification"," alarm"," scheduler"," tile"," live tiles"," ios"," android"," windows phone 8"," wp8"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova LocalNotification-Plugin\n==================================\n\nA bunch of local notification plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**<br>\nSee [Local and Push Notification Programming Guide](http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/WhatAreRemoteNotif.html) for detailed informations and screenshots.\n\n- **Android** *(SDK >=11)*<br>\nSee [Notification Guide](http://developer.android.com/guide/topics/ui/notifiers/notifications.html) for detailed informations and screenshots.\n\n- **WP8**<br>\nSee [Local notifications for Windows Phone](http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207047.aspx) for detailed informations and screenshots.\n<br>*Windows Phone 8.0 has no notification center. Instead local notifications are realized through live tiles updates.*\n\n\n## Dependencies\nCordova will check all dependencies and install them if they are missing.\n- [org.apache.cordova.device](https://github.com/apache/cordova-plugin-device) *(since v0.6.0)*\n\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-local-notifications.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.local-notification\n```\n\n## PhoneGap Build\nAdd the following xml to your config.xml to always use the latest version of this plugin:\n```\n<gap:plugin name=\"de.appplant.cordova.plugin.local-notification\" />\n```\nor to use this exact version:\n```\n<gap:plugin name=\"de.appplant.cordova.plugin.local-notification\" version=\"0.6.2\" />\n```\nMore informations can be found [here](https://build.phonegap.com/plugins/331).\n\n## Release Notes\n#### Version 0.7.0 (not yet released)\n\n#### Version 0.6.3 (12.12.2013)\n- [bugfix:] Black screen on Android.\n- [bugfix:] App throws an error on reboot on Android.\n- Calling `cancel` on Android with an invalid String as ID does not throw an error anymore.\n\n#### Version 0.6.2 (04.12.2013)\n- Release under the Apache 2.0 license.\n\n#### Version 0.6.1 (04.12.2013)\n- Release under the LGPL 2.1 license.\n- [feature:] Sound can be specified on Android.\n- [enhancement:] Adding notifications on Android does not block the ui thread anymore.\n- [bugfix:] The app did stop/crash after removing them from recent apps list.\n- [enhancement:] Adding notifications on iOS does not block the ui thread anymore.\n- [bugfix:] Added missing `RECEIVE_BOOT_COMPLETED`permission on Android.\n- [enhancement:] Rework the code for Android. Thanks to ***samsara (samsarayg)***.\n- [bugfix:] `cancel` on iOS did not work do to wrong param type.\n- [enhancement:] `cancel` & `cancelAll` remove the notification(s) from notification center as well on Android.\n- [bugfix:] Missing background callback on Android.\n- [bugfix:] Android notification is not shown when the app is not running.\n\n#### Version 0.6.0 (16.11.2013)\n- Added WP8 support<br>\n *Based on the LiveTiles WP8 plugin made by* ***Jesse MacFadyen (purplecabbage)***\n- [enhancement:] The `add()` function now returns the id of the created notification.\n- [feature:] Added new `title` property.\n- [bugfix:] `cancel` on iOS did not work do to wrong dict key.\n- [enhancement:] All notifications on Android display the app icon by default.\n- [feature:] Icon can be specified on Android.\n\n#### Version 0.4.0 (06.10.2013)\n- Added Android support<br>\n *Based on the LocalNotifications Android plugin made by* ***Daniël (dvtoever)***\n\n#### Version 0.2.0 (11.08.2013)\n- Added iOS support<br>\n *Based on the LocalNotifications iOS plugin made by* ***Rodrigo Moyle***\n\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.notification.local``` with the following methods:\n\n### add()\nThe method allows to add a custom notification. It takes an hash as an argument to specify the notification's properties and returns the ID for the notification.<br>\nAll properties are optional. If no date object is given, the notification will pop-up immediately.\n\n```javascript\nwindow.plugin.notification.local.add({\n id: String, // a unique id of the notifiction\n date: Date, // this expects a date object\n message: String, // the message that is displayed\n title: String, // the title of the message\n repeat: String, // has the options of daily', 'weekly',''monthly','yearly')\n badge: Number, // displays number badge to notification\n sound: String, // a sound to be played (iOS & Android)\n foreground: String, // a javascript function to be called if the app is running\n background: String, // a javascript function to be called if the app is in the background\n});\n```\n**Note:** On Android the notification id needs to be a string which can be converted to a number. If the ID has an invalid format, it will be ignored, but canceling the notification will fail.\n\n### cancel()\nThe method cancels a notification which was previously added. It takes the ID of the notification as an argument.\n```javascript\nwindow.plugin.notification.local.cancel(String);\n```\n\n### cancelAll()\nThe method cancels all notifications which were previously added by the application.\n```javascript\nwindow.plugin.notification.local.cancelAll();\n```\n\n\n## Examples\n#### Will fire every week on this day, 60 seconds from now\n```javascript\nvar now = new Date().getTime(),\n _60_seconds_from_now = new Date(now + 60*1000);\n\nwindow.plugin.notification.local.add({\n id: 1, // is converted to a string\n title: 'Reminder',\n message: 'Dont forget to buy some flowers.',\n repeat: 'weekly',\n date: _60_seconds_from_now,\n foreground: 'foreground',\n background: 'background'\n});\n\nfunction foreground (id) {\n console.log('I WAS RUNNING ID='+id)\n}\n\nfunction background (id) {\n console.log('I WAS IN THE BACKGROUND ID='+id)\n}\n```\n#### Pop's up immediately\n```javascript\nwindow.plugin.notification.local.add({ message: 'Great app!' });\n```\n#### Plays no sound if the notification pop's up\n```javascript\nwindow.plugin.notification.local.add({ sound: null });\n```\n\n\n## Platform specifics\n### Notification icon on Android\nBy default all notifications will display the app icon. But an specific icon can be defined through the `icon` property.\n```javascript\n/**\n * Displays the <package.name>.R.drawable.ic_launcher icon\n */\nwindow.plugin.notification.local.add({ icon: 'ic_launcher' });\n\n/**\n * Displays the android.R.drawable.ic_dialog_email icon\n */\nwindow.plugin.notification.local.add({ icon: 'ic_dialog_email' });\n```\n\n### Notification sound on Android\nThe sound must be a absolute or relative Uri pointing to the sound file. The default sound is `RingtoneManager.TYPE_NOTIFICATION`.\n```javascript\n/**\n * Plays the `beep.mp3` sound if the notification pop's up\n */\nwindow.plugin.notification.local.add({ sound: 'android.resource://' + package_name + '/raw/beep' });\n\n/**\n * Plays the `RingtoneManager.TYPE_ALARM` sound\n */\nwindow.plugin.notification.local.add({ sound: 'TYPE_ALARM' });\n```\n**Note:** Local sound files must be placed into the res-folder and not into the assets-folder.\n\n### Notification sound on iOS\nThe sound must be located in your project's resources and must be a caf file.\n```javascript\n/**\n * Plays the sound if the notification pop's up\n */\nwindow.plugin.notification.local.add({ sound: 'sub.caf' });\n```\n**Note:** The right to play notification sounds in the notification center settings has to be granted.\n\n### LiveTile background images on WP8\nLiveTile's have the ability to display images for different sizes. These images can be defined through the `smallImage`, `image` and `wideImage` properties.<br>\nAn image must be defined as a relative or absolute URI.\n```javascript\n/**\n * Displays the application icon as the livetile's background image\n */\nwindow.plugin.notification.local.add({ image: 'appdata:ApplicationIcon.png' })\n```\nAll images can be restored to the default ones by canceling the notification.\n\n\n## Quirks\n### No sound is played on iOS 7\nThe right to play notification sounds in the notification center settings has to be granted.\n### Adding a notification on WP8\nAn application can only display one notification at a time. Each time a new notification has to be added, the application live tile's data will be overwritten by the new ones.\n\n### TypeError: Cannot read property 'currentVersion' of null\nAlong with Cordova 3.2 and Windows Phone 8 the `version.bat` script has to be renamed to `version`.\n\nOn Mac or Linux\n```\nmv platforms/wp8/cordova/version.bat platforms/wp8/cordova/version\n```\nOn Windows\n```\nren platforms\\wp8\\cordova\\version.bat platforms\\wp8\\cordova\\version\n```\n\n### App restarts on Android after notification was clicked\nThe launch mode for the main activity has to be set to `singleInstance`\n```xml\n<activity ... android:launchMode=\"singleInstance\" ... />\n```\n\n## Contributing\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create new Pull Request\n\n## License\n\nThis software is released under the [Apache 2.0 License](http://opensource.org/licenses/Apache-2.0).\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.local-notification@0.6.3","dist":{"shasum":"c55246cb7980f091a6f2aad6139a5723a9751221","tarball":"http://registry.cordova.io/de.appplant.cordova.plugin.local-notification/-/de.appplant.cordova.plugin.local-notification-0.6.3.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}]}},"readme":"Cordova LocalNotification-Plugin\n==================================\n\nA bunch of local notification plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**<br>\nSee [Local and Push Notification Programming Guide](http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/WhatAreRemoteNotif.html) for detailed informations and screenshots.\n\n- **Android** *(SDK >=11)*<br>\nSee [Notification Guide](http://developer.android.com/guide/topics/ui/notifiers/notifications.html) for detailed informations and screenshots.\n\n- **WP8**<br>\nSee [Local notifications for Windows Phone](http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207047.aspx) for detailed informations and screenshots.\n<br>*Windows Phone 8.0 has no notification center. Instead local notifications are realized through live tiles updates.*\n\n\n## Dependencies\nCordova will check all dependencies and install them if they are missing.\n- [org.apache.cordova.device](https://github.com/apache/cordova-plugin-device) *(since v0.6.0)*\n\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-local-notifications.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.local-notification\n```\n\n## PhoneGap Build\nAdd the following xml to your config.xml to always use the latest version of this plugin:\n```\n<gap:plugin name=\"de.appplant.cordova.plugin.local-notification\" />\n```\nor to use this exact version:\n```\n<gap:plugin name=\"de.appplant.cordova.plugin.local-notification\" version=\"0.6.2\" />\n```\nMore informations can be found [here](https://build.phonegap.com/plugins/331).\n\n## Release Notes\n#### Version 0.7.0 (not yet released)\n\n#### Version 0.6.3 (12.12.2013)\n- [bugfix:] Black screen on Android.\n- [bugfix:] App throws an error on reboot on Android.\n- Calling `cancel` on Android with an invalid String as ID does not throw an error anymore.\n\n#### Version 0.6.2 (04.12.2013)\n- Release under the Apache 2.0 license.\n\n#### Version 0.6.1 (04.12.2013)\n- Release under the LGPL 2.1 license.\n- [feature:] Sound can be specified on Android.\n- [enhancement:] Adding notifications on Android does not block the ui thread anymore.\n- [bugfix:] The app did stop/crash after removing them from recent apps list.\n- [enhancement:] Adding notifications on iOS does not block the ui thread anymore.\n- [bugfix:] Added missing `RECEIVE_BOOT_COMPLETED`permission on Android.\n- [enhancement:] Rework the code for Android. Thanks to ***samsara (samsarayg)***.\n- [bugfix:] `cancel` on iOS did not work do to wrong param type.\n- [enhancement:] `cancel` & `cancelAll` remove the notification(s) from notification center as well on Android.\n- [bugfix:] Missing background callback on Android.\n- [bugfix:] Android notification is not shown when the app is not running.\n\n#### Version 0.6.0 (16.11.2013)\n- Added WP8 support<br>\n *Based on the LiveTiles WP8 plugin made by* ***Jesse MacFadyen (purplecabbage)***\n- [enhancement:] The `add()` function now returns the id of the created notification.\n- [feature:] Added new `title` property.\n- [bugfix:] `cancel` on iOS did not work do to wrong dict key.\n- [enhancement:] All notifications on Android display the app icon by default.\n- [feature:] Icon can be specified on Android.\n\n#### Version 0.4.0 (06.10.2013)\n- Added Android support<br>\n *Based on the LocalNotifications Android plugin made by* ***Daniël (dvtoever)***\n\n#### Version 0.2.0 (11.08.2013)\n- Added iOS support<br>\n *Based on the LocalNotifications iOS plugin made by* ***Rodrigo Moyle***\n\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.notification.local``` with the following methods:\n\n### add()\nThe method allows to add a custom notification. It takes an hash as an argument to specify the notification's properties and returns the ID for the notification.<br>\nAll properties are optional. If no date object is given, the notification will pop-up immediately.\n\n```javascript\nwindow.plugin.notification.local.add({\n id: String, // a unique id of the notifiction\n date: Date, // this expects a date object\n message: String, // the message that is displayed\n title: String, // the title of the message\n repeat: String, // has the options of daily', 'weekly',''monthly','yearly')\n badge: Number, // displays number badge to notification\n sound: String, // a sound to be played (iOS & Android)\n foreground: String, // a javascript function to be called if the app is running\n background: String, // a javascript function to be called if the app is in the background\n});\n```\n**Note:** On Android the notification id needs to be a string which can be converted to a number. If the ID has an invalid format, it will be ignored, but canceling the notification will fail.\n\n### cancel()\nThe method cancels a notification which was previously added. It takes the ID of the notification as an argument.\n```javascript\nwindow.plugin.notification.local.cancel(String);\n```\n\n### cancelAll()\nThe method cancels all notifications which were previously added by the application.\n```javascript\nwindow.plugin.notification.local.cancelAll();\n```\n\n\n## Examples\n#### Will fire every week on this day, 60 seconds from now\n```javascript\nvar now = new Date().getTime(),\n _60_seconds_from_now = new Date(now + 60*1000);\n\nwindow.plugin.notification.local.add({\n id: 1, // is converted to a string\n title: 'Reminder',\n message: 'Dont forget to buy some flowers.',\n repeat: 'weekly',\n date: _60_seconds_from_now,\n foreground: 'foreground',\n background: 'background'\n});\n\nfunction foreground (id) {\n console.log('I WAS RUNNING ID='+id)\n}\n\nfunction background (id) {\n console.log('I WAS IN THE BACKGROUND ID='+id)\n}\n```\n#### Pop's up immediately\n```javascript\nwindow.plugin.notification.local.add({ message: 'Great app!' });\n```\n#### Plays no sound if the notification pop's up\n```javascript\nwindow.plugin.notification.local.add({ sound: null });\n```\n\n\n## Platform specifics\n### Notification icon on Android\nBy default all notifications will display the app icon. But an specific icon can be defined through the `icon` property.\n```javascript\n/**\n * Displays the <package.name>.R.drawable.ic_launcher icon\n */\nwindow.plugin.notification.local.add({ icon: 'ic_launcher' });\n\n/**\n * Displays the android.R.drawable.ic_dialog_email icon\n */\nwindow.plugin.notification.local.add({ icon: 'ic_dialog_email' });\n```\n\n### Notification sound on Android\nThe sound must be a absolute or relative Uri pointing to the sound file. The default sound is `RingtoneManager.TYPE_NOTIFICATION`.\n```javascript\n/**\n * Plays the `beep.mp3` sound if the notification pop's up\n */\nwindow.plugin.notification.local.add({ sound: 'android.resource://' + package_name + '/raw/beep' });\n\n/**\n * Plays the `RingtoneManager.TYPE_ALARM` sound\n */\nwindow.plugin.notification.local.add({ sound: 'TYPE_ALARM' });\n```\n**Note:** Local sound files must be placed into the res-folder and not into the assets-folder.\n\n### Notification sound on iOS\nThe sound must be located in your project's resources and must be a caf file.\n```javascript\n/**\n * Plays the sound if the notification pop's up\n */\nwindow.plugin.notification.local.add({ sound: 'sub.caf' });\n```\n**Note:** The right to play notification sounds in the notification center settings has to be granted.\n\n### LiveTile background images on WP8\nLiveTile's have the ability to display images for different sizes. These images can be defined through the `smallImage`, `image` and `wideImage` properties.<br>\nAn image must be defined as a relative or absolute URI.\n```javascript\n/**\n * Displays the application icon as the livetile's background image\n */\nwindow.plugin.notification.local.add({ image: 'appdata:ApplicationIcon.png' })\n```\nAll images can be restored to the default ones by canceling the notification.\n\n\n## Quirks\n### No sound is played on iOS 7\nThe right to play notification sounds in the notification center settings has to be granted.\n### Adding a notification on WP8\nAn application can only display one notification at a time. Each time a new notification has to be added, the application live tile's data will be overwritten by the new ones.\n\n### TypeError: Cannot read property 'currentVersion' of null\nAlong with Cordova 3.2 and Windows Phone 8 the `version.bat` script has to be renamed to `version`.\n\nOn Mac or Linux\n```\nmv platforms/wp8/cordova/version.bat platforms/wp8/cordova/version\n```\nOn Windows\n```\nren platforms\\wp8\\cordova\\version.bat platforms\\wp8\\cordova\\version\n```\n\n### App restarts on Android after notification was clicked\nThe launch mode for the main activity has to be set to `singleInstance`\n```xml\n<activity ... android:launchMode=\"singleInstance\" ... />\n```\n\n## Contributing\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create new Pull Request\n\n## License\n\nThis software is released under the [Apache 2.0 License](http://opensource.org/licenses/Apache-2.0).\n","maintainers":[{"name":"katzer","email":"katzer@appplant.de"}],"time":{"modified":"2013-12-12T21:27:05.607Z","created":"2013-12-12T21:27:04.034Z","0.6.3":"2013-12-12T21:27:05.607Z"},"_attachments":{"de.appplant.cordova.plugin.local-notification-0.6.3.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-RbwcvG3xSExfUubKqyBqug==","length":17291,"stub":true}}}},
{"id":"de.appplant.cordova.plugin.local-notifications","key":"de.appplant.cordova.plugin.local-notifications","value":{"rev":"7-250540033f4f8c9b3776e5405723c882"},"doc":{"_id":"de.appplant.cordova.plugin.local-notifications","_rev":"7-250540033f4f8c9b3776e5405723c882","name":"de.appplant.cordova.plugin.local-notifications","description":"A bunch of local-notification plugins for Cordova 3.x.x","dist-tags":{"latest":"0.6.2"},"versions":{"0.6.0":{"version":"0.6.0","name":"de.appplant.cordova.plugin.local-notifications","cordova_name":"LocalNotifications","description":"A bunch of local-notification plugins for Cordova 3.x.x","license":"GPL v2 License","keywords":["notification"," local notification"," alarm"," scheduler"," tile"," live tiles"," ios"," android"," windows phone 8"," wp8"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova LocalNotification-Plugin\n==================================\n\nA bunch of local notification plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**<br>\nSee [Local and Push Notification Programming Guide](http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/WhatAreRemoteNotif.html) for detailed informations and screenshots.\n\n- **Android**<br>\nSee [Notification Guide](http://developer.android.com/guide/topics/ui/notifiers/notifications.html) for detailed informations and screenshots.\n\n- **WP8**<br>\nSee [Local notifications for Windows Phone](http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207047.aspx) for detailed informations and screenshots.\n<br>*Windows Phone 8.0 has no notification center. Instead local notifications are realized through live tiles updates.*\n\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-local-notifications.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.local-notifications\n```\n\n## Release Notes\n#### Version 0.6.0 (16.11.2013)\n- Added WP8 support<br>\n *Based on the LiveTiles WP8 plugin made by* ***Jesse MacFadyen (purplecabbage)***\n- [enhancement:] The `add()` function now returns the id of the created notification.\n- [feature:] Added new `title` property.\n- [bugfix:] `cancel` under iOS did not work do to wrong dict key.\n- [enhancement:] All notifications under Android display the app icon by default.\n- [feature:] Icon can be specified under Android.\n\n#### Version 0.4.0 (06.10.2013)\n- Added Android support<br>\n *Based on the LocalNotifications Android plugin made by* ***Daniël (dvtoever)***\n\n#### Version 0.2.0 (11.08.2013)\n- Added iOS support<br>\n *Based on the LocalNotifications iOS plugin made by* ***Rodrigo Moyle***\n\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.notification.local``` with the following methods:\n\n### add()\nThe method allows to add a custom notification. It takes an hash as an argument to specify the notification's properties and returns the ID for the notification.<br>\nAll properties are optional. If no date object is given, the notification will pop-up immediately.\n\n```javascript\nwindow.plugin.notification.local.add({\n id: id, // a unique id of the notifiction\n date: date, // this expects a date object\n message: message, // the message that is displayed\n title: title, // the title of the message\n repeat: repeat, // has the options of daily', 'weekly',''monthly','yearly')\n badge: badge, // displays number badge to notification\n sound: sound // a sound to be played\n foreground: forground, // a javascript function to be called if the app is running\n background: background, // a javascript function to be called if the app is in the background\n});\n```\n\n### cancel()\nThe method cancels a notification which was previously added. It takes the ID of the notification as an argument.\n```javascript\nwindow.plugin.notification.local.cancel(__id__);\n```\n\n### cancelAll()\nThe method cancels all notifications which were previously added by the application.\n```javascript\nwindow.plugin.notification.local.cancelAll();\n```\n\n\n## Example\n```javascript\nvar now = new Date().getTime(),\n _60_seconds_from_now = new Date(now + 60*1000);\n\nwindow.plugin.notification.local.add({\n id: 1,\n date: _60_seconds_from_now,\n message: 'Hello world!',\n title: 'Check that out!',\n repeat: 'weekly', // will fire every week on this day\n foreground: 'foreground',\n background: 'background'\n});\n\nfunction foreground (id) {\n console.log('I WAS RUNNING ID='+id)\n}\n\nfunction background (id) {\n console.log('I WAS IN THE BACKGROUND ID='+id)\n}\n```\n\n\n## Quirks\n### How to specify the notification icon under Android\nBy default all notifications will display the app icon. But an specific icon can be defined through the `icon` property.\n```javascript\n/**\n * Displays the <package.name>.R.drawable.ic_launcher icon\n */\nwindow.plugin.notification.local.add({ icon: 'ic_launcher' });\n\n/**\n * Displays the android.R.drawable.ic_dialog_email icon\n */\nwindow.plugin.notification.local.add({ icon: 'ic_dialog_email' });\n```\n### Notification sound under iOS\nThe sound must be located in your project's resources and must be a caf file.\n```javascript\n/**\n * Plays the sound if the notification pop's up.\n */\nwindow.plugin.notification.local.add({ sound: 'sub.caf' });\n```\n\n### LiveTile background images under WP8\nLiveTile's have the ability to display images for different sizes. These images can be defined through the `smallImage`, `image` and `wideImage` properties.<br>\nAn image must be defined as a relative or absolute URI. All images will be reseted by canceling the notification.\n```javascript\n/**\n * Displays the application image as the livetile's background image\n */\nwindow.plugin.notification.local.add({ image: 'appdata:ApplicationImage.png' })\n```\n\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.local-notifications@0.6.0","dist":{"shasum":"0b485688ad0120afc74a8d197ea9a2289f159685","tarball":"http://registry.cordova.io/de.appplant.cordova.plugin.local-notifications/-/de.appplant.cordova.plugin.local-notifications-0.6.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}]},"0.6.1":{"version":"0.6.1","name":"de.appplant.cordova.plugin.local-notifications","cordova_name":"LocalNotifications","description":"A bunch of local-notification plugins for Cordova 3.x.x","license":"LGPL v2.1 License","keywords":["notification"," local notification"," alarm"," scheduler"," tile"," live tiles"," ios"," android"," windows phone 8"," wp8"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova LocalNotification-Plugin\n==================================\n\nA bunch of local notification plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**<br>\nSee [Local and Push Notification Programming Guide](http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/WhatAreRemoteNotif.html) for detailed informations and screenshots.\n\n- **Android** *(SDK >=11)*<br>\nSee [Notification Guide](http://developer.android.com/guide/topics/ui/notifiers/notifications.html) for detailed informations and screenshots.\n\n- **WP8**<br>\nSee [Local notifications for Windows Phone](http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207047.aspx) for detailed informations and screenshots.\n<br>*Windows Phone 8.0 has no notification center. Instead local notifications are realized through live tiles updates.*\n\n\n## Dependencies\nCordova will check all dependencies and install them if they are missing.\n- [org.apache.cordova.device](https://github.com/apache/cordova-plugin-device) *(since v0.6.0)*\n\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-local-notifications.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.local-notifications\n```\n\n## Release Notes\n#### Version 0.6.1 (04.12.2013)\n- Release under the LGPL 2.1 license.\n- [feature:] Sound can be specified on Android.\n- [enhancement:] Adding notifications on Android does not block the ui thread anymore.\n- [bugfix:] The app did stop/crash after removing them from recent apps list.\n- [enhancement:] Adding notifications on iOS does not block the ui thread anymore.\n- [bugfix:] Added missing `RECEIVE_BOOT_COMPLETED`permission on Android.\n- [enhancement:] Rework the code for Android. Thanks to ***samsara (samsarayg)***.\n- [bugfix:] `cancel` on iOS did not work do to wrong param type.\n- [enhancement:] `cancel` & `cancelAll` remove the notification(s) from notification center as well on Android.\n- [bugfix:] Missing background callback on Android.\n- [bugfix:] Android notification is not shown when the app is not running.\n\n#### Version 0.6.0 (16.11.2013)\n- Added WP8 support<br>\n *Based on the LiveTiles WP8 plugin made by* ***Jesse MacFadyen (purplecabbage)***\n- [enhancement:] The `add()` function now returns the id of the created notification.\n- [feature:] Added new `title` property.\n- [bugfix:] `cancel` on iOS did not work do to wrong dict key.\n- [enhancement:] All notifications on Android display the app icon by default.\n- [feature:] Icon can be specified on Android.\n\n#### Version 0.4.0 (06.10.2013)\n- Added Android support<br>\n *Based on the LocalNotifications Android plugin made by* ***Daniël (dvtoever)***\n\n#### Version 0.2.0 (11.08.2013)\n- Added iOS support<br>\n *Based on the LocalNotifications iOS plugin made by* ***Rodrigo Moyle***\n\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.notification.local``` with the following methods:\n\n### add()\nThe method allows to add a custom notification. It takes an hash as an argument to specify the notification's properties and returns the ID for the notification.<br>\nAll properties are optional. If no date object is given, the notification will pop-up immediately.\n\n```javascript\nwindow.plugin.notification.local.add({\n id: String, // a unique id of the notifiction\n date: Date, // this expects a date object\n message: String, // the message that is displayed\n title: String, // the title of the message\n repeat: String, // has the options of daily', 'weekly',''monthly','yearly')\n badge: Number, // displays number badge to notification\n sound: String, // a sound to be played (iOS & Android)\n foreground: String, // a javascript function to be called if the app is running\n background: String, // a javascript function to be called if the app is in the background\n});\n```\n\n### cancel()\nThe method cancels a notification which was previously added. It takes the ID of the notification as an argument.\n```javascript\nwindow.plugin.notification.local.cancel(__id__);\n```\n\n### cancelAll()\nThe method cancels all notifications which were previously added by the application.\n```javascript\nwindow.plugin.notification.local.cancelAll();\n```\n\n\n## Examples\n#### Will fire every week on this day, 60 seconds from now\n```javascript\nvar now = new Date().getTime(),\n _60_seconds_from_now = new Date(now + 60*1000);\n\nwindow.plugin.notification.local.add({\n id: 1, // is converted to a string\n title: 'Reminder',\n message: 'Dont forget to buy some flowers.',\n repeat: 'weekly',\n date: _60_seconds_from_now,\n foreground: 'foreground',\n background: 'background'\n});\n\nfunction foreground (id) {\n console.log('I WAS RUNNING ID='+id)\n}\n\nfunction background (id) {\n console.log('I WAS IN THE BACKGROUND ID='+id)\n}\n```\n#### Pop's up immediately\n```javascript\nwindow.plugin.notification.local.add({ message: 'Great app!' });\n```\n#### Plays no sound if the notification pop's up\n```javascript\nwindow.plugin.notification.local.add({ sound: null });\n```\n\n\n## Platform specifics\n### Notification icon on Android\nBy default all notifications will display the app icon. But an specific icon can be defined through the `icon` property.\n```javascript\n/**\n * Displays the <package.name>.R.drawable.ic_launcher icon\n */\nwindow.plugin.notification.local.add({ icon: 'ic_launcher' });\n\n/**\n * Displays the android.R.drawable.ic_dialog_email icon\n */\nwindow.plugin.notification.local.add({ icon: 'ic_dialog_email' });\n```\n\n### Notification sound on Android\nThe default sound is `RingtoneManager.TYPE_NOTIFICATION`. But an specific sound can be defined through the `sound` property.<br>\nThe sound must be a absolute or relative Uri pointing to the sound file.\n```javascript\n/**\n * Plays the sound if the notification pop's up\n */\nwindow.plugin.notification.local.add({ sound: 'res/sounds/beep.mp3' });\n\n/**\n * Plays the `RingtoneManager.TYPE_ALARM` sound\n */\nwindow.plugin.notification.local.add({ sound: 'TYPE_ALARM' });\n```\n\n### Notification sound on iOS\nThe sound must be located in your project's resources and must be a caf file.\n```javascript\n/**\n * Plays the sound if the notification pop's up\n */\nwindow.plugin.notification.local.add({ sound: 'sub.caf' });\n```\n**Note:** The right to play notification sounds in the notification center settings has to be granted.\n\n### LiveTile background images on WP8\nLiveTile's have the ability to display images for different sizes. These images can be defined through the `smallImage`, `image` and `wideImage` properties.<br>\nAn image must be defined as a relative or absolute URI.\n```javascript\n/**\n * Displays the application icon as the livetile's background image\n */\nwindow.plugin.notification.local.add({ image: 'appdata:ApplicationIcon.png' })\n```\nAll images can be restored to the default ones by canceling the notification.\n\n\n## Quirks\n### No sound is played on iOS 7\nThe right to play notification sounds in the notification center settings has to be granted.\n### Adding a notification on WP8\nAn application can only display one notification at a time. Each time a new notification has to be added, the application live tile's data will be overwritten by the new ones.\n\n### TypeError: Cannot read property 'currentVersion' of null\nAlong with Cordova 3.2 and Windows Phone 8 the `version.bat` script has to be renamed to `version`.\n\nOn Mac or Linux\n```\nmv platforms/wp8/cordova/version.bat platforms/wp8/cordova/version\n```\nOn Windows\n```\nren platforms\\wp8\\cordova\\version.bat platforms\\wp8\\cordova\\version\n```\n\n### App restarts on Android after notification was clicked\nThe launch mode for the main activity has to be set to `singleInstance`\n```xml\n<activity ... android:launchMode=\"singleInstance\" ... />\n```\n\n## Contributing\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create new Pull Request\n\n## License\n\nThis software is released under the [LGPL 2.1 License](http://opensource.org/licenses/LGPL-2.1).\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.local-notifications@0.6.1","dist":{"shasum":"460baef31487aa0c53700fd6621cafea6fdd6f22","tarball":"http://registry.cordova.io/de.appplant.cordova.plugin.local-notifications/-/de.appplant.cordova.plugin.local-notifications-0.6.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}]},"0.6.2":{"version":"0.6.2","name":"de.appplant.cordova.plugin.local-notifications","cordova_name":"LocalNotifications","description":"A bunch of local-notification plugins for Cordova 3.x.x","license":"Apache 2.0","keywords":["notification"," local notification"," alarm"," scheduler"," tile"," live tiles"," ios"," android"," windows phone 8"," wp8"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova LocalNotification-Plugin\n==================================\n\nA bunch of local notification plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**<br>\nSee [Local and Push Notification Programming Guide](http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/WhatAreRemoteNotif.html) for detailed informations and screenshots.\n\n- **Android** *(SDK >=11)*<br>\nSee [Notification Guide](http://developer.android.com/guide/topics/ui/notifiers/notifications.html) for detailed informations and screenshots.\n\n- **WP8**<br>\nSee [Local notifications for Windows Phone](http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207047.aspx) for detailed informations and screenshots.\n<br>*Windows Phone 8.0 has no notification center. Instead local notifications are realized through live tiles updates.*\n\n\n## Dependencies\nCordova will check all dependencies and install them if they are missing.\n- [org.apache.cordova.device](https://github.com/apache/cordova-plugin-device) *(since v0.6.0)*\n\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-local-notifications.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.local-notifications\n```\n\n## Release Notes\n#### Version 0.6.2 (04.12.2013)\n- Release under the Apache 2.0 license.\n\n#### Version 0.6.1 (04.12.2013)\n- Release under the LGPL 2.1 license.\n- [feature:] Sound can be specified on Android.\n- [enhancement:] Adding notifications on Android does not block the ui thread anymore.\n- [bugfix:] The app did stop/crash after removing them from recent apps list.\n- [enhancement:] Adding notifications on iOS does not block the ui thread anymore.\n- [bugfix:] Added missing `RECEIVE_BOOT_COMPLETED`permission on Android.\n- [enhancement:] Rework the code for Android. Thanks to ***samsara (samsarayg)***.\n- [bugfix:] `cancel` on iOS did not work do to wrong param type.\n- [enhancement:] `cancel` & `cancelAll` remove the notification(s) from notification center as well on Android.\n- [bugfix:] Missing background callback on Android.\n- [bugfix:] Android notification is not shown when the app is not running.\n\n#### Version 0.6.0 (16.11.2013)\n- Added WP8 support<br>\n *Based on the LiveTiles WP8 plugin made by* ***Jesse MacFadyen (purplecabbage)***\n- [enhancement:] The `add()` function now returns the id of the created notification.\n- [feature:] Added new `title` property.\n- [bugfix:] `cancel` on iOS did not work do to wrong dict key.\n- [enhancement:] All notifications on Android display the app icon by default.\n- [feature:] Icon can be specified on Android.\n\n#### Version 0.4.0 (06.10.2013)\n- Added Android support<br>\n *Based on the LocalNotifications Android plugin made by* ***Daniël (dvtoever)***\n\n#### Version 0.2.0 (11.08.2013)\n- Added iOS support<br>\n *Based on the LocalNotifications iOS plugin made by* ***Rodrigo Moyle***\n\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.notification.local``` with the following methods:\n\n### add()\nThe method allows to add a custom notification. It takes an hash as an argument to specify the notification's properties and returns the ID for the notification.<br>\nAll properties are optional. If no date object is given, the notification will pop-up immediately.\n\n```javascript\nwindow.plugin.notification.local.add({\n id: String, // a unique id of the notifiction\n date: Date, // this expects a date object\n message: String, // the message that is displayed\n title: String, // the title of the message\n repeat: String, // has the options of daily', 'weekly',''monthly','yearly')\n badge: Number, // displays number badge to notification\n sound: String, // a sound to be played (iOS & Android)\n foreground: String, // a javascript function to be called if the app is running\n background: String, // a javascript function to be called if the app is in the background\n});\n```\n\n### cancel()\nThe method cancels a notification which was previously added. It takes the ID of the notification as an argument.\n```javascript\nwindow.plugin.notification.local.cancel(__id__);\n```\n\n### cancelAll()\nThe method cancels all notifications which were previously added by the application.\n```javascript\nwindow.plugin.notification.local.cancelAll();\n```\n\n\n## Examples\n#### Will fire every week on this day, 60 seconds from now\n```javascript\nvar now = new Date().getTime(),\n _60_seconds_from_now = new Date(now + 60*1000);\n\nwindow.plugin.notification.local.add({\n id: 1, // is converted to a string\n title: 'Reminder',\n message: 'Dont forget to buy some flowers.',\n repeat: 'weekly',\n date: _60_seconds_from_now,\n foreground: 'foreground',\n background: 'background'\n});\n\nfunction foreground (id) {\n console.log('I WAS RUNNING ID='+id)\n}\n\nfunction background (id) {\n console.log('I WAS IN THE BACKGROUND ID='+id)\n}\n```\n#### Pop's up immediately\n```javascript\nwindow.plugin.notification.local.add({ message: 'Great app!' });\n```\n#### Plays no sound if the notification pop's up\n```javascript\nwindow.plugin.notification.local.add({ sound: null });\n```\n\n\n## Platform specifics\n### Notification icon on Android\nBy default all notifications will display the app icon. But an specific icon can be defined through the `icon` property.\n```javascript\n/**\n * Displays the <package.name>.R.drawable.ic_launcher icon\n */\nwindow.plugin.notification.local.add({ icon: 'ic_launcher' });\n\n/**\n * Displays the android.R.drawable.ic_dialog_email icon\n */\nwindow.plugin.notification.local.add({ icon: 'ic_dialog_email' });\n```\n\n### Notification sound on Android\nThe default sound is `RingtoneManager.TYPE_NOTIFICATION`. But an specific sound can be defined through the `sound` property.<br>\nThe sound must be a absolute or relative Uri pointing to the sound file.\n```javascript\n/**\n * Plays the sound if the notification pop's up\n */\nwindow.plugin.notification.local.add({ sound: 'res/sounds/beep.mp3' });\n\n/**\n * Plays the `RingtoneManager.TYPE_ALARM` sound\n */\nwindow.plugin.notification.local.add({ sound: 'TYPE_ALARM' });\n```\n\n### Notification sound on iOS\nThe sound must be located in your project's resources and must be a caf file.\n```javascript\n/**\n * Plays the sound if the notification pop's up\n */\nwindow.plugin.notification.local.add({ sound: 'sub.caf' });\n```\n**Note:** The right to play notification sounds in the notification center settings has to be granted.\n\n### LiveTile background images on WP8\nLiveTile's have the ability to display images for different sizes. These images can be defined through the `smallImage`, `image` and `wideImage` properties.<br>\nAn image must be defined as a relative or absolute URI.\n```javascript\n/**\n * Displays the application icon as the livetile's background image\n */\nwindow.plugin.notification.local.add({ image: 'appdata:ApplicationIcon.png' })\n```\nAll images can be restored to the default ones by canceling the notification.\n\n\n## Quirks\n### No sound is played on iOS 7\nThe right to play notification sounds in the notification center settings has to be granted.\n### Adding a notification on WP8\nAn application can only display one notification at a time. Each time a new notification has to be added, the application live tile's data will be overwritten by the new ones.\n\n### TypeError: Cannot read property 'currentVersion' of null\nAlong with Cordova 3.2 and Windows Phone 8 the `version.bat` script has to be renamed to `version`.\n\nOn Mac or Linux\n```\nmv platforms/wp8/cordova/version.bat platforms/wp8/cordova/version\n```\nOn Windows\n```\nren platforms\\wp8\\cordova\\version.bat platforms\\wp8\\cordova\\version\n```\n\n### App restarts on Android after notification was clicked\nThe launch mode for the main activity has to be set to `singleInstance`\n```xml\n<activity ... android:launchMode=\"singleInstance\" ... />\n```\n\n## Contributing\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create new Pull Request\n\n## License\n\nThis software is released under the [Apache 2.0 License](http://opensource.org/licenses/Apache-2.0).\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.local-notifications@0.6.2","dist":{"shasum":"f404855ba5df00e55e350c959d26dec51413f492","tarball":"http://registry.cordova.io/de.appplant.cordova.plugin.local-notifications/-/de.appplant.cordova.plugin.local-notifications-0.6.2.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}]}},"readme":"Cordova LocalNotification-Plugin\n==================================\n\nA bunch of local notification plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS**<br>\nSee [Local and Push Notification Programming Guide](http://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/WhatAreRemoteNotif.html) for detailed informations and screenshots.\n\n- **Android**<br>\nSee [Notification Guide](http://developer.android.com/guide/topics/ui/notifiers/notifications.html) for detailed informations and screenshots.\n\n- **WP8**<br>\nSee [Local notifications for Windows Phone](http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207047.aspx) for detailed informations and screenshots.\n<br>*Windows Phone 8.0 has no notification center. Instead local notifications are realized through live tiles updates.*\n\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin add https://github.com/katzer/cordova-plugin-local-notifications.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.local-notifications\n```\n\n## Release Notes\n#### Version 0.6.0 (16.11.2013)\n- Added WP8 support<br>\n *Based on the LiveTiles WP8 plugin made by* ***Jesse MacFadyen (purplecabbage)***\n- [enhancement:] The `add()` function now returns the id of the created notification.\n- [feature:] Added new `title` property.\n- [bugfix:] `cancel` under iOS did not work do to wrong dict key.\n- [enhancement:] All notifications under Android display the app icon by default.\n- [feature:] Icon can be specified under Android.\n\n#### Version 0.4.0 (06.10.2013)\n- Added Android support<br>\n *Based on the LocalNotifications Android plugin made by* ***Daniël (dvtoever)***\n\n#### Version 0.2.0 (11.08.2013)\n- Added iOS support<br>\n *Based on the LocalNotifications iOS plugin made by* ***Rodrigo Moyle***\n\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.notification.local``` with the following methods:\n\n### add()\nThe method allows to add a custom notification. It takes an hash as an argument to specify the notification's properties and returns the ID for the notification.<br>\nAll properties are optional. If no date object is given, the notification will pop-up immediately.\n\n```javascript\nwindow.plugin.notification.local.add({\n id: id, // a unique id of the notifiction\n date: date, // this expects a date object\n message: message, // the message that is displayed\n title: title, // the title of the message\n repeat: repeat, // has the options of daily', 'weekly',''monthly','yearly')\n badge: badge, // displays number badge to notification\n sound: sound // a sound to be played\n foreground: forground, // a javascript function to be called if the app is running\n background: background, // a javascript function to be called if the app is in the background\n});\n```\n\n### cancel()\nThe method cancels a notification which was previously added. It takes the ID of the notification as an argument.\n```javascript\nwindow.plugin.notification.local.cancel(__id__);\n```\n\n### cancelAll()\nThe method cancels all notifications which were previously added by the application.\n```javascript\nwindow.plugin.notification.local.cancelAll();\n```\n\n\n## Example\n```javascript\nvar now = new Date().getTime(),\n _60_seconds_from_now = new Date(now + 60*1000);\n\nwindow.plugin.notification.local.add({\n id: 1,\n date: _60_seconds_from_now,\n message: 'Hello world!',\n title: 'Check that out!',\n repeat: 'weekly', // will fire every week on this day\n foreground: 'foreground',\n background: 'background'\n});\n\nfunction foreground (id) {\n console.log('I WAS RUNNING ID='+id)\n}\n\nfunction background (id) {\n console.log('I WAS IN THE BACKGROUND ID='+id)\n}\n```\n\n\n## Quirks\n### How to specify the notification icon under Android\nBy default all notifications will display the app icon. But an specific icon can be defined through the `icon` property.\n```javascript\n/**\n * Displays the <package.name>.R.drawable.ic_launcher icon\n */\nwindow.plugin.notification.local.add({ icon: 'ic_launcher' });\n\n/**\n * Displays the android.R.drawable.ic_dialog_email icon\n */\nwindow.plugin.notification.local.add({ icon: 'ic_dialog_email' });\n```\n### Notification sound under iOS\nThe sound must be located in your project's resources and must be a caf file.\n```javascript\n/**\n * Plays the sound if the notification pop's up.\n */\nwindow.plugin.notification.local.add({ sound: 'sub.caf' });\n```\n\n### LiveTile background images under WP8\nLiveTile's have the ability to display images for different sizes. These images can be defined through the `smallImage`, `image` and `wideImage` properties.<br>\nAn image must be defined as a relative or absolute URI. All images will be reseted by canceling the notification.\n```javascript\n/**\n * Displays the application image as the livetile's background image\n */\nwindow.plugin.notification.local.add({ image: 'appdata:ApplicationImage.png' })\n```\n\n","maintainers":[{"name":"katzer","email":"katzer@appplant.de"}],"time":{"modified":"2013-12-04T17:03:06.709Z","created":"2013-11-16T14:02:10.412Z","0.6.0":"2013-11-16T14:02:11.816Z","0.6.1":"2013-12-04T16:49:39.931Z","0.6.2":"2013-12-04T17:03:06.709Z"},"_attachments":{"de.appplant.cordova.plugin.local-notifications-0.6.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-TiEMilTLeXZkq14tXxraXw==","length":16860,"stub":true},"de.appplant.cordova.plugin.local-notifications-0.6.1.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-VgKp1i/3PcaH2SJbqyejsg==","length":22119,"stub":true},"de.appplant.cordova.plugin.local-notifications-0.6.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-OKjhmiYP288y+RCJQtMVhQ==","length":17905,"stub":true}}}},
{"id":"de.appplant.cordova.plugin.printer","key":"de.appplant.cordova.plugin.printer","value":{"rev":"7-a0c5f6b24a1bd3af974cbd25f782fb70"},"doc":{"_id":"de.appplant.cordova.plugin.printer","_rev":"7-a0c5f6b24a1bd3af974cbd25f782fb70","name":"de.appplant.cordova.plugin.printer","description":"A bunch of printig plugins for Cordova 3.x.x","dist-tags":{"latest":"0.5.1"},"versions":{"0.4.0":{"version":"0.4.0","name":"de.appplant.cordova.plugin.printer","cordova_name":"Printer","description":"A bunch of printig plugins for Cordova 3.x.x","license":"GPL v2 License","keywords":["print"," printer"," ios"," android"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova Printer-Plugin\n======================\n\nA bunch of printing plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS** *(Print from iOS devices to AirPrint compatible printers)*<br>\nSee [Drawing and Printing Guide for iOS](http://developer.apple.com/library/ios/documentation/2ddrawing/conceptual/drawingprintingios/Printing/Printing.html) for detailed informations and screenshots.\n- **Android** *(Print through 3rd party printing apps)*\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n\n```bash\ncordova plugin add https://github.com/katzer/cordova-plugin-printer.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.printer\n```\n\n## Release Notes\n#### Version 0.4.0 (24.08.2013)\n- [feature]: Added Android support<br>\n *Based on the Print Android plugin made by* ***Eion Robb***\n- [feature]: `print()` accepts a 4th arguments for platform specific properties.\n- [change]: the callback of `print()` will be called with a result code about the user action.\n\n#### Version 0.2.1 (13.08.2013)\n- [feature]: Support for callback scopes.\n\n#### Version 0.2.0 (11.08.2013)\n- [feature]: Added iOS support<br>\n *Based on the Print iOS plugin made by* ***Randy McMillan***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.printer``` with two methods:\n\n### isServiceAvailable()\nPrinting is only available on devices capable of multi-tasking (iPhone 3GS, iPhone 4 etc.) running iOS 4.2 or later. You can use this function to hide print functionality from users who will be unable to use it.<br>\nFunction takes a callback function, passed to which is a boolean property. Optionally you can assign the scope in which the callback will be executed as a second parameter (default to *window*).\n\n```javascript\n/*\n * Find out if printing is available. Use this for showing/hiding print buttons.\n */\nwindow.plugin.printer.isServiceAvailable(\n function (isAvailable) {\n alert(isavailable ? 'Service is available' : 'Service NOT available');\n }\n);\n```\n\n**Android:** The callback function will be called with a second argument which is an array, indicating which printer apps are available for printing.\n\n```javascript\n/*\n * Find out if printing is available. Use this to find out which apps are available for printing.\n */\nwindow.plugin.printer.isServiceAvailable(\n function (isAvailable, installedAppIds) {\n alert('The following print apps are installed on your device: ' + installedAppIds.join(', '));\n }\n);\n```\n\n### print()\nFunction takes an html string and (optionally) a callback function. Optionally you can assign the scope in which the callback will be executed as a third parameter (default to *window*).\n\n```javascript\n// Get HTML string\nvar page = document.body.innerHTML;\n\n/*\n * Pass an HTML and - optionally - a callback function.\n */\nwindow.plugin.printer.print(page, function (code) {\n\tswitch (code) {\n\t case 0: // printing cancelled (cancel button pressed)\n\t case 2: // printed\n\t case 3: // printing failed\n\t case 4: // page not printed (something wrong happened e.g. service is not available)\n\t}\n}, this);\n```\n\n**Android:** An App-ID can be assigned as a platform configuration to indicate which 3rd party printing app shall be used. Otherwise the first found application will be used.\n\n```javascript\n/*\n * Pass an HTML and - optionally - a platform specific configuration.\n */\nwindow.plugin.printer.print(page, null, this, { appId: 'epson.print' });\n```\n\n## Quirks\n\n### Testing in the iOS Simulator\nThere's no need to waste lots of paper when testing - if you're using the iOS simulator, select File->Open Printer Simulator to open some dummy printers (print outs will appear as PDF files).\n\n### Adding Page Breaks to Printouts\nUse the 'page-break-before' property to specify a page break, e.g.\n\n```html\n<p>\nFirst page.\n</p>\n\n<p style=\"page-break-before: always\">\nSecond page.\n</p>\n```\n\nSee W3Schools for more more information: http://www.w3schools.com/cssref/pr_print_pagebb.asp\n\nNote: you will need to add an extra top margin to new pages.\n\n\n### Printing on Real Printers (iOS)\nPrinting is only supported on AirPrint-enabled printers or with the use of third-party software on your computer. The following pages contain more information:\n - AirPrint-enabled printers: http://www.apple.com/ipad/features/airprint.html\n - Enabling AirPrint on your computer: http://reviews.cnet.com/8301-19512_7-20023976-233.html, or http://www.ecamm.com/mac/printopia/\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.printer@0.4.0","dist":{"shasum":"8b6b1aa25b85a202e868a3d5d02101ab60aa845d","tarball":"http://registry.cordova.io/de.appplant.cordova.plugin.printer/-/de.appplant.cordova.plugin.printer-0.4.0.tgz"},"_from":"cordova-plugin-printer/","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}]},"0.5.0":{"version":"0.5.0","name":"de.appplant.cordova.plugin.printer","cordova_name":"Printer","description":"A bunch of printig plugins for Cordova 3.x.x","license":"Apache 2.0","keywords":["print"," printer"," ios"," android"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova Printer-Plugin\n======================\n\nA bunch of printing plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS** *(Print from iOS devices to AirPrint compatible printers)*<br>\nSee [Drawing and Printing Guide for iOS](http://developer.apple.com/library/ios/documentation/2ddrawing/conceptual/drawingprintingios/Printing/Printing.html) for detailed informations and screenshots.\n\n- **Android** *(Print through 3rd party printing apps on SDK <= 18)*\n\n## Dependencies\nCordova will check all dependencies and install them if they are missing.\n- [org.apache.cordova.device](https://github.com/apache/cordova-plugin-device) *(since v0.5.0)*\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n\n```bash\ncordova plugin add https://github.com/katzer/cordova-plugin-printer.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.printer\n```\n\n## Release Notes\n#### Version 0.5.0 (11.12.2013)\n- Release under the Apache 2.0 license.\n- [***change:***] Removed the `callback` property from the `print` interface.\n- [enhancement:] Added Android KitKat support<br>\n *Based on the Print Android plugin made by* ***Eion Robb***\n\n#### Version 0.4.0 (24.08.2013)\n- [feature]: Added Android support<br>\n *Based on the Print Android plugin made by* ***Eion Robb***\n- [feature]: `print()` accepts a 4th arguments for platform specific properties.\n- [change]: the callback of `print()` will be called with a result code about the user action.\n\n#### Version 0.2.1 (13.08.2013)\n- [feature]: Support for callback scopes.\n\n#### Version 0.2.0 (11.08.2013)\n- [feature]: Added iOS support<br>\n *Based on the Print iOS plugin made by* ***Randy McMillan***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.printer``` with two methods:\n\n### isServiceAvailable()\nPrinting is only available on devices capable of multi-tasking (iPhone 3GS, iPhone 4 etc.) running iOS 4.2 or later. You can use this function to hide print functionality from users who will be unable to use it.<br>\nFunction takes a callback function, passed to which is a boolean property. Optionally you can assign the scope in which the callback will be executed as a second parameter (default to *window*).\n\n```javascript\n/*\n * Find out if printing is available. Use this for showing/hiding print buttons.\n */\nwindow.plugin.printer.isServiceAvailable(\n function (isAvailable) {\n alert(isAvailable ? 'Service is available' : 'Service NOT available');\n }\n);\n```\n\n### print()\nFunction takes an html string.\n\n**Note:** All required CSS rules needs to be included as well.\n\n```javascript\n// Get HTML string\nvar page = document.body.innerHTML;\n\n// Pass the HTML\nwindow.plugin.printer.print(page);\n```\n\n## Platform specifics\n\n### Get all available printing apps on Android <= 4.3\nThe callback function will be called with a second argument which is an array, indicating which printer apps are available for printing.\n```javascript\nwindow.plugin.printer.isServiceAvailable(\n function (isAvailable, installedAppIds) {\n alert('The following print apps are installed on your device: ' + installedAppIds.join(', '));\n }\n);\n```\n\n### Specify printing app on Android <= 4.3\nAn App-ID can be assigned as a platform configuration to indicate which 3rd party printing app shall be used. Otherwise the first found application will be used.\n```javascript\nwindow.plugin.printer.print(page, { appId: 'epson.print' });\n```\n\n## Quirks\n\n### Testing in the iOS Simulator\nThere's no need to waste lots of paper when testing - if you're using the iOS simulator, select File->Open Printer Simulator to open some dummy printers (print outs will appear as PDF files).\n\n### Adding Page Breaks to Printouts\nUse the 'page-break-before' property to specify a page break, e.g.\n\n```html\n<p>\nFirst page.\n</p>\n\n<p style=\"page-break-before: always\">\nSecond page.\n</p>\n```\n\nSee W3Schools for more more information: http://www.w3schools.com/cssref/pr_print_pagebb.asp\n\nNote: you will need to add an extra top margin to new pages.\n\n\n### Printing on Real Printers (iOS)\nPrinting is only supported on AirPrint-enabled printers or with the use of third-party software on your computer. The following pages contain more information:\n - AirPrint-enabled printers: http://www.apple.com/ipad/features/airprint.html\n - Enabling AirPrint on your computer: http://reviews.cnet.com/8301-19512_7-20023976-233.html, or http://www.ecamm.com/mac/printopia/\n\n## Contributing\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create new Pull Request\n\n## License\n\nThis software is released under the [Apache 2.0 License](http://opensource.org/licenses/Apache-2.0).\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.printer@0.5.0","dist":{"shasum":"7b40106c950fff2dd446fc3c1f4ac43ea4f3dd92","tarball":"http://registry.cordova.io/de.appplant.cordova.plugin.printer/-/de.appplant.cordova.plugin.printer-0.5.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}]},"0.5.1":{"version":"0.5.1","name":"de.appplant.cordova.plugin.printer","cordova_name":"Printer","description":"A bunch of printig plugins for Cordova 3.x.x","license":"Apache 2.0","keywords":["print"," printer"," ios"," android"],"engines":[{"name":"cordova","version":">=3.0.0"}],"readme":"Cordova Printer-Plugin\n======================\n\nA bunch of printing plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS** *(Print from iOS devices to AirPrint compatible printers)*<br>\nSee [Drawing and Printing Guide for iOS](http://developer.apple.com/library/ios/documentation/2ddrawing/conceptual/drawingprintingios/Printing/Printing.html) for detailed informations and screenshots.\n\n- **Android** *(Print through 3rd party printing apps)*\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n\n```bash\ncordova plugin add https://github.com/katzer/cordova-plugin-printer.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.printer\n```\n\n## Release Notes\n#### Version 0.5.1 (15.12.2013)\n- Removed Android KitKat support *(See kitkat branch)*\n\n#### Version 0.5.0 (yanked)\n- Release under the Apache 2.0 license.\n- [***change:***] Removed the `callback` property from the `print` interface.\n- [enhancement:] Added Android KitKat support<br>\n *Based on the Print Android plugin made by* ***Eion Robb***\n\n#### Version 0.4.0 (24.08.2013)\n- [feature]: Added Android support<br>\n *Based on the Print Android plugin made by* ***Eion Robb***\n- [feature]: `print()` accepts a 4th arguments for platform specific properties.\n- [change]: the callback of `print()` will be called with a result code about the user action.\n\n#### Version 0.2.1 (13.08.2013)\n- [feature]: Support for callback scopes.\n\n#### Version 0.2.0 (11.08.2013)\n- [feature]: Added iOS support<br>\n *Based on the Print iOS plugin made by* ***Randy McMillan***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.printer``` with two methods:\n\n### isServiceAvailable()\nPrinting is only available on devices capable of multi-tasking (iPhone 3GS, iPhone 4 etc.) running iOS 4.2 or later. You can use this function to hide print functionality from users who will be unable to use it.<br>\nFunction takes a callback function, passed to which is a boolean property. Optionally you can assign the scope in which the callback will be executed as a second parameter (default to *window*).\n\n```javascript\n/*\n * Find out if printing is available. Use this for showing/hiding print buttons.\n */\nwindow.plugin.printer.isServiceAvailable(\n function (isAvailable) {\n alert(isAvailable ? 'Service is available' : 'Service NOT available');\n }\n);\n```\n\n### print()\nFunction takes an html string.\n\n**Note:** All required CSS rules needs to be included as well.\n\n```javascript\n// Get HTML string\nvar page = document.body.innerHTML;\n\n// Pass the HTML\nwindow.plugin.printer.print(page);\n```\n\n## Platform specifics\n\n### Get all available printing apps on Android\nThe callback function will be called with a second argument which is an array, indicating which printer apps are available for printing.\n```javascript\nwindow.plugin.printer.isServiceAvailable(\n function (isAvailable, installedAppIds) {\n alert('The following print apps are installed on your device: ' + installedAppIds.join(', '));\n }\n);\n```\n\n### Specify printing app on Android\nAn App-ID can be assigned as a platform configuration to indicate which 3rd party printing app shall be used. Otherwise the first found application will be used.\n```javascript\nwindow.plugin.printer.print(page, { appId: 'epson.print' });\n```\n\n## Quirks\n\n### Testing in the iOS Simulator\nThere's no need to waste lots of paper when testing - if you're using the iOS simulator, select File->Open Printer Simulator to open some dummy printers (print outs will appear as PDF files).\n\n### Adding Page Breaks to Printouts\nUse the 'page-break-before' property to specify a page break, e.g.\n\n```html\n<p>\nFirst page.\n</p>\n\n<p style=\"page-break-before: always\">\nSecond page.\n</p>\n```\n\nSee W3Schools for more more information: http://www.w3schools.com/cssref/pr_print_pagebb.asp\n\nNote: you will need to add an extra top margin to new pages.\n\n\n### Printing on Real Printers (iOS)\nPrinting is only supported on AirPrint-enabled printers or with the use of third-party software on your computer. The following pages contain more information:\n - AirPrint-enabled printers: http://www.apple.com/ipad/features/airprint.html\n - Enabling AirPrint on your computer: http://reviews.cnet.com/8301-19512_7-20023976-233.html, or http://www.ecamm.com/mac/printopia/\n\n## Contributing\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create new Pull Request\n\n## License\n\nThis software is released under the [Apache 2.0 License](http://opensource.org/licenses/Apache-2.0).\n","readmeFilename":"README.md","_id":"de.appplant.cordova.plugin.printer@0.5.1","dist":{"shasum":"9c411ee69395a17eb4bad0505b9dfe66a4380522","tarball":"http://registry.cordova.io/de.appplant.cordova.plugin.printer/-/de.appplant.cordova.plugin.printer-0.5.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"katzer","email":"katzer@appplant.de"},"maintainers":[{"name":"katzer","email":"katzer@appplant.de"}]}},"readme":"Cordova Printer-Plugin\n======================\n\nA bunch of printing plugins for Cordova 3.x.x\n\nby Sebastián Katzer ([github.com/katzer](https://github.com/katzer))\n\n## Supported Platforms\n- **iOS** *(Print from iOS devices to AirPrint compatible printers)*<br>\nSee [Drawing and Printing Guide for iOS](http://developer.apple.com/library/ios/documentation/2ddrawing/conceptual/drawingprintingios/Printing/Printing.html) for detailed informations and screenshots.\n- **Android** *(Print through 3rd party printing apps)*\n\n## Adding the Plugin to your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n\n```bash\ncordova plugin add https://github.com/katzer/cordova-plugin-printer.git\n```\n\n## Removing the Plugin from your project\nThrough the [Command-line Interface](http://cordova.apache.org/docs/en/3.0.0/guide_cli_index.md.html#The%20Command-line%20Interface):\n```\ncordova plugin rm de.appplant.cordova.plugin.printer\n```\n\n## Release Notes\n#### Version 0.4.0 (24.08.2013)\n- [feature]: Added Android support<br>\n *Based on the Print Android plugin made by* ***Eion Robb***\n- [feature]: `print()` accepts a 4th arguments for platform specific properties.\n- [change]: the callback of `print()` will be called with a result code about the user action.\n\n#### Version 0.2.1 (13.08.2013)\n- [feature]: Support for callback scopes.\n\n#### Version 0.2.0 (11.08.2013)\n- [feature]: Added iOS support<br>\n *Based on the Print iOS plugin made by* ***Randy McMillan***\n\n## Using the plugin\nThe plugin creates the object ```window.plugin.printer``` with two methods:\n\n### isServiceAvailable()\nPrinting is only available on devices capable of multi-tasking (iPhone 3GS, iPhone 4 etc.) running iOS 4.2 or later. You can use this function to hide print functionality from users who will be unable to use it.<br>\nFunction takes a callback function, passed to which is a boolean property. Optionally you can assign the scope in which the callback will be executed as a second parameter (default to *window*).\n\n```javascript\n/*\n * Find out if printing is available. Use this for showing/hiding print buttons.\n */\nwindow.plugin.printer.isServiceAvailable(\n function (isAvailable) {\n alert(isavailable ? 'Service is available' : 'Service NOT available');\n }\n);\n```\n\n**Android:** The callback function will be called with a second argument which is an array, indicating which printer apps are available for printing.\n\n```javascript\n/*\n * Find out if printing is available. Use this to find out which apps are available for printing.\n */\nwindow.plugin.printer.isServiceAvailable(\n function (isAvailable, installedAppIds) {\n alert('The following print apps are installed on your device: ' + installedAppIds.join(', '));\n }\n);\n```\n\n### print()\nFunction takes an html string and (optionally) a callback function. Optionally you can assign the scope in which the callback will be executed as a third parameter (default to *window*).\n\n```javascript\n// Get HTML string\nvar page = document.body.innerHTML;\n\n/*\n * Pass an HTML and - optionally - a callback function.\n */\nwindow.plugin.printer.print(page, function (code) {\n\tswitch (code) {\n\t case 0: // printing cancelled (cancel button pressed)\n\t case 2: // printed\n\t case 3: // printing failed\n\t case 4: // page not printed (something wrong happened e.g. service is not available)\n\t}\n}, this);\n```\n\n**Android:** An App-ID can be assigned as a platform configuration to indicate which 3rd party printing app shall be used. Otherwise the first found application will be used.\n\n```javascript\n/*\n * Pass an HTML and - optionally - a platform specific configuration.\n */\nwindow.plugin.printer.print(page, null, this, { appId: 'epson.print' });\n```\n\n## Quirks\n\n### Testing in the iOS Simulator\nThere's no need to waste lots of paper when testing - if you're using the iOS simulator, select File->Open Printer Simulator to open some dummy printers (print outs will appear as PDF files).\n\n### Adding Page Breaks to Printouts\nUse the 'page-break-before' property to specify a page break, e.g.\n\n```html\n<p>\nFirst page.\n</p>\n\n<p style=\"page-break-before: always\">\nSecond page.\n</p>\n```\n\nSee W3Schools for more more information: http://www.w3schools.com/cssref/pr_print_pagebb.asp\n\nNote: you will need to add an extra top margin to new pages.\n\n\n### Printing on Real Printers (iOS)\nPrinting is only supported on AirPrint-enabled printers or with the use of third-party software on your computer. The following pages contain more information:\n - AirPrint-enabled printers: http://www.apple.com/ipad/features/airprint.html\n - Enabling AirPrint on your computer: http://reviews.cnet.com/8301-19512_7-20023976-233.html, or http://www.ecamm.com/mac/printopia/\n","maintainers":[{"name":"katzer","email":"katzer@appplant.de"}],"time":{"modified":"2013-12-15T10:16:38.692Z","created":"2013-10-29T15:23:00.849Z","0.4.0":"2013-10-29T15:23:02.188Z","0.5.0":"2013-12-11T14:53:52.471Z","0.5.1":"2013-12-15T10:16:38.692Z"},"_attachments":{"de.appplant.cordova.plugin.printer-0.5.1.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-aHLL4p43y3lxT045gG32SA==","length":11831,"stub":true},"de.appplant.cordova.plugin.printer-0.5.0.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-wm5/c2s+3V0glz79d3XB6g==","length":12510,"stub":true},"de.appplant.cordova.plugin.printer-0.4.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-G0RFd+I14mK4RgIrLbFh/Q==","length":14529,"stub":true}}}},
{"id":"emailcomposer","key":"emailcomposer","value":{"rev":"7-1fa154e9d793dedafc4cf9f41871a4a9"},"doc":{"_id":"emailcomposer","_rev":"7-1fa154e9d793dedafc4cf9f41871a4a9","name":"emailcomposer","description":"\n A Cordova plugin for composing new e-mail messages on iOS devices. \n Supports HTML formatted messages and file attachments.\n ","dist-tags":{"latest":"2.0.2"},"versions":{"2.0.0":{"version":"2.0.0","name":"emailcomposer","description":"\n A Cordova plugin for composing new e-mail messages on iOS devices. \n Supports HTML formatted messages and file attachments.\n ","license":"The MIT License (MIT)","readme":"Cordova EmailComposer Plugin for iOS\n-------------------------------------\n\nA Cordova plugin for iOS devices to create e-mail messages via Apple's Mail.app compose view.\n\n### Requirements\n* Supports Cordova 2.7 and higher;\n* Tested against Cordova 3.0;\n* Cordova <2.7 support is possible with manual editing of the plist/config settings for plugins and optionally enabling ARC\n\n### Installation\n\nThe easy way via the cordova-cli:\n\n sudo npm install -g cordova\n cordova create ~/MyApp MyApp\n cd ~/MyApp\n cordova platform add ios\n cordova plugin add emailcomposer # using the http://plugins.cordova.io registry\n cordova build\n\n\nThe hard way via manual labor:\n\n* Add MessageUI.framework to your project\n* Add EmailComposer.h, EmailComposer.m, NSData+Base64.h, and NSData+Base64.m to your project\n* Copy the EmailComposer.js file to your www directory\n* Include EmailComposer.js as a `<script>` in your html page\n* Modify the `Cordova.plist` Plugins section to include: key EmailComposer value EmailComposer\n\n\n### Example Implementation\n\nAn example of using this plugin will be copied by the cordova-cli to your Xcode project\nas `www/examples/EmailComposer.html`. The example depends on some of the files used by\nthe Cordova Hello, World example. Add an href like below to your `www/index.html` source\nto view the example within your app.\n\n <a href=\"examples/EmailComposer.html\">Email Composer</a>\n\n\n### Usage\n\nUsing `cordova.require`:\n\n var emailComposer = cordova.require('emailcomposer.EmailComposer')\n\n /* alternatively exists in global scope as EmailComposer if you embed via a script tag */\n\n emailComposer.show({ \n to: 'to@example.com',\n cc: 'cc@example.com',\n bcc: 'bcc@example.com',\n subject: 'Example email message',\n body: '<h1>Hello, world!</h1>',\n isHtml: true,\n attachments: [\n // attach a HTML file using a UTF-8 encoded string\n {\n mimeType: 'text/html',\n encoding: 'UTF-8',\n data: '<html><body><h1>Hello, World!</h1></body></html>',\n name: 'demo.html'\n },\n // attach a base-64 encoded veresion of of http://cordova.apache.org/favicon.ico\n {\n mimeType: 'text/png',\n encoding: 'Base64',\n data: 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS4xLjIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjE8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K5JKPKQAAAtpJREFUOBFNU0toE1EUPTOZTJI2qbG0qUnwg1IFtSBI967cCBHcSsGFgktdC125EvwVLKi0FApaCChuRMSFqAitCNrGJE1DadpSYz5OvpPJ5Od5007xwc1998475513743U6/Uk7K1Op6O0Wq2pdrvt597odrugh/A0hcdk+luhUKhgY0Ryf5HsmizLNz0eN9qtNvRGA8xBdTohyxJjQ8TrBEzaIOk/BQNk3+YHL1WAKiyguL1Wr1tK3C6XteeZ01SRFCSy+Nlb07zdG0umcPvOXTyde8lbZbjcbjyYnsG5CxG8fvsBBJKs+8wG2QouMvFOJB9Mz+JnLA6P24UBnxcNo4nk2jpiiVWEQ2G8j87ApSqo643rgUBg1lJgGMaUAK/EkyhVaxg7eQLhoUEoThX9JBk54MVh/wDSm1uYj75Bv9eHRqNxL5PJTFpF1DRN8fX3oVKp4GhwGB6/H50eoO3sIBgYRpdvr/v8cCeS8KgOFHNZZLNZlfVTLQWKoixDkuElyeLXJdT7vGiHw/j+7QdezC9gCw6MX76Ezx+/QJYkVKiShU6y0MuWAjKlzJYJp+JAIZdDJl+AT3ZgM7OJYqGA4Jkx/C5X4XEpvMSDaq0K0zRTAmcRkCnZZutEm4p6A3MPn8Ahel/SoJstbEVf4dNCFIPBQ/ByRqpU0Gw2UyzbhkVAOSkywuGQMT5+HgOsuEtRIJ06jl63B4nqmuzGwZEAnE7FIhCYSCRSsggIXmcnxLtw4+oViNluc4Q7HCbbi4ES34tayRoyHknTdgdpdHQ0S4KcUJBKrdXuP3q8XGZH/uTzyOXyKJXLeD4zF1uJr2ZFnfh26Lq+sU8gSZJaLpfTBmWyQLWlxaWczlpoWskk2GzyefH4r7+JRGKHZ4WS9MTEREUQWJPIpJv7Y7SztCM0EYvV3XX7I28w3qbFaBtUotsEKhN+2hCtjybmwwZzay07pzMSf+cSCcx/K8WXLZEV/swAAAAASUVORK5CYII=',\n name: 'cordova.png'\n }\n // attach a file using a hypothetical file path\n //,{ filePath: './path/to/your-file.jpg' }\n ],\n onSuccess: function (winParam) { \n console.log('EmailComposer onSuccess - return code ' + winParam.toString());\n },\n onError: function (error) {\n console.log('EmailComposer onError - ' + error.toString());\n }\n });\n\n\n### Deprecated Usage / Backwards Compatability\n\nFor backwards compatability with version 1.x of this plugin and the EmailComposerWithAttachments plug,\nthe following methods are avaialble on the window.plugins global object when\nembedding both `EmailComposer.js` and `EmailComposer-Deprecated.js`\n\n <script src=\"EmailComposer.js\" />\n <script src=\"EmailComposer-Deprecated.js\" />\n <script>\n // TODO: handle device.ready and declare/assign subject, body, toRecipients, etc.\n\n window.plugins.emailComposer.showEmailComposer(subject, body, toRecipients, ccRecipients, bccRecipients, isHTML, attachments);\n\n window.plugins.emailComposer.showEmailComposerWithCallback(callback, subject, body, toRecipients, ccRecipients, bccRecipients, isHTML, attachments);\n\n // ... \n </script>\n\n\n### Credits\n\n - Created by Jesse MacFadyen on October 2005\n - Added Cordova 1.5 support by @RandyMcMillan on March 2012\n - Added support for optional file attachments by @steve-jansen on October 2012\n - Upgraded to the Cordova 2.1 `void:(CDVInvokedUrlCommand*)` signature by @steve-jansen on November 2012\n - Uses the outstanding NSData+Base64 implementation by Matt Gallagher on 2009/06/03\n - Integrated Guido Sabatini's detection of mime type for file attachments that use a file system path by @steve-jansen on June 2013\n\n\n### Reporting Bugs / Request Features\n\nPlease create a GitHub issue to report a bug or request a feature @ https://github.com/steve-jansen/cordova-ios-emailcomposer/issues\n\n\n### Contributing\n\nI have yet to find a good workflow for running/testing changes to the plugin.\n\nMy less than ideal way today is to recreate a \"Hello, World\" Cordova project with\nmy plugin via:\n\n sudo npm install -g cordova\n ./develop.sh\n\nThe `develop.sh` shell script will use the cordova-cli to create a new project and add this plugin\nto it. It will then open the \"HelloCordova\" project in Xcode. You can optionally symlink\nthe .m and .h plugin files, however, this can have side effects with commands like `git clean -fdx`.\nIt is not possible to symlink the \n\nJavaScript unit tests are run by opening [spec/spec.html](spec/spec.html) in Safari or Chrome\n\nObjective-C unit tests require a faily complex setup process,\ndocumented in [spec/ios/README.md](spec/ios/README.md).\n","readmeFilename":"README.md","_id":"emailcomposer@2.0.0","dist":{"shasum":"baefebc12172a700be6929f938a3674ce9f0b46c","tarball":"http://registry.cordova.io/emailcomposer/-/emailcomposer-2.0.0.tgz"},"_from":"./cordova-ios-emailcomposer/","_npmVersion":"1.3.4","_npmUser":{"name":"steve-jansen","email":"stevejansen_github@icloud.com"},"maintainers":[{"name":"steve-jansen","email":"stevejansen_github@icloud.com"}]},"2.0.1":{"version":"2.0.1","name":"emailcomposer","description":"\n A Cordova plugin for composing new e-mail messages on iOS devices. \n Supports HTML formatted messages and file attachments.\n ","license":"The MIT License (MIT)","readme":"Cordova EmailComposer Plugin for iOS\n-------------------------------------\n\nA Cordova plugin for iOS devices to create e-mail messages via Apple's Mail.app compose view.\n\n### Requirements\n* Supports Cordova 2.7 and higher;\n* Tested against Cordova 3.0;\n* Cordova <2.7 support is possible with manual editing of the plist/config settings for plugins and optionally enabling ARC\n\n### Installation\n\nThe easy way via the cordova-cli:\n\n sudo npm install -g cordova\n cordova create ~/MyApp MyApp\n cd ~/MyApp\n cordova platform add ios\n cordova plugin add emailcomposer # using the http://plugins.cordova.io registry\n cordova build\n\n\nThe hard way via manual labor:\n\n* Add MessageUI.framework to your project\n* Add EmailComposer.h, EmailComposer.m, NSData+Base64.h, and NSData+Base64.m to your project\n* Copy the EmailComposer.js file to your www directory\n* Include EmailComposer.js as a `<script>` in your html page\n* Modify the `Cordova.plist` Plugins section to include: key EmailComposer value EmailComposer\n\n\n### Example Implementation\n\nAn example of using this plugin will be copied by the cordova-cli to your Xcode project\nas `www/examples/EmailComposer.html`. The example depends on some of the files used by\nthe Cordova Hello, World example. Add an href like below to your `www/index.html` source\nto view the example within your app.\n\n <a href=\"examples/EmailComposer.html\">Email Composer</a>\n\n\n### Usage\n\nUsing `cordova.require`:\n\n var emailComposer = cordova.require('emailcomposer.EmailComposer')\n\n /* alternatively exists in global scope as EmailComposer if you embed via a script tag */\n\n emailComposer.show({ \n to: 'to@example.com',\n cc: 'cc@example.com',\n bcc: 'bcc@example.com',\n subject: 'Example email message',\n body: '<h1>Hello, world!</h1>',\n isHtml: true,\n attachments: [\n // attach a HTML file using a UTF-8 encoded string\n {\n mimeType: 'text/html',\n encoding: 'UTF-8',\n data: '<html><body><h1>Hello, World!</h1></body></html>',\n name: 'demo.html'\n },\n // attach a base-64 encoded veresion of of http://cordova.apache.org/favicon.ico\n {\n mimeType: 'text/png',\n encoding: 'Base64',\n data: 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS4xLjIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjE8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K5JKPKQAAAtpJREFUOBFNU0toE1EUPTOZTJI2qbG0qUnwg1IFtSBI967cCBHcSsGFgktdC125EvwVLKi0FApaCChuRMSFqAitCNrGJE1DadpSYz5OvpPJ5Od5007xwc1998475513743U6/Uk7K1Op6O0Wq2pdrvt597odrugh/A0hcdk+luhUKhgY0Ryf5HsmizLNz0eN9qtNvRGA8xBdTohyxJjQ8TrBEzaIOk/BQNk3+YHL1WAKiyguL1Wr1tK3C6XteeZ01SRFCSy+Nlb07zdG0umcPvOXTyde8lbZbjcbjyYnsG5CxG8fvsBBJKs+8wG2QouMvFOJB9Mz+JnLA6P24UBnxcNo4nk2jpiiVWEQ2G8j87ApSqo643rgUBg1lJgGMaUAK/EkyhVaxg7eQLhoUEoThX9JBk54MVh/wDSm1uYj75Bv9eHRqNxL5PJTFpF1DRN8fX3oVKp4GhwGB6/H50eoO3sIBgYRpdvr/v8cCeS8KgOFHNZZLNZlfVTLQWKoixDkuElyeLXJdT7vGiHw/j+7QdezC9gCw6MX76Ezx+/QJYkVKiShU6y0MuWAjKlzJYJp+JAIZdDJl+AT3ZgM7OJYqGA4Jkx/C5X4XEpvMSDaq0K0zRTAmcRkCnZZutEm4p6A3MPn8Ahel/SoJstbEVf4dNCFIPBQ/ByRqpU0Gw2UyzbhkVAOSkywuGQMT5+HgOsuEtRIJ06jl63B4nqmuzGwZEAnE7FIhCYSCRSsggIXmcnxLtw4+oViNluc4Q7HCbbi4ES34tayRoyHknTdgdpdHQ0S4KcUJBKrdXuP3q8XGZH/uTzyOXyKJXLeD4zF1uJr2ZFnfh26Lq+sU8gSZJaLpfTBmWyQLWlxaWczlpoWskk2GzyefH4r7+JRGKHZ4WS9MTEREUQWJPIpJv7Y7SztCM0EYvV3XX7I28w3qbFaBtUotsEKhN+2hCtjybmwwZzay07pzMSf+cSCcx/K8WXLZEV/swAAAAASUVORK5CYII=',\n name: 'cordova.png'\n }\n // attach a file using a hypothetical file path\n //,{ filePath: './path/to/your-file.jpg' }\n ],\n onSuccess: function (winParam) { \n console.log('EmailComposer onSuccess - return code ' + winParam.toString());\n },\n onError: function (error) {\n console.log('EmailComposer onError - ' + error.toString());\n }\n });\n\n\n### Deprecated Usage / Backwards Compatability\n\nFor backwards compatability with version 1.x of this plugin and the EmailComposerWithAttachments plug,\nthe following methods are avaialble on the window.plugins global object when\nembedding both `EmailComposer.js` and `EmailComposer-Deprecated.js`\n\n <script src=\"EmailComposer.js\" />\n <script src=\"EmailComposer-Deprecated.js\" />\n <script>\n // TODO: handle device.ready and declare/assign subject, body, toRecipients, etc.\n\n window.plugins.emailComposer.showEmailComposer(subject, body, toRecipients, ccRecipients, bccRecipients, isHTML, attachments);\n\n window.plugins.emailComposer.showEmailComposerWithCallback(callback, subject, body, toRecipients, ccRecipients, bccRecipients, isHTML, attachments);\n\n // ... \n </script>\n\n\n### Credits\n\n - Created by Jesse MacFadyen on October 2005\n - Added Cordova 1.5 support by @RandyMcMillan on March 2012\n - Added support for optional file attachments by @steve-jansen on October 2012\n - Upgraded to the Cordova 2.1 `void:(CDVInvokedUrlCommand*)` signature by @steve-jansen on November 2012\n - Uses the outstanding NSData+Base64 implementation by Matt Gallagher on 2009/06/03\n - Integrated Guido Sabatini's detection of mime type for file attachments that use a file system path by @steve-jansen on June 2013\n\n\n### Reporting Bugs / Request Features\n\nPlease create a GitHub issue to report a bug or request a feature @ https://github.com/steve-jansen/cordova-ios-emailcomposer/issues\n\n\n### Contributing\n\nI have yet to find a good workflow for running/testing changes to the plugin.\n\nMy less than ideal way today is to recreate a \"Hello, World\" Cordova project with\nmy plugin via:\n\n sudo npm install -g cordova\n ./develop.sh\n\nThe `develop.sh` shell script will use the cordova-cli to create a new project and add this plugin\nto it. It will then open the \"HelloCordova\" project in Xcode. You can optionally symlink\nthe .m and .h plugin files, however, this can have side effects with commands like `git clean -fdx`.\nIt is not possible to symlink the \n\nJavaScript unit tests are run by opening [spec/spec.html](spec/spec.html) in Safari or Chrome\n\nObjective-C unit tests require a faily complex setup process,\ndocumented in [spec/ios/README.md](spec/ios/README.md).\n","readmeFilename":"README.md","_id":"emailcomposer@2.0.1","dist":{"shasum":"f36ac178d4348a3f3c3f7d0a8ce830063c83f34d","tarball":"http://registry.cordova.io/emailcomposer/-/emailcomposer-2.0.1.tgz"},"_from":"./cordova-ios-emailcomposer/","_npmVersion":"1.3.4","_npmUser":{"name":"steve-jansen","email":"stevejansen_github@icloud.com"},"maintainers":[{"name":"steve-jansen","email":"stevejansen_github@icloud.com"}]},"2.0.2":{"version":"2.0.2","name":"emailcomposer","description":"\n A Cordova plugin for composing new e-mail messages on iOS devices. \n Supports HTML formatted messages and file attachments.\n ","license":"The MIT License (MIT)","readme":"Cordova EmailComposer Plugin for iOS\n-------------------------------------\n\nA Cordova plugin for iOS devices to create e-mail messages via Apple's Mail.app compose view.\n\n### Requirements\n* Supports Cordova 2.7 and higher;\n* Tested against Cordova 3.0;\n* Cordova <2.7 support is possible with manual editing of the plist/config settings for plugins and optionally enabling ARC\n\n### Installation\n\nThe easy way via the cordova-cli:\n\n sudo npm install -g cordova\n cordova create ~/MyApp MyApp\n cd ~/MyApp\n cordova platform add ios\n cordova plugin add emailcomposer # using the http://plugins.cordova.io registry\n cordova build\n\n\nThe hard way via manual labor:\n\n* Add MessageUI.framework to your project\n* Add EmailComposer.h, EmailComposer.m, NSData+Base64.h, and NSData+Base64.m to your project\n* Copy the EmailComposer.js file to your www directory\n* Include EmailComposer.js as a `<script>` in your html page\n* Modify the `Cordova.plist` Plugins section to include: key EmailComposer value EmailComposer\n\n\n### Example Implementation\n\nAn example of using this plugin will be copied by the cordova-cli to your Xcode project\nas `www/examples/EmailComposer.html`. The example depends on some of the files used by\nthe Cordova Hello, World example. Add an href like below to your `www/index.html` source\nto view the example within your app.\n\n <a href=\"examples/EmailComposer.html\">Email Composer</a>\n\n\n### Usage\n\nUsing `cordova.require`:\n\n var emailComposer = cordova.require('emailcomposer.EmailComposer')\n\n /* alternatively exists in global scope as EmailComposer if you embed via a script tag */\n\n emailComposer.show({ \n to: 'to@example.com',\n cc: 'cc@example.com',\n bcc: 'bcc@example.com',\n subject: 'Example email message',\n body: '<h1>Hello, world!</h1>',\n isHtml: true,\n attachments: [\n // attach a HTML file using a UTF-8 encoded string\n {\n mimeType: 'text/html',\n encoding: 'UTF-8',\n data: '<html><body><h1>Hello, World!</h1></body></html>',\n name: 'demo.html'\n },\n // attach a base-64 encoded veresion of of http://cordova.apache.org/favicon.ico\n {\n mimeType: 'text/png',\n encoding: 'Base64',\n data: 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS4xLjIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjE8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K5JKPKQAAAtpJREFUOBFNU0toE1EUPTOZTJI2qbG0qUnwg1IFtSBI967cCBHcSsGFgktdC125EvwVLKi0FApaCChuRMSFqAitCNrGJE1DadpSYz5OvpPJ5Od5007xwc1998475513743U6/Uk7K1Op6O0Wq2pdrvt597odrugh/A0hcdk+luhUKhgY0Ryf5HsmizLNz0eN9qtNvRGA8xBdTohyxJjQ8TrBEzaIOk/BQNk3+YHL1WAKiyguL1Wr1tK3C6XteeZ01SRFCSy+Nlb07zdG0umcPvOXTyde8lbZbjcbjyYnsG5CxG8fvsBBJKs+8wG2QouMvFOJB9Mz+JnLA6P24UBnxcNo4nk2jpiiVWEQ2G8j87ApSqo643rgUBg1lJgGMaUAK/EkyhVaxg7eQLhoUEoThX9JBk54MVh/wDSm1uYj75Bv9eHRqNxL5PJTFpF1DRN8fX3oVKp4GhwGB6/H50eoO3sIBgYRpdvr/v8cCeS8KgOFHNZZLNZlfVTLQWKoixDkuElyeLXJdT7vGiHw/j+7QdezC9gCw6MX76Ezx+/QJYkVKiShU6y0MuWAjKlzJYJp+JAIZdDJl+AT3ZgM7OJYqGA4Jkx/C5X4XEpvMSDaq0K0zRTAmcRkCnZZutEm4p6A3MPn8Ahel/SoJstbEVf4dNCFIPBQ/ByRqpU0Gw2UyzbhkVAOSkywuGQMT5+HgOsuEtRIJ06jl63B4nqmuzGwZEAnE7FIhCYSCRSsggIXmcnxLtw4+oViNluc4Q7HCbbi4ES34tayRoyHknTdgdpdHQ0S4KcUJBKrdXuP3q8XGZH/uTzyOXyKJXLeD4zF1uJr2ZFnfh26Lq+sU8gSZJaLpfTBmWyQLWlxaWczlpoWskk2GzyefH4r7+JRGKHZ4WS9MTEREUQWJPIpJv7Y7SztCM0EYvV3XX7I28w3qbFaBtUotsEKhN+2hCtjybmwwZzay07pzMSf+cSCcx/K8WXLZEV/swAAAAASUVORK5CYII=',\n name: 'cordova.png'\n }\n // attach a file using a hypothetical file path\n //,{ filePath: './path/to/your-file.jpg' }\n ],\n onSuccess: function (winParam) { \n console.log('EmailComposer onSuccess - return code ' + winParam.toString());\n },\n onError: function (error) {\n console.log('EmailComposer onError - ' + error.toString());\n }\n });\n\n\n### Deprecated Usage / Backwards Compatability\n\nFor backwards compatability with version 1.x of this plugin and the EmailComposerWithAttachments plug,\nthe following methods are avaialble on the window.plugins global object when\nembedding both `EmailComposer.js` and `EmailComposer-Deprecated.js`\n\n <script src=\"EmailComposer.js\" />\n <script src=\"EmailComposer-Deprecated.js\" />\n <script>\n // TODO: handle device.ready and declare/assign subject, body, toRecipients, etc.\n\n window.plugins.emailComposer.showEmailComposer(subject, body, toRecipients, ccRecipients, bccRecipients, isHTML, attachments);\n\n window.plugins.emailComposer.showEmailComposerWithCallback(callback, subject, body, toRecipients, ccRecipients, bccRecipients, isHTML, attachments);\n\n // ... \n </script>\n\n\n### Credits\n\n - Created by Jesse MacFadyen on April 5th, 2010\n - Added Cordova 1.5 support by @RandyMcMillan on March 2012\n - Added support for optional file attachments by @steve-jansen on October 2012\n - Upgraded to the Cordova 2.1 `void:(CDVInvokedUrlCommand*)` signature by @steve-jansen on November 2012\n - Uses the outstanding NSData+Base64 implementation by Matt Gallagher on 2009/06/03\n - Integrated Guido Sabatini's detection of mime type for file attachments that use a file system path by @steve-jansen on June 2013\n\n\n### Reporting Bugs / Request Features\n\nPlease create a GitHub issue to report a bug or request a feature @ https://github.com/steve-jansen/cordova-ios-emailcomposer/issues\n\n\n### Contributing\n\nI have yet to find a good workflow for running/testing changes to the plugin.\n\nMy less than ideal way today is to recreate a \"Hello, World\" Cordova project with\nmy plugin via:\n\n sudo npm install -g cordova\n ./develop.sh\n\nThe `develop.sh` shell script will use the cordova-cli to create a new project and add this plugin\nto it. It will then open the \"HelloCordova\" project in Xcode. You can optionally symlink\nthe .m and .h plugin files, however, this can have side effects with commands like `git clean -fdx`.\nIt is not possible to symlink the \n\nJavaScript unit tests are run by opening [spec/spec.html](spec/spec.html) in Safari or Chrome\n\nObjective-C unit tests require a faily complex setup process,\ndocumented in [spec/ios/README.md](spec/ios/README.md).\n","readmeFilename":"README.md","_id":"emailcomposer@2.0.2","dist":{"shasum":"2387bf3fd6490bb80cb216b92ceaf8de24cca8f0","tarball":"http://registry.cordova.io/emailcomposer/-/emailcomposer-2.0.2.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"steve-jansen","email":"stevejansen_github@icloud.com"},"maintainers":[{"name":"steve-jansen","email":"stevejansen_github@icloud.com"}]}},"readme":"Cordova EmailComposer Plugin for iOS\n-------------------------------------\n\nA Cordova plugin for iOS devices to create e-mail messages via Apple's Mail.app compose view.\n\n### Requirements\n* Supports Cordova 2.7 and higher;\n* Tested against Cordova 3.0;\n* Cordova <2.7 support is possible with manual editing of the plist/config settings for plugins and optionally enabling ARC\n\n### Installation\n\nThe easy way via the cordova-cli:\n\n sudo npm install -g cordova\n cordova create ~/MyApp MyApp\n cd ~/MyApp\n cordova platform add ios\n cordova plugin add emailcomposer # using the http://plugins.cordova.io registry\n cordova build\n\n\nThe hard way via manual labor:\n\n* Add MessageUI.framework to your project\n* Add EmailComposer.h, EmailComposer.m, NSData+Base64.h, and NSData+Base64.m to your project\n* Copy the EmailComposer.js file to your www directory\n* Include EmailComposer.js as a `<script>` in your html page\n* Modify the `Cordova.plist` Plugins section to include: key EmailComposer value EmailComposer\n\n\n### Example Implementation\n\nAn example of using this plugin will be copied by the cordova-cli to your Xcode project\nas `www/examples/EmailComposer.html`. The example depends on some of the files used by\nthe Cordova Hello, World example. Add an href like below to your `www/index.html` source\nto view the example within your app.\n\n <a href=\"examples/EmailComposer.html\">Email Composer</a>\n\n\n### Usage\n\nUsing `cordova.require`:\n\n var emailComposer = cordova.require('emailcomposer.EmailComposer')\n\n /* alternatively exists in global scope as EmailComposer if you embed via a script tag */\n\n emailComposer.show({ \n to: 'to@example.com',\n cc: 'cc@example.com',\n bcc: 'bcc@example.com',\n subject: 'Example email message',\n body: '<h1>Hello, world!</h1>',\n isHtml: true,\n attachments: [\n // attach a HTML file using a UTF-8 encoded string\n {\n mimeType: 'text/html',\n encoding: 'UTF-8',\n data: '<html><body><h1>Hello, World!</h1></body></html>',\n name: 'demo.html'\n },\n // attach a base-64 encoded veresion of of http://cordova.apache.org/favicon.ico\n {\n mimeType: 'text/png',\n encoding: 'Base64',\n data: 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS4xLjIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjE8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24+MjwvdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K5JKPKQAAAtpJREFUOBFNU0toE1EUPTOZTJI2qbG0qUnwg1IFtSBI967cCBHcSsGFgktdC125EvwVLKi0FApaCChuRMSFqAitCNrGJE1DadpSYz5OvpPJ5Od5007xwc1998475513743U6/Uk7K1Op6O0Wq2pdrvt597odrugh/A0hcdk+luhUKhgY0Ryf5HsmizLNz0eN9qtNvRGA8xBdTohyxJjQ8TrBEzaIOk/BQNk3+YHL1WAKiyguL1Wr1tK3C6XteeZ01SRFCSy+Nlb07zdG0umcPvOXTyde8lbZbjcbjyYnsG5CxG8fvsBBJKs+8wG2QouMvFOJB9Mz+JnLA6P24UBnxcNo4nk2jpiiVWEQ2G8j87ApSqo643rgUBg1lJgGMaUAK/EkyhVaxg7eQLhoUEoThX9JBk54MVh/wDSm1uYj75Bv9eHRqNxL5PJTFpF1DRN8fX3oVKp4GhwGB6/H50eoO3sIBgYRpdvr/v8cCeS8KgOFHNZZLNZlfVTLQWKoixDkuElyeLXJdT7vGiHw/j+7QdezC9gCw6MX76Ezx+/QJYkVKiShU6y0MuWAjKlzJYJp+JAIZdDJl+AT3ZgM7OJYqGA4Jkx/C5X4XEpvMSDaq0K0zRTAmcRkCnZZutEm4p6A3MPn8Ahel/SoJstbEVf4dNCFIPBQ/ByRqpU0Gw2UyzbhkVAOSkywuGQMT5+HgOsuEtRIJ06jl63B4nqmuzGwZEAnE7FIhCYSCRSsggIXmcnxLtw4+oViNluc4Q7HCbbi4ES34tayRoyHknTdgdpdHQ0S4KcUJBKrdXuP3q8XGZH/uTzyOXyKJXLeD4zF1uJr2ZFnfh26Lq+sU8gSZJaLpfTBmWyQLWlxaWczlpoWskk2GzyefH4r7+JRGKHZ4WS9MTEREUQWJPIpJv7Y7SztCM0EYvV3XX7I28w3qbFaBtUotsEKhN+2hCtjybmwwZzay07pzMSf+cSCcx/K8WXLZEV/swAAAAASUVORK5CYII=',\n name: 'cordova.png'\n }\n // attach a file using a hypothetical file path\n //,{ filePath: './path/to/your-file.jpg' }\n ],\n onSuccess: function (winParam) { \n console.log('EmailComposer onSuccess - return code ' + winParam.toString());\n },\n onError: function (error) {\n console.log('EmailComposer onError - ' + error.toString());\n }\n });\n\n\n### Deprecated Usage / Backwards Compatability\n\nFor backwards compatability with version 1.x of this plugin and the EmailComposerWithAttachments plug,\nthe following methods are avaialble on the window.plugins global object when\nembedding both `EmailComposer.js` and `EmailComposer-Deprecated.js`\n\n <script src=\"EmailComposer.js\" />\n <script src=\"EmailComposer-Deprecated.js\" />\n <script>\n // TODO: handle device.ready and declare/assign subject, body, toRecipients, etc.\n\n window.plugins.emailComposer.showEmailComposer(subject, body, toRecipients, ccRecipients, bccRecipients, isHTML, attachments);\n\n window.plugins.emailComposer.showEmailComposerWithCallback(callback, subject, body, toRecipients, ccRecipients, bccRecipients, isHTML, attachments);\n\n // ... \n </script>\n\n\n### Credits\n\n - Created by Jesse MacFadyen on October 2005\n - Added Cordova 1.5 support by @RandyMcMillan on March 2012\n - Added support for optional file attachments by @steve-jansen on October 2012\n - Upgraded to the Cordova 2.1 `void:(CDVInvokedUrlCommand*)` signature by @steve-jansen on November 2012\n - Uses the outstanding NSData+Base64 implementation by Matt Gallagher on 2009/06/03\n - Integrated Guido Sabatini's detection of mime type for file attachments that use a file system path by @steve-jansen on June 2013\n\n\n### Reporting Bugs / Request Features\n\nPlease create a GitHub issue to report a bug or request a feature @ https://github.com/steve-jansen/cordova-ios-emailcomposer/issues\n\n\n### Contributing\n\nI have yet to find a good workflow for running/testing changes to the plugin.\n\nMy less than ideal way today is to recreate a \"Hello, World\" Cordova project with\nmy plugin via:\n\n sudo npm install -g cordova\n ./develop.sh\n\nThe `develop.sh` shell script will use the cordova-cli to create a new project and add this plugin\nto it. It will then open the \"HelloCordova\" project in Xcode. You can optionally symlink\nthe .m and .h plugin files, however, this can have side effects with commands like `git clean -fdx`.\nIt is not possible to symlink the \n\nJavaScript unit tests are run by opening [spec/spec.html](spec/spec.html) in Safari or Chrome\n\nObjective-C unit tests require a faily complex setup process,\ndocumented in [spec/ios/README.md](spec/ios/README.md).\n","maintainers":[{"name":"steve-jansen","email":"stevejansen_github@icloud.com"}],"time":{"modified":"2013-09-18T17:34:52.065Z","created":"2013-08-07T21:14:29.580Z","2.0.0":"2013-08-07T21:14:48.866Z","2.0.1":"2013-08-09T17:17:10.484Z","2.0.2":"2013-09-18T17:34:52.065Z"},"_attachments":{"emailcomposer-2.0.2.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-So9fJizlB/aBPzLb7LLMpQ==","length":46492,"stub":true},"emailcomposer-2.0.1.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-QcWS3Jc0V2D7B4pycoZNzA==","length":46469,"stub":true},"emailcomposer-2.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-d+9u9HLAx9UJ19lzMraWAg==","length":15359144,"stub":true}}}},
{"id":"error: forbidden","key":"error: forbidden","value":{"rev":"1-2f11e026763c10730d8b19ba5dce7565"},"doc":{"_id":"error: forbidden","_rev":"1-2f11e026763c10730d8b19ba5dce7565","forbidden":"must supply latest _rev to update existing package"}},
{"id":"fr.spirotron.cordova.ios.disableshaketoedit","key":"fr.spirotron.cordova.ios.disableshaketoedit","value":{"rev":"3-127247be2f0039673d3edd33a7ad1a80"},"doc":{"_id":"fr.spirotron.cordova.ios.disableshaketoedit","_rev":"3-127247be2f0039673d3edd33a7ad1a80","name":"fr.spirotron.cordova.ios.disableshaketoedit","description":"Disables iOS shake to undo feature in all input fields.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"version":"0.1.0","name":"fr.spirotron.cordova.ios.disableshaketoedit","cordova_name":"iOS Disable Shake to Edit","description":"Disables iOS shake to undo feature in all input fields.","license":"Apache 2.0","keywords":["cordova","ios","input","gesture","shaketoedit"],"engines":[],"readme":"# cordova-plugin-ios-disableshaketoedit\n\n## Description\nThis plugin disables the infamous \"Shake to undo\" feature by setting the application's `applicationSupportsShakeToEdit` property to `NO`.\n\n## License\nThis code is released under the Apache 2.0 license.","readmeFilename":"README.md","_id":"fr.spirotron.cordova.ios.disableshaketoedit@0.1.0","dist":{"shasum":"c6222b2b714434cce171fbc1a289c5289bf55961","tarball":"http://registry.cordova.io/fr.spirotron.cordova.ios.disableshaketoedit/-/fr.spirotron.cordova.ios.disableshaketoedit-0.1.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"nleclerc","email":"nl@spirotron.fr"},"maintainers":[{"name":"nleclerc","email":"nl@spirotron.fr"}]}},"readme":"# cordova-plugin-ios-disableshaketoedit\n\n## Description\nThis plugin disables the infamous \"Shake to undo\" feature by setting the application's `applicationSupportsShakeToEdit` property to `NO`.\n\n## License\nThis code is released under the Apache 2.0 license.","maintainers":[{"name":"nleclerc","email":"nl@spirotron.fr"}],"time":{"modified":"2013-12-03T18:59:31.667Z","created":"2013-12-03T18:59:30.700Z","0.1.0":"2013-12-03T18:59:31.666Z"},"_attachments":{"fr.spirotron.cordova.ios.disableshaketoedit-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-tlf1fw3VU+bUsqjFaDZ1VA==","length":5152,"stub":true}}}},
{"id":"fr.spirotron.cordova.sleepcontrol","key":"fr.spirotron.cordova.sleepcontrol","value":{"rev":"3-d15d9c05def71fb9079c4efd57ced1d6"},"doc":{"_id":"fr.spirotron.cordova.sleepcontrol","_rev":"3-d15d9c05def71fb9079c4efd57ced1d6","name":"fr.spirotron.cordova.sleepcontrol","description":"Allows enabling or disabling device sleep.","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"version":"0.1.0","name":"fr.spirotron.cordova.sleepcontrol","cordova_name":"Sleep Control","description":"Allows enabling or disabling device sleep.","license":"Apache 2.0","keywords":["cordova","ios","sleep"],"engines":[],"readme":"# cordova-plugin-disablesleep\n\n## Description\nThis plugin makes it easy to enable or disable device sleep.\n\n**Note:** Works for iOS ONLY for the time being.\n\n### iOS\nThe plugin sets the [`idleTimerDisabled`](https://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#jumpTo_9) property of the application.\n\n## Usage\nTo disable sleep, just call `SleepControl.setEnabled(false);`.\n\nTo enable sleep again, call `SleepControl.setEnabled(true);`\n\n## License\nThis code is released under the Apache 2.0 license.","readmeFilename":"README.md","_id":"fr.spirotron.cordova.sleepcontrol@0.1.0","dist":{"shasum":"f0335e3f5635776a6af5e690e190ea6dec72400b","tarball":"http://registry.cordova.io/fr.spirotron.cordova.sleepcontrol/-/fr.spirotron.cordova.sleepcontrol-0.1.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"nleclerc","email":"nl@spirotron.fr"},"maintainers":[{"name":"nleclerc","email":"nl@spirotron.fr"}]}},"readme":"# cordova-plugin-disablesleep\n\n## Description\nThis plugin makes it easy to enable or disable device sleep.\n\n**Note:** Works for iOS ONLY for the time being.\n\n### iOS\nThe plugin sets the [`idleTimerDisabled`](https://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#jumpTo_9) property of the application.\n\n## Usage\nTo disable sleep, just call `SleepControl.setEnabled(false);`.\n\nTo enable sleep again, call `SleepControl.setEnabled(true);`\n\n## License\nThis code is released under the Apache 2.0 license.","maintainers":[{"name":"nleclerc","email":"nl@spirotron.fr"}],"time":{"modified":"2013-12-21T18:21:38.303Z","created":"2013-12-21T18:21:35.198Z","0.1.0":"2013-12-21T18:21:38.303Z"},"_attachments":{"fr.spirotron.cordova.sleepcontrol-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-FRuzex3hS4rYOcHkemXq6Q==","length":5554,"stub":true}}}},
{"id":"in.girish.datagram","key":"in.girish.datagram","value":{"rev":"3-8a7f5b33455a37e9f96506859ffcc764"},"doc":{"_id":"in.girish.datagram","_rev":"3-8a7f5b33455a37e9f96506859ffcc764","name":"in.girish.datagram","description":"UDP Plugin which supports node.js dgram API","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"version":"0.1.0","name":"in.girish.datagram","cordova_name":"UDP Plugin","description":"UDP Plugin which supports node.js dgram API","license":"MIT","keywords":["UDP"," Multicast"," Datagram"," dgram"],"engines":[],"readme":"cordova-plugin-datagram\n=======================\n\nCordova plugin for sending datagram/UDP. Supports multicast UDP.\n\n","readmeFilename":"README.md","_id":"in.girish.datagram@0.1.0","dist":{"shasum":"b6ae94a3a6edbfb1afb9c9de29f5f23dbff2d9dd","tarball":"http://registry.cordova.io/in.girish.datagram/-/in.girish.datagram-0.1.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"girish","email":"girish@forwardbias.in"},"maintainers":[{"name":"girish","email":"girish@forwardbias.in"}]}},"readme":"cordova-plugin-datagram\n=======================\n\nCordova plugin for sending datagram/UDP. Supports multicast UDP.\n\n","maintainers":[{"name":"girish","email":"girish@forwardbias.in"}],"time":{"modified":"2014-01-14T08:18:04.427Z","created":"2014-01-14T08:18:03.612Z","0.1.0":"2014-01-14T08:18:04.427Z"},"_attachments":{"in.girish.datagram-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-9xPOrZ74jdJjKoapqNcHbQ==","length":3459,"stub":true}}}},
{"id":"jp.wizcorp.wizspinnerplugin","key":"jp.wizcorp.wizspinnerplugin","value":{"rev":"3-8d1455db201417f214a4245237d8210b"},"doc":{"_id":"jp.wizcorp.wizspinnerplugin","_rev":"3-8d1455db201417f214a4245237d8210b","name":"jp.wizcorp.wizspinnerplugin","description":"This plugin allows you to create native spinners & loaders above your HTML application layer.","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"version":"1.0.0","name":"jp.wizcorp.wizspinnerplugin","cordova_name":"Wizard Spinner Plugin","description":"This plugin allows you to create native spinners & loaders above your HTML application layer.","license":"MIT","keywords":["spinner","loader"],"engines":[{"name":"cordova","version":">=2.6.0"}],"readme":"# phonegap-plugin-wizSpinner \n\n- PhoneGap Version : 3.0\n- last update : 03/09/2013\n\n\n\n# Description\n\nPhoneGap plugin for creating and manipulating native loader/spinner above Cordova.\n\n*NOTE* - Android is portrait only, barebones (many iOS features yet to be implemented T-T)\n\n# Install (iOS & Android with Plugman) \n\n\tcordova plugin add https://github.com/Wizcorp/phonegap-plugin-wizSpinner/tree/v3.0\n\n# Install (iOS) \n\n- For iOS, add the following frameworks:\n\t- ImageIO.framework\n\t\nSee example project.\n\n# Example Code\n\nExample options for APIs\n<pre><code>\n position\t:\t\"low\" / \"middle\" / \"high\" - default \"middle\"\n\tposition of spinner.\n \n label\t:\t\"my loading text\" - default \"loading...\"\n\ttext to show an empty string will not show any text.\n\n color\t:\t\"#RGB\" / \"#ARGB\" / \"#RRGGBB\" / \"#AARRGGBB\" / \"transparent\" - default #fff \n\thex colour string with the wrong spelling of colour.\n\n bgColor\t:\t\"#RGB\" / \"#ARGB\" / \"#RRGGBB\" / \"#AARRGGBB\" / \"transparent\" - default #fff \n\thex colour string with the wrong spelling of colour.\n\n \topacity\t:\t0.0 - default 0.4 \n\tfloat int between 0.0 and 1.0 for background black canvas\n\n spinnerColor\t:\t\"white\" / \"grey\" - default \"white\"\n\tColour of Apple spinner if using Apple spinner\n\n\tshowSpinner\t\t: true / false - default true\n\tshows an Apple spinner\n\n\tcustomSpinner : true / false - default false\n\tOverride Apple Spinner with a gif (use customSpinnerPath to provide custom path if not default in bundle is used)\n\tRequired -> showSpinner = true\n\n customSpinnerPath\t:\t\"http://google.gif\" / \"var/applications/local/file.gif\" / \"default\" - \tdefault \"default\" (default spinner stored in bundle)\n\tcustomer spinner must be gif (currently). Can be loaded from URL. NOT cached.\n\tRequired -> customerSpinner = true\n\n \twidth\t:\t100 - default is natural custom image size\n\tint in pixels of spinner width if rescaling a custom spinner\n\n height\t:\t150 - default is natural custom image size\n\tint in pixels of spinner height if rescaling a custom spinner\n\n spinLoops\t:\t0 - default is 0, which specifies to repeat the animation indefinitely.\n\tint specifying the number of times to repeat the animation of a custom spinner\n\n spinDuration\t:\t1.0 - default is equal to the number of images in the custom spinner \tmultiplied by 1/30th of a second. Thus, if you had 30 images, the value would be 1 second.\n\tfloat indicating the time duration measured in seconds\n</code></pre>\n\n**Create spinner**\n\n\twizSpinner.create(JSONObject options);\n\n**Show spinner**\n\n\twizSpinner.show(JSONObject options);\n\n**Hide spinner**<br />\n\t\n\twizSpinner.hide(); \n\n**Rotate spinner**\n\nThis is handled by PhoneGap event listener, though you can force this if you wish.\n\n\twizSpinner.rotate(Int orientation);\n\nAdd this code to manually configure orientations\n\t\n\tfunction shouldRotateToOrientation (orientation) {\n \t\tif (deviceIsReady == true) {\n \t\tswitch (orientation) {\n \t\tcase 0:\n \t\t// portrait normal\n \t\twindow.wizSpinner.rotate(1);\n \t\treturn true;\n \tbreak;\n \t\tcase 90:\n \t\t// landscape left\n \t\twindow.wizSpinner.rotate(3);\n \t\treturn true;\n \tbreak;\n \t\tcase -90:\n \t\t\t\t // landscape right\n \t\twindow.wizSpinner.rotate(4);\n \t\treturn true;\n \tbreak;\n \t\tcase 180:\n \t\t\t// portrait upside down\n \t\treturn false;\n \tbreak;\n \t\t}\n \t}\n\t}\n\n\n\tfunction onDeviceReady() {\n \t\tdeviceIsReady = true;\n\t}\n","readmeFilename":"README.md","_id":"jp.wizcorp.wizspinnerplugin@1.0.0","dist":{"shasum":"3e0a0ed0185b4a09428b8ac69b04443015c3ede7","tarball":"http://registry.cordova.io/jp.wizcorp.wizspinnerplugin/-/jp.wizcorp.wizspinnerplugin-1.0.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"aogilvie","email":"aogilvie@wizcorp.jp"},"maintainers":[{"name":"aogilvie","email":"aogilvie@wizcorp.jp"}]}},"readme":"# phonegap-plugin-wizSpinner \n\n- PhoneGap Version : 3.0\n- last update : 03/09/2013\n\n\n\n# Description\n\nPhoneGap plugin for creating and manipulating native loader/spinner above Cordova.\n\n*NOTE* - Android is portrait only, barebones (many iOS features yet to be implemented T-T)\n\n# Install (iOS & Android with Plugman) \n\n\tcordova plugin add https://github.com/Wizcorp/phonegap-plugin-wizSpinner/tree/v3.0\n\n# Install (iOS) \n\n- For iOS, add the following frameworks:\n\t- ImageIO.framework\n\t\nSee example project.\n\n# Example Code\n\nExample options for APIs\n<pre><code>\n position\t:\t\"low\" / \"middle\" / \"high\" - default \"middle\"\n\tposition of spinner.\n \n label\t:\t\"my loading text\" - default \"loading...\"\n\ttext to show an empty string will not show any text.\n\n color\t:\t\"#RGB\" / \"#ARGB\" / \"#RRGGBB\" / \"#AARRGGBB\" / \"transparent\" - default #fff \n\thex colour string with the wrong spelling of colour.\n\n bgColor\t:\t\"#RGB\" / \"#ARGB\" / \"#RRGGBB\" / \"#AARRGGBB\" / \"transparent\" - default #fff \n\thex colour string with the wrong spelling of colour.\n\n \topacity\t:\t0.0 - default 0.4 \n\tfloat int between 0.0 and 1.0 for background black canvas\n\n spinnerColor\t:\t\"white\" / \"grey\" - default \"white\"\n\tColour of Apple spinner if using Apple spinner\n\n\tshowSpinner\t\t: true / false - default true\n\tshows an Apple spinner\n\n\tcustomSpinner : true / false - default false\n\tOverride Apple Spinner with a gif (use customSpinnerPath to provide custom path if not default in bundle is used)\n\tRequired -> showSpinner = true\n\n customSpinnerPath\t:\t\"http://google.gif\" / \"var/applications/local/file.gif\" / \"default\" - \tdefault \"default\" (default spinner stored in bundle)\n\tcustomer spinner must be gif (currently). Can be loaded from URL. NOT cached.\n\tRequired -> customerSpinner = true\n\n \twidth\t:\t100 - default is natural custom image size\n\tint in pixels of spinner width if rescaling a custom spinner\n\n height\t:\t150 - default is natural custom image size\n\tint in pixels of spinner height if rescaling a custom spinner\n\n spinLoops\t:\t0 - default is 0, which specifies to repeat the animation indefinitely.\n\tint specifying the number of times to repeat the animation of a custom spinner\n\n spinDuration\t:\t1.0 - default is equal to the number of images in the custom spinner \tmultiplied by 1/30th of a second. Thus, if you had 30 images, the value would be 1 second.\n\tfloat indicating the time duration measured in seconds\n</code></pre>\n\n**Create spinner**\n\n\twizSpinner.create(JSONObject options);\n\n**Show spinner**\n\n\twizSpinner.show(JSONObject options);\n\n**Hide spinner**<br />\n\t\n\twizSpinner.hide(); \n\n**Rotate spinner**\n\nThis is handled by PhoneGap event listener, though you can force this if you wish.\n\n\twizSpinner.rotate(Int orientation);\n\nAdd this code to manually configure orientations\n\t\n\tfunction shouldRotateToOrientation (orientation) {\n \t\tif (deviceIsReady == true) {\n \t\tswitch (orientation) {\n \t\tcase 0:\n \t\t// portrait normal\n \t\twindow.wizSpinner.rotate(1);\n \t\treturn true;\n \tbreak;\n \t\tcase 90:\n \t\t// landscape left\n \t\twindow.wizSpinner.rotate(3);\n \t\treturn true;\n \tbreak;\n \t\tcase -90:\n \t\t\t\t // landscape right\n \t\twindow.wizSpinner.rotate(4);\n \t\treturn true;\n \tbreak;\n \t\tcase 180:\n \t\t\t// portrait upside down\n \t\treturn false;\n \tbreak;\n \t\t}\n \t}\n\t}\n\n\n\tfunction onDeviceReady() {\n \t\tdeviceIsReady = true;\n\t}\n","maintainers":[{"name":"aogilvie","email":"aogilvie@wizcorp.jp"}],"time":{"modified":"2013-09-24T16:07:20.375Z","created":"2013-09-24T16:06:56.565Z","1.0.0":"2013-09-24T16:07:20.375Z"},"_attachments":{"jp.wizcorp.wizspinnerplugin-1.0.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-DN/0JGAOS0tuYi7pwbhkpg==","length":7992127,"stub":true}}}},
{"id":"me.apla.cordova.app-preferences","key":"me.apla.cordova.app-preferences","value":{"rev":"9-d646b533abbbadcc268ba75baf546a67"},"doc":{"_id":"me.apla.cordova.app-preferences","_rev":"9-d646b533abbbadcc268ba75baf546a67","name":"me.apla.cordova.app-preferences","description":"Application preferences plugin","dist-tags":{"latest":"0.3.0"},"versions":{"0.2.0":{"version":"0.2.0","name":"me.apla.cordova.app-preferences","cordova_name":"AppPreferences","description":"Application preferences plugin","license":"Apache","keywords":["preferences"],"readme":"app preferences cordova plugin\n-----------------------\n\ncompatible with phonegap 3.0\n\noriginally ported from:\nhttps://github.com/phonegap/phonegap-plugins/tree/master/iOS/ApplicationPreferences\n\nandroid untested (for now)\n\nanother android implementation:\nhttps://github.com/macdonst/AppPreferences\n\n\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/guide_plugin_ref_plugman.md.html).\n","readmeFilename":"README.md","_id":"me.apla.cordova.app-preferences@0.2.0","dist":{"shasum":"d53b4f7fe8f74443b6d3c991671105ccbf4aad0d","tarball":"http://registry.cordova.io/me.apla.cordova.app-preferences/-/me.apla.cordova.app-preferences-0.2.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"apla","email":"owner@apla.me"},"maintainers":[{"name":"apla","email":"owner@apla.me"}]},"0.2.4":{"version":"0.2.4","name":"me.apla.cordova.app-preferences","cordova_name":"AppPreferences","description":"Application preferences plugin","license":"Apache","keywords":["preferences"," settings"],"engines":[],"readme":"app preferences cordova plugin\n-----------------------\n\ncompatible with phonegap 3.0\n\noriginally ported from:\nhttps://github.com/phonegap/phonegap-plugins/tree/master/iOS/ApplicationPreferences\n\nandroid untested (for now)\n\nanother android implementation:\nhttps://github.com/macdonst/AppPreferences\n\n\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/guide_plugin_ref_plugman.md.html).\n","readmeFilename":"README.md","_id":"me.apla.cordova.app-preferences@0.2.4","dist":{"shasum":"ccd9d123c91995640bf32d8517d76d2271c55dd9","tarball":"http://registry.cordova.io/me.apla.cordova.app-preferences/-/me.apla.cordova.app-preferences-0.2.4.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"apla","email":"owner@apla.me"},"maintainers":[{"name":"apla","email":"owner@apla.me"}]},"0.2.5":{"version":"0.2.5","name":"me.apla.cordova.app-preferences","cordova_name":"AppPreferences","description":"Application preferences plugin","license":"Apache","keywords":["preferences"," settings"],"engines":[],"readme":"Application preferences Cordova plugin.\n-----------------------\n\nStore and fetch application preferences using platform facilities.\nCompatible with phonegap 3.x\n\nInstalling:\n---\n\nFrom plugin registry:\n\n $ cordova plugin add me.apla.cordova.app-preferences\n\nFrom the repo:\n\n $ cordova plugin add https://github.com/apla/me.apla.cordova.app-preferences\n\nFrom a local clone:\n\n $ cordova plugin add /path/to/me.apla.cordova.app-preferences/folder\n\n\nMore information:\n[Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\n[Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/guide_plugin_ref_plugman.md.html).\n\n\nSynopsis:\n---\n\n```javascript\n\nfunction ok (value) {}\nfunction fail (error) {}\n\n\nvar prefs = plugins.appPreferences;\n\n// store key => value pair\nprefs.store (ok, fail, 'key', 'value');\n\n// store key => value pair in dict (see notes)\nprefs.store (ok, fail, 'dict', 'key', 'value');\n\n// fetch value by key (value will be delivered through \"ok\" callback)\nprefs.fetch (ok, fail, 'key');\n\n// fetch value by key from dict (see notes)\nprefs.fetch (ok, fail, 'dict', 'key');\n```\n\nPlatforms:\n---\n1. Native execution on iOS using `NSUserDefaults`\n1. Native execution on Android using `android.content.SharedPreferences`\n1. Native execution on Windows Phone using `IsolatedStorageSettings.ApplicationSettings`\n1. (WIP) fallback using `localStorage`\n\nNotes:\n---\n1. iOS and Android basic values (`string`, `number`, `boolean`) stored using typed fields.\n1. Windows Phone basic values (`string`, `number`, `boolean`) stored using JSON notation.\n1. Complex values, such as arrays and objects, always stored using JSON notation.\n1. Dictionaries supported only on iOS, so on another platforms when using dict key\nwill be written like `<dict>.<key>`\n\nTests:\n---\nTests available in `src/test.js`. After installing plugin, you can add test code from this file and then launch `testPlugin()` function.\n\nAndroid and iOS tested ok at this moment.\n\nCredits:\n---\n\nOriginally ported from:\nhttps://github.com/phonegap/phonegap-plugins/tree/master/iOS/ApplicationPreferences\n\nAnother android implementation for cordova 2.x:\nhttps://github.com/macdonst/AppPreferences\n","readmeFilename":"README.md","_id":"me.apla.cordova.app-preferences@0.2.5","dist":{"shasum":"f68247cb0d96100764488daf429e8173b84b3473","tarball":"http://registry.cordova.io/me.apla.cordova.app-preferences/-/me.apla.cordova.app-preferences-0.2.5.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"apla","email":"owner@apla.me"},"maintainers":[{"name":"apla","email":"owner@apla.me"}]},"0.3.0":{"version":"0.3.0","name":"me.apla.cordova.app-preferences","cordova_name":"AppPreferences","description":"Application preferences plugin","license":"Apache","keywords":["preferences"," settings"],"engines":[],"readme":"Application preferences Cordova plugin.\n-----------------------\n\nStore and fetch application preferences using platform facilities.\nCompatible with Cordova 3.x\n\nInstalling:\n---\n\nFrom plugin registry:\n\n $ cordova plugin add me.apla.cordova.app-preferences\n\nFrom the repo:\n\n $ cordova plugin add https://github.com/apla/me.apla.cordova.app-preferences\n\nFrom a local clone:\n\n $ cordova plugin add /path/to/me.apla.cordova.app-preferences/folder\n\n\nMore information:\n[Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\n[Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/guide_plugin_ref_plugman.md.html).\n\n\nSynopsis:\n---\n\n```javascript\n\nfunction ok (value) {}\nfunction fail (error) {}\n\n\nvar prefs = plugins.appPreferences;\n\n// store key => value pair\nprefs.store (ok, fail, 'key', 'value');\n\n// store key => value pair in dict (see notes)\nprefs.store (ok, fail, 'dict', 'key', 'value');\n\n// fetch value by key (value will be delivered through \"ok\" callback)\nprefs.fetch (ok, fail, 'key');\n\n// fetch value by key from dict (see notes)\nprefs.fetch (ok, fail, 'dict', 'key');\n```\n\nPlatforms:\n---\n1. Native execution on iOS using `NSUserDefaults`\n1. Native execution on Android using `android.content.SharedPreferences`\n1. Native execution on Windows Phone using `IsolatedStorageSettings.ApplicationSettings`\n1. Native execution on Windows 8 using `IsolatedStorageSettings.ApplicationSettings`\n1. (untested) fallback using `localStorage`\n\nNotes:\n---\n1. iOS, Android and Windows Phone basic values (`string`, `number`, `boolean`) stored using typed fields.\n1. Complex values, such as arrays and objects, always stored using JSON notation.\n1. Dictionaries supported on iOS and Windows 8, so on another platforms when using dict key\nwill be written like `<dict>.<key>`\n\nTests:\n---\nTests available in `src/test.js`. After installing plugin, you can add test code from this file and then launch `testPlugin()` function.\n\niOS, Android and Windows Phone 8 test pass ok at this moment.\n\nCredits:\n---\n\nOriginally ported from:\nhttps://github.com/phonegap/phonegap-plugins/tree/master/iOS/ApplicationPreferences\n\nAnother android implementation for cordova 2.x:\nhttps://github.com/macdonst/AppPreferences\n","readmeFilename":"README.md","_id":"me.apla.cordova.app-preferences@0.3.0","dist":{"shasum":"482bf9b9caf1d7be57488d01ce811ee052e8a909","tarball":"http://registry.cordova.io/me.apla.cordova.app-preferences/-/me.apla.cordova.app-preferences-0.3.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"apla","email":"owner@apla.me"},"maintainers":[{"name":"apla","email":"owner@apla.me"}]}},"readme":"app preferences cordova plugin\n-----------------------\n\ncompatible with phonegap 3.0\n\noriginally ported from:\nhttps://github.com/phonegap/phonegap-plugins/tree/master/iOS/ApplicationPreferences\n\nandroid untested (for now)\n\nanother android implementation:\nhttps://github.com/macdonst/AppPreferences\n\n\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/guide_plugin_ref_plugman.md.html).\n","maintainers":[{"name":"apla","email":"owner@apla.me"}],"time":{"modified":"2014-01-09T23:36:21.613Z","created":"2013-10-23T04:53:44.182Z","0.2.0":"2013-10-23T04:53:45.389Z","0.2.4":"2014-01-07T20:21:02.806Z","0.2.5":"2014-01-09T13:25:22.577Z","0.3.0":"2014-01-09T23:36:21.613Z"},"_attachments":{"me.apla.cordova.app-preferences-0.3.0.tgz":{"content_type":"application/octet-stream","revpos":8,"digest":"md5-ShVoOqxRz4ZNL5b6GM9lzQ==","length":503453,"stub":true},"me.apla.cordova.app-preferences-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":6,"digest":"md5-hGcnhkxTAIrRb67/ei8AzQ==","length":502752,"stub":true},"me.apla.cordova.app-preferences-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-IsUK9uIT00qBTu9y9fZlXA==","length":500234,"stub":true},"me.apla.cordova.app-preferences-0.2.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-jFi9AkI5RKScpoewVRJipQ==","length":10188,"stub":true}}}},
{"id":"me.apla.cordova.share-social","key":"me.apla.cordova.share-social","value":{"rev":"3-d37f7a7527295cf07d1d55d71cc30633"},"doc":{"_id":"me.apla.cordova.share-social","_rev":"3-d37f7a7527295cf07d1d55d71cc30633","name":"me.apla.cordova.share-social","description":"Cordova social sharing plugin","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"version":"0.1.0","name":"me.apla.cordova.share-social","cordova_name":"Social Share","description":"Cordova social sharing plugin","license":"Apache","keywords":["cordova","social"],"readme":"Social share plugin for Phonegap Android App\n============================================\n\nAndroid Phonegap Plugin for Social Share - Email , Facebook , Twitter and SMS.\n\nPlease find more info from the below link. \n\nhttp://tech.sarathdr.com/?p=697\n\nAuthor: Sarath DR \nWeb: http://tech.sarathdr.com\n\n\n\n\n","readmeFilename":"README-android.md","_id":"me.apla.cordova.share-social@0.1.0","dist":{"shasum":"761c7fe42b26183928d9fca0f24c94194109333c","tarball":"http://registry.cordova.io/me.apla.cordova.share-social/-/me.apla.cordova.share-social-0.1.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"apla","email":"owner@apla.me"},"maintainers":[{"name":"apla","email":"owner@apla.me"}]}},"readme":"Social share plugin for Phonegap Android App\n============================================\n\nAndroid Phonegap Plugin for Social Share - Email , Facebook , Twitter and SMS.\n\nPlease find more info from the below link. \n\nhttp://tech.sarathdr.com/?p=697\n\nAuthor: Sarath DR \nWeb: http://tech.sarathdr.com\n\n\n\n\n","maintainers":[{"name":"apla","email":"owner@apla.me"}],"time":{"modified":"2013-10-23T05:00:34.048Z","created":"2013-10-23T05:00:32.354Z","0.1.0":"2013-10-23T05:00:34.048Z"},"_attachments":{"me.apla.cordova.share-social-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-Wt2oVbDgWdqLapEhp7qW0g==","length":56181,"stub":true}}}},
{"id":"nl.sylvain.cordova.osc","key":"nl.sylvain.cordova.osc","value":{"rev":"3-a2a0e1df0bbbe2cc8a7b7bd41e270050"},"doc":{"_id":"nl.sylvain.cordova.osc","_rev":"3-a2a0e1df0bbbe2cc8a7b7bd41e270050","name":"nl.sylvain.cordova.osc","description":"cordova-osc-plugin ================== This is a very basic OSC plugin for cordova","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"version":"0.1.0","name":"nl.sylvain.cordova.osc","cordova_name":"OSC","engines":[],"readme":"cordova-osc-plugin\n==================\nThis is a very basic OSC plugin for cordova\n\nSupported platforms\n===================\n* Android\n* iOS\n\nSupported features\n==================\n* OSC Receive\n* OSC Send\n\n\nAndroid OSC relies on https://github.com/hoijui/JavaOSC (included as a JAR file)\niOS OSC relies on https://github.com/danieldickison/CocoaOSC","readmeFilename":"README.md","description":"cordova-osc-plugin ================== This is a very basic OSC plugin for cordova","_id":"nl.sylvain.cordova.osc@0.1.0","dist":{"shasum":"a382873d1c370d6f4f5b16303ef77cf865b5ec22","tarball":"http://registry.cordova.io/nl.sylvain.cordova.osc/-/nl.sylvain.cordova.osc-0.1.0.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"sy1vain","email":"info@sylvain.nl"},"maintainers":[{"name":"sy1vain","email":"info@sylvain.nl"}]}},"readme":"cordova-osc-plugin\n==================\nThis is a very basic OSC plugin for cordova\n\nSupported platforms\n===================\n* Android\n* iOS\n\nSupported features\n==================\n* OSC Receive\n* OSC Send\n\n\nAndroid OSC relies on https://github.com/hoijui/JavaOSC (included as a JAR file)\niOS OSC relies on https://github.com/danieldickison/CocoaOSC","maintainers":[{"name":"sy1vain","email":"info@sylvain.nl"}],"time":{"modified":"2013-12-18T13:57:12.643Z","created":"2013-12-18T13:57:10.669Z","0.1.0":"2013-12-18T13:57:12.643Z"},"_attachments":{"nl.sylvain.cordova.osc-0.1.0.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-m7f16GwN/zTbUSBAkhq4kA==","length":152990,"stub":true}}}},
{"id":"org.apache.cordova.battery-status","key":"org.apache.cordova.battery-status","value":{"rev":"15-fcc33a982be634f0318b2683dda61fd2"},"doc":{"_id":"org.apache.cordova.battery-status","_rev":"15-fcc33a982be634f0318b2683dda61fd2","name":"org.apache.cordova.battery-status","description":"Cordova Battery Plugin","dist-tags":{"latest":"0.2.5"},"versions":{"0.2.1":{"version":"0.2.1","name":"org.apache.cordova.battery-status","cordova_name":"Battery","description":"Cordova Battery Plugin","license":"Apache 2.0","keywords":["cordova","battery"],"engines":[],"readme":"cordova-plugin-battery-status\n=============================\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/plugin_ref_plugman.md.html).\n","readmeFilename":"README.md","_id":"org.apache.cordova.battery-status@0.2.1","dist":{"shasum":"5dc451d03b15a88756429601695518d042dd0cda","tarball":"http://cordova.iriscouch.com/registry/_design/scratch/_rewrite/org.apache.cordova.battery-status/-/org.apache.cordova.battery-status-0.2.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"anis","email":"anis@adobe.com"},"maintainers":[{"name":"anis","email":"anis@adobe.com"}],"directories":{}},"0.2.2":{"version":"0.2.2","name":"org.apache.cordova.battery-status","cordova_name":"Battery","description":"Cordova Battery Plugin","license":"Apache 2.0","keywords":["cordova","battery"],"engines":[],"readme":"cordova-plugin-battery-status\n=============================\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/plugin_ref_plugman.md.html).\n","readmeFilename":"README.md","_id":"org.apache.cordova.battery-status@0.2.2","dist":{"shasum":"566f0897be5e092c89ffec8a41b61d32aa11f0e8","tarball":"http://cordova.iriscouch.com/registry/_design/scratch/_rewrite/org.apache.cordova.battery-status/-/org.apache.cordova.battery-status-0.2.2.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"anis","email":"anis@adobe.com"},"maintainers":[{"name":"anis","email":"anis@adobe.com"}],"directories":{}},"0.2.3":{"version":"0.2.3","name":"org.apache.cordova.battery-status","cordova_name":"Battery","description":"Cordova Battery Plugin","license":"Apache 2.0","keywords":["cordova","battery"],"engines":[],"readme":"cordova-plugin-battery-status\n=============================\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/plugin_ref_plugman.md.html).\n","readmeFilename":"README.md","_id":"org.apache.cordova.battery-status@0.2.3","dist":{"shasum":"64b94e5ce835a5cd4c39d328354257173b365e87","tarball":"http://registry.cordova.io/org.apache.cordova.battery-status/-/org.apache.cordova.battery-status-0.2.3.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"anis","email":"anis@adobe.com"},"maintainers":[{"name":"anis","email":"anis@adobe.com"}]},"0.2.4":{"version":"0.2.4","name":"org.apache.cordova.battery-status","cordova_name":"Battery","description":"Cordova Battery Plugin","license":"Apache 2.0","keywords":["cordova","battery"],"engines":[],"readme":"cordova-plugin-battery-status\n=============================\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/plugin_ref_plugman.md.html).\n","readmeFilename":"README.md","_id":"org.apache.cordova.battery-status@0.2.4","dist":{"shasum":"1ae49c91313e4a96dcd1207a5dd684ab2528c45a","tarball":"http://registry.cordova.io/org.apache.cordova.battery-status/-/org.apache.cordova.battery-status-0.2.4.tgz"},"_from":"cordova-plugin-battery-status/","_npmVersion":"1.3.4","_npmUser":{"name":"stevegill","email":"stevengill97@gmail.com"},"maintainers":[{"name":"anis","email":"anis@adobe.com"},{"name":"stevegill","email":"stevengill97@gmail.com"}]},"0.2.5":{"version":"0.2.5","name":"org.apache.cordova.battery-status","cordova_name":"Battery","description":"Cordova Battery Plugin","license":"Apache 2.0","keywords":["cordova","battery"],"engines":[],"readme":"cordova-plugin-battery-status\n=============================\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/plugin_ref_plugman.md.html).\n","readmeFilename":"README.md","_id":"org.apache.cordova.battery-status@0.2.5","dist":{"shasum":"cd6d6d837cfa22402ed43e6399bf6220b3a356c6","tarball":"http://registry.cordova.io/org.apache.cordova.battery-status/-/org.apache.cordova.battery-status-0.2.5.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"stevegill","email":"stevengill97@gmail.com"},"maintainers":[{"name":"anis","email":"anis@adobe.com"},{"name":"stevegill","email":"stevengill97@gmail.com"}]}},"readme":"cordova-plugin-battery-status\n=============================\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/plugin_ref_plugman.md.html).\n","maintainers":[{"name":"anis","email":"anis@adobe.com"},{"name":"stevegill","email":"stevengill97@gmail.com"}],"time":{"modified":"2013-12-05T20:10:32.242Z","created":"2013-09-21T09:58:44.207Z","0.2.1":"2013-09-21T09:58:47.825Z","0.2.2":"2013-09-21T10:44:01.024Z","0.2.3":"2013-09-27T07:27:51.808Z","0.2.4":"2013-10-29T20:34:21.841Z","0.2.5":"2013-12-05T20:10:32.242Z"},"_attachments":{"org.apache.cordova.battery-status-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":14,"digest":"md5-IlWmGnn7uK5tbqpWvD4OVw==","length":39254,"stub":true},"org.apache.cordova.battery-status-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":12,"digest":"md5-EQnmMrPVk7oVMiQajOeEVQ==","length":38120,"stub":true},"org.apache.cordova.battery-status-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":9,"digest":"md5-I1EarDGicR+gqseNBNvEpg==","length":37960,"stub":true},"org.apache.cordova.battery-status-0.2.2.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-1gVAFTSPyxJv8360BjNYmA==","length":37699,"stub":true},"org.apache.cordova.battery-status-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-y0pgMI9Y2pOlczm17xIw2w==","length":37702,"stub":true}}}},
{"id":"org.apache.cordova.camera","key":"org.apache.cordova.camera","value":{"rev":"16-5a9b03a02090891398698383d07693e4"},"doc":{"_id":"org.apache.cordova.camera","_rev":"16-5a9b03a02090891398698383d07693e4","name":"org.apache.cordova.camera","description":"Cordova Camera Plugin","dist-tags":{"latest":"0.2.6"},"versions":{"0.2.1":{"version":"0.2.1","name":"org.apache.cordova.camera","cordova_name":"Camera","description":"Cordova Camera Plugin","license":"Apache 2.0","keywords":["cordova","camera"],"engines":[],"readme":"cordova-plugin-camera\n==========================\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/plugin_ref_plugman.md.html).\n","readmeFilename":"README.md","_id":"org.apache.cordova.camera@0.2.1","dist":{"shasum":"ce6c53a8bcf407ae89f9074b3dbccbaa2ac15e92","tarball":"http://registry.cordova.io/org.apache.cordova.camera/-/org.apache.cordova.camera-0.2.1.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"anis","email":"anis@adobe.com"},"maintainers":[{"name":"anis","email":"anis@adobe.com"}]},"0.2.3":{"version":"0.2.3","name":"org.apache.cordova.camera","cordova_name":"Camera","description":"Cordova Camera Plugin","license":"Apache 2.0","keywords":["cordova","camera"],"engines":[],"readme":"cordova-plugin-camera\n==========================\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/plugin_ref_plugman.md.html).\n","readmeFilename":"README.md","_id":"org.apache.cordova.camera@0.2.3","dist":{"shasum":"44fa255db34c5fd1d5ad7b3847c0c9928432f2ea","tarball":"http://registry.cordova.io/org.apache.cordova.camera/-/org.apache.cordova.camera-0.2.3.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"anis","email":"anis@adobe.com"},"maintainers":[{"name":"anis","email":"anis@adobe.com"}]},"0.2.4":{"version":"0.2.4","name":"org.apache.cordova.camera","cordova_name":"Camera","description":"Cordova Camera Plugin","license":"Apache 2.0","keywords":["cordova","camera"],"engines":[],"readme":"cordova-plugin-camera\n==========================\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/plugin_ref_plugman.md.html).\n","readmeFilename":"README.md","_id":"org.apache.cordova.camera@0.2.4","dist":{"shasum":"2b30b9bf9aba6f2ab9f4e42e11148bc0e359e18c","tarball":"http://registry.cordova.io/org.apache.cordova.camera/-/org.apache.cordova.camera-0.2.4.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"stevegill","email":"stevengill97@gmail.com"},"maintainers":[{"name":"anis","email":"anis@adobe.com"},{"name":"stevegill","email":"stevengill97@gmail.com"},{"name":"maxw","email":"maxw@chromium.org"},{"name":"agrieve","email":"agrieve@chromium.org"},{"name":"purplecabbage","email":"purplecabbage@gmail.com"}]},"0.2.5":{"version":"0.2.5","name":"org.apache.cordova.camera","cordova_name":"Camera","description":"Cordova Camera Plugin","license":"Apache 2.0","keywords":["cordova","camera"],"engines":[],"readme":"cordova-plugin-camera\n==========================\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/plugin_ref_plugman.md.html).\n","readmeFilename":"README.md","_id":"org.apache.cordova.camera@0.2.5","dist":{"shasum":"619713747e5d256cbee4db1b7cd07fcd5367a65a","tarball":"http://registry.cordova.io/org.apache.cordova.camera/-/org.apache.cordova.camera-0.2.5.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"stevegill","email":"stevengill97@gmail.com"},"maintainers":[{"name":"anis","email":"anis@adobe.com"},{"name":"stevegill","email":"stevengill97@gmail.com"},{"name":"maxw","email":"maxw@chromium.org"},{"name":"agrieve","email":"agrieve@chromium.org"},{"name":"purplecabbage","email":"purplecabbage@gmail.com"}]},"0.2.6":{"version":"0.2.6","name":"org.apache.cordova.camera","cordova_name":"Camera","description":"Cordova Camera Plugin","license":"Apache 2.0","keywords":["cordova","camera"],"engines":[],"readme":"<!---\n license: Licensed to the Apache Software Foundation (ASF) under one\n or more contributor license agreements. See the NOTICE file\n distributed with this work for additional information\n regarding copyright ownership. The ASF licenses this file\n to you under the Apache License, Version 2.0 (the\n \"License\"); you may not use this file except in compliance\n with the License. You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing,\n software distributed under the License is distributed on an\n \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n KIND, either express or implied. See the License for the\n specific language governing permissions and limitations\n under the License.\n-->\n\n# org.apache.cordova.camera\n\nPlugin documentation: [doc/index.md](doc/index.md)\n","readmeFilename":"README.md","_id":"org.apache.cordova.camera@0.2.6","dist":{"shasum":"ad8bc95abb9f305badcd67990962eb7b99842a85","tarball":"http://registry.cordova.io/org.apache.cordova.camera/-/org.apache.cordova.camera-0.2.6.tgz"},"_from":".","_npmVersion":"1.3.4","_npmUser":{"name":"agrieve","email":"agrieve@chromium.org"},"maintainers":[{"name":"anis","email":"anis@adobe.com"},{"name":"stevegill","email":"stevengill97@gmail.com"},{"name":"maxw","email":"maxw@chromium.org"},{"name":"agrieve","email":"agrieve@chromium.org"},{"name":"purplecabbage","email":"purplecabbage@gmail.com"}]}},"readme":"cordova-plugin-camera\n==========================\nTo install this plugin, follow the [Command-line Interface Guide](http://cordova.apache.org/docs/en/edge/guide_cli_index.md.html#The%20Command-line%20Interface).\n\nIf you are not using the Cordova Command-line Interface, follow [Using Plugman to Manage Plugins](http://cordova.apache.org/docs/en/edge/plugin_ref_plugman.md.html).\n","maintainers":[{"name":"anis","email":"anis@adobe.com"},{"name":"stevegill","email":"stevengill97@gmail.com"},{"name":"maxw","email":"maxw@chromium.org"},{"name":"agrieve","email":"agrieve@chromium.org"},{"name":"purplecabbage","email":"purplecabbage@gmail.com"}],"time":{"modified":"2014-01-02T18:16:07.208Z","created":"2013-09-21T10:03:32.952Z","0.2.1":"2013-09-21T10:03:37.191Z","0.2.3":"2013-09-27T07:27:55.953Z","0.2.4":"2013-10-29T18:49:28.266Z","0.2.5":"2013-12-05T01:13:41.034Z","0.2.6":"2014-01-02T18:16:07.208Z"},"_attachments":{"org.apache.cordova.camera-0.2.6.tgz":{"content_type":"application/octet-stream","revpos":15,"digest":"md5-fTi1JEskgX1Up6SsaZE9Ng==","length":113032,"stub":true},"org.apache.cordova.camera-0.2.5.tgz":{"content_type":"application/octet-stream","revpos":13,"digest":"md5-HFB29Rh+0SwKe6k5qZuNDg==","length":113938,"stub":true},"org.apache.cordova.camera-0.2.4.tgz":{"content_type":"application/octet-stream","revpos":10,"digest":"md5-LPDuMNBbx2FhTP4W0TZ4zA==","length":75368,"stub":true},"org.apache.cordova.camera-0.2.3.tgz":{"content_type":"application/octet-stream","revpos":4,"digest":"md5-/uG4oxcvmFYvzDlMPjgiDg==","length":75040,"stub":true},"org.apache.cordova.camera-0.2.1.tgz":{"content_type":"application/octet-stream","revpos":2,"digest":"md5-xdUHBKcChsUuObHSac4z+Q==","length":71905,"stub":true}}}}
]}