{"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}}}}
]}