window.console=window.console||{};window.console.log=window.console.log||function(){};window.Usergrid=window.Usergrid||{};Usergrid=Usergrid||{};Usergrid.SDK_VERSION="0.10.07";Usergrid.Client=function(a){this.URI=a.URI||"https://api.usergrid.com";if(a.orgName){this.set("orgName",a.orgName)}if(a.appName){this.set("appName",a.appName)}this.buildCurl=a.buildCurl||false;this.logging=a.logging||false;this._callTimeout=a.callTimeout||30000;this._callTimeoutCallback=a.callTimeoutCallback||null;this.logoutCallback=a.logoutCallback||null};Usergrid.Client.prototype.request=function(p,j){var o=this;var a=p.method||"GET";var n=p.endpoint;var c=p.body||{};var f=p.qs||{};var k=p.mQuery||false;var e=this.get("orgName");var d=this.get("appName");if(!k&&!e&&!d){if(typeof(this.logoutCallback)==="function"){return this.logoutCallback(true,"no_org_or_app_name_specified")}}if(k){var b=this.URI+"/"+n}else{var b=this.URI+"/"+e+"/"+d+"/"+n}if(o.getToken()){f.access_token=o.getToken()}var m=encodeParams(f);if(m){b+="?"+m}c=JSON.stringify(c);var l=new XMLHttpRequest();l.open(a,b,true);if(c){l.setRequestHeader("Content-Type","application/json");l.setRequestHeader("Accept","application/json")}l.onerror=function(q){o._end=new Date().getTime();if(o.logging){console.log("success (time: "+o.calcTimeDiff()+"): "+a+" "+b)}if(o.logging){console.log("Error: API call failed at the network level.")}clearTimeout(h);var r=true;if(typeof(j)==="function"){j(r,q)}};l.onload=function(q){o._end=new Date().getTime();if(o.logging){console.log("success (time: "+o.calcTimeDiff()+"): "+a+" "+b)}clearTimeout(h);q=JSON.parse(l.responseText);if(l.status!=200){var r=q.error;var s=q.error_description;if(o.logging){console.log("Error ("+l.status+")("+r+"): "+s)}if((r=="auth_expired_session_token")||(r=="auth_missing_credentials")||(r=="auth_unverified_oath")||(r=="expired_token")||(r=="unauthorized")||(r=="auth_invalid")){if(typeof(o.logoutCallback)==="function"){return o.logoutCallback(true,q)}}if(typeof(j)==="function"){j(true,q)}}else{if(typeof(j)==="function"){j(false,q)}}};var h=setTimeout(function(){l.abort();if(o._callTimeoutCallback==="function"){o._callTimeoutCallback("API CALL TIMEOUT")}else{o.callback("API CALL TIMEOUT")}},o._callTimeout);if(this.logging){console.log("calling: "+a+" "+b)}if(this.buildCurl){var g={uri:b,body:c,method:a};this.buildCurlCall(g)}this._start=new Date().getTime();l.send(c)};Usergrid.Client.prototype.createGroup=function(a,d){var c=a.getOnExist||false;var a={path:a.path,client:this,data:a};var b=new Usergrid.Group(a);b.fetch(function(f,g){var e=(f&&"service_resource_not_found"===g.error||"no_name_specified"===g.error||"null_pointer"===g.error)||(!f&&c);if(e){b.save(function(h,j){if(typeof(d)==="function"){d(h,b)}})}else{if(typeof(d)==="function"){d(f,b)}}})};Usergrid.Client.prototype.createEntity=function(b,d){var c=b.getOnExist||false;var b={client:this,data:b};var a=new Usergrid.Entity(b);a.fetch(function(f,g){var e=(f&&"service_resource_not_found"===g.error||"no_name_specified"===g.error||"null_pointer"===g.error)||(!f&&c);if(e){a.set(b.data);a.save(function(h,j){if(typeof(d)==="function"){d(h,a,j)}})}else{if(typeof(d)==="function"){d(f,a,g)}}})};Usergrid.Client.prototype.getEntity=function(b,c){var b={client:this,data:b};var a=new Usergrid.Entity(b);a.fetch(function(d,e){if(typeof(c)==="function"){c(d,a,e)}})};Usergrid.Client.prototype.restoreEntity=function(c){var d=JSON.parse(c);var b={client:this,data:d};var a=new Usergrid.Entity(b);return a};Usergrid.Client.prototype.createCollection=function(a,c){a.client=this;var b=new Usergrid.Collection(a,function(d,e){if(typeof(c)==="function"){c(d,b,e)}})};Usergrid.Client.prototype.restoreCollection=function(a){var b=JSON.parse(a);b.client=this;var c=new Usergrid.Collection(b);return c};Usergrid.Client.prototype.getFeedForUser=function(c,b){var a={method:"GET",endpoint:"users/"+c+"/feed"};this.request(a,function(d,e){if(typeof(b)==="function"){if(d){b(d)}else{b(d,e,e.entities)}}})};Usergrid.Client.prototype.createUserActivity=function(b,c,d){c.type="users/"+b+"/activities";var c={client:this,data:c};var a=new Usergrid.Entity(c);a.save(function(e,f){if(typeof(d)==="function"){d(e,a)}})};Usergrid.Client.prototype.createUserActivityWithEntity=function(a,c,e){var d=a.get("username");var b={actor:{displayName:d,uuid:a.get("uuid"),username:d,email:a.get("email"),picture:a.get("picture"),image:{duration:0,height:80,url:a.get("picture"),width:80},},verb:"post",content:c};this.createUserActivity(d,b,e)};Usergrid.Client.prototype.calcTimeDiff=function(){var c=0;var b=this._end-this._start;try{c=((b/10)/60).toFixed(2)}catch(a){return 0}return c};Usergrid.Client.prototype.setToken=function(a){this.set("token",a)};Usergrid.Client.prototype.getToken=function(){return this.get("token")};Usergrid.Client.prototype.setObject=function(a,b){if(b){b=JSON.stringify(b)}this.set(a,b)};Usergrid.Client.prototype.set=function(b,c){var a="apigee_"+b;this[b]=c;if(typeof(Storage)!=="undefined"){if(c){localStorage.setItem(a,c)}else{localStorage.removeItem(a)}}};Usergrid.Client.prototype.getObject=function(a){return JSON.parse(this.get(a))};Usergrid.Client.prototype.get=function(b){var a="apigee_"+b;if(this[b]){return this[b]}else{if(typeof(Storage)!=="undefined"){return localStorage.getItem(a)}}return null};Usergrid.Client.prototype.signup=function(g,e,d,c,f){var a=this;var b={type:"users",username:g,password:e,email:d,name:c};this.createEntity(b,f)};Usergrid.Client.prototype.login=function(e,c,d){var a=this;var b={method:"POST",endpoint:"token",body:{username:e,password:c,grant_type:"password"}};this.request(b,function(h,j){var f={};if(h&&a.logging){console.log("error trying to log user in")}else{var g={client:a,data:j.user};f=new Usergrid.Entity(g);a.setToken(j.access_token)}if(typeof(d)==="function"){d(h,j,f)}})};Usergrid.Client.prototype.reAuthenticateLite=function(c){var a=this;var b={method:"GET",endpoint:"management/me",mQuery:true};this.request(b,function(e,d){if(e&&a.logging){console.log("error trying to re-authenticate user")}else{a.setToken(d.access_token)}if(typeof(c)==="function"){c(e)}})};Usergrid.Client.prototype.reAuthenticate=function(c,d){var a=this;var b={method:"GET",endpoint:"management/users/"+c,mQuery:true};this.request(b,function(k,l){var f={};var j={};var m={};if(k&&a.logging){console.log("error trying to full authenticate user")}else{var n=l.data;a.setToken(n.token);a.set("email",n.email);localStorage.setItem("accessToken",n.token);localStorage.setItem("userUUID",n.uuid);localStorage.setItem("userEmail",n.email);var g={username:n.username,email:n.email,name:n.name,uuid:n.uuid};var q={client:a,data:g};m=new Usergrid.Entity(q);f=n.organizations;var p="";try{var h=a.get("orgName");p=(f[h])?f[h]:f[Object.keys(f)[0]];a.set("orgName",p.name)}catch(o){k=true;if(a.logging){console.log("error selecting org")}}j=a.parseApplicationsArray(p);a.selectFirstApp(j);a.setObject("organizations",f);a.setObject("applications",j)}if(typeof(d)==="function"){d(k,n,m,f,j)}})};Usergrid.Client.prototype.loginFacebook=function(a,d){var b=this;var c={method:"GET",endpoint:"auth/facebook",qs:{fb_access_token:a}};this.request(c,function(g,h){var e={};if(g&&b.logging){console.log("error trying to log user in")}else{var f={client:b,data:h.user};e=new Usergrid.Entity(f);b.setToken(h.access_token)}if(typeof(d)==="function"){d(g,h,e)}})};Usergrid.Client.prototype.getLoggedInUser=function(c){if(!this.getToken()){c(true,null,null)}else{var a=this;var b={method:"GET",endpoint:"users/me"};this.request(b,function(f,g){if(f){if(a.logging){console.log("error trying to log user in")}if(typeof(c)==="function"){c(f,g,null)}}else{var e={client:a,data:g.entities[0]};var d=new Usergrid.Entity(e);if(typeof(c)==="function"){c(f,g,d)}}})}};Usergrid.Client.prototype.isLoggedIn=function(){if(this.getToken()){return true}return false};Usergrid.Client.prototype.logout=function(){this.setToken(null)};Usergrid.Client.prototype.buildCurlCall=function(c){var b="curl";var e=(c.method||"GET").toUpperCase();var a=c.body||{};var d=c.uri;if(e==="POST"){b+=" -X POST"}else{if(e==="PUT"){b+=" -X PUT"}else{if(e==="DELETE"){b+=" -X DELETE"}else{b+=" -X GET"}}}b+=" "+d;if(a!=='"{}"'&&e!=="GET"&&e!=="DELETE"){b+=" -d '"+a+"'"}console.log(b);return b};Usergrid.Client.prototype.getDisplayImage=function(a,c,b){try{if(c){return c}var b=b||50;if(a.length){return"https://secure.gravatar.com/avatar/"+MD5(a)+"?s="+b+encodeURI("&d=https://apigee.com/usergrid/images/user_profile.png")}else{return"https://apigee.com/usergrid/images/user_profile.png"}}catch(d){return"https://apigee.com/usergrid/images/user_profile.png"}};Usergrid.Entity=function(a){if(a){this._data=a.data||{};this._client=a.client||{}}};Usergrid.Entity.prototype.serialize=function(){return JSON.stringify(this._data)};Usergrid.Entity.prototype.get=function(a){if(a){return this._data[a]}else{return this._data}};Usergrid.Entity.prototype.set=function(a,b){if(typeof a==="object"){for(var c in a){this._data[c]=a[c]}}else{if(typeof a==="string"){if(b===null){delete this._data[a]}else{this._data[a]=b}}else{this._data={}}}};Usergrid.Entity.prototype.save=function(h){var c=this.get("type");var g="POST";if(isUUID(this.get("uuid"))){g="PUT";c+="/"+this.get("uuid")}var a=this;var e={};var f=this.get();for(var d in f){if(d==="metadata"||d==="created"||d==="modified"||d==="type"||d==="activated"||d==="uuid"){continue}e[d]=f[d]}var b={method:g,endpoint:c,body:e};this._client.request(b,function(n,k){if(n&&a._client.logging){console.log("could not save entity");if(typeof(h)==="function"){return h(n,k,a)}}else{if(k.entities){if(k.entities.length){var j=k.entities[0];a.set(j);var p=k.path;while(p.substring(0,1)==="/"){p=p.substring(1)}a.set("type",p)}}var o=((a.get("type")==="user"||a.get("type")==="users")&&f.oldpassword&&f.newpassword);if(o){var m={};m.oldpassword=f.oldpassword;m.newpassword=f.newpassword;var l={method:"PUT",endpoint:c+"/password",body:m};a._client.request(l,function(q,r){if(q&&a._client.logging){console.log("could not update user")}a.set("oldpassword",null);a.set("newpassword",null);if(typeof(h)==="function"){h(q,r,a)}})}else{if(typeof(h)==="function"){h(n,k,a)}}}})};Usergrid.Entity.prototype.fetch=function(e){var d=this.get("type");var a=this;if(this.get("uuid")){d+="/"+this.get("uuid")}else{if(d==="users"){if(this.get("username")){d+="/"+this.get("username")}else{if(typeof(e)==="function"){var c="no_name_specified";if(a._client.logging){console.log(c)}return e(true,{error:c},a)}}}else{if(d==="a path"){if(this.get("path")){d+="/"+encodeURIComponent(this.get("name"))}else{if(typeof(e)==="function"){var c="no_name_specified";if(a._client.logging){console.log(c)}return e(true,{error:c},a)}}}else{if(this.get("name")){d+="/"+encodeURIComponent(this.get("name"))}else{if(typeof(e)==="function"){var c="no_name_specified";if(a._client.logging){console.log(c)}return e(true,{error:c},a)}}}}}var b={method:"GET",endpoint:d};this._client.request(b,function(g,h){if(g&&a._client.logging){console.log("could not get entity")}else{if(h.user){a.set(h.user);a._json=JSON.stringify(h.user,null,2)}else{if(h.entities){if(h.entities.length){var f=h.entities[0];a.set(f)}}}}if(typeof(e)==="function"){e(g,h,a)}})};Usergrid.Entity.prototype.destroy=function(e){var d=this.get("type");if(isUUID(this.get("uuid"))){d+="/"+this.get("uuid")}else{if(typeof(e)==="function"){var c="Error trying to delete object - no uuid specified.";if(a._client.logging){console.log(c)}e(true,c)}}var a=this;var b={method:"DELETE",endpoint:d};this._client.request(b,function(f,g){if(f&&a._client.logging){console.log("entity could not be deleted")}else{a.set(null)}if(typeof(e)==="function"){e(f,g)}})};Usergrid.Entity.prototype.connect=function(a,d,h){var k=this;var f=d.get("type");var c=this.getEntityId(d);if(!c){if(typeof(h)==="function"){var g="Error trying to delete object - no uuid specified.";if(k._client.logging){console.log(g)}h(true,g)}return}var e=this.get("type");var b=this.getEntityId(this);if(!b){if(typeof(h)==="function"){var g="Error in connect - no uuid specified.";if(k._client.logging){console.log(g)}h(true,g)}return}var j=e+"/"+b+"/"+a+"/"+f+"/"+c;var l={method:"POST",endpoint:j};this._client.request(l,function(m,n){if(m&&k._client.logging){console.log("entity could not be connected")}if(typeof(h)==="function"){h(m,n)}})};Usergrid.Entity.prototype.getEntityId=function(a){var b=false;if(isUUID(a.get("uuid"))){b=a.get("uuid")}else{if(type==="users"){b=a.get("username")}else{if(a.get("name")){b=a.get("name")}}}return b};Usergrid.Entity.prototype.getConnections=function(d,h){var c=this;var b=this.get("type");var a=this.getEntityId(this);if(!a){if(typeof(h)==="function"){var f="Error in getConnections - no uuid specified.";if(c._client.logging){console.log(f)}h(true,f)}return}var g=b+"/"+a+"/"+d+"/";var e={method:"GET",endpoint:g};this._client.request(e,function(l,m){if(l&&c._client.logging){console.log("entity could not be connected")}c[d]={};var k=m.entities.length;for(var j=0;j<k;j++){if(m.entities[j].type==="user"){c[d][m.entities[j].username]=m.entities[j]}else{c[d][m.entities[j].name]=m.entities[j]}}if(typeof(h)==="function"){h(l,m,m.entities)}})};Usergrid.Entity.prototype.getGroups=function(d){var a=this;var c="users/"+this.get("uuid")+"/groups";var b={method:"GET",endpoint:c};this._client.request(b,function(e,f){if(e&&a._client.logging){console.log("entity could not be connected")}a.groups=f.entities;if(typeof(d)==="function"){d(e,f,f.entities)}})};Usergrid.Entity.prototype.getActivities=function(d){var a=this;var c=this.get("type")+"/"+this.get("uuid")+"/activities";var b={method:"GET",endpoint:c};this._client.request(b,function(e,f){if(e&&a._client.logging){console.log("entity could not be connected")}for(entity in f.entities){f.entities[entity].createdDate=(new Date(f.entities[entity].created)).toUTCString()}a.activities=f.entities;if(typeof(d)==="function"){d(e,f,f.entities)}})};Usergrid.Entity.prototype.getFollowing=function(d){var a=this;var c="users/"+this.get("uuid")+"/following";var b={method:"GET",endpoint:c};this._client.request(b,function(e,f){if(e&&a._client.logging){console.log("could not get user following")}for(entity in f.entities){f.entities[entity].createdDate=(new Date(f.entities[entity].created)).toUTCString();var g=a._client.getDisplayImage(f.entities[entity].email,f.entities[entity].picture);f.entities[entity]._portal_image_icon=g}a.following=f.entities;if(typeof(d)==="function"){d(e,f,f.entities)}})};Usergrid.Entity.prototype.getFollowers=function(d){var a=this;var c="users/"+this.get("uuid")+"/followers";var b={method:"GET",endpoint:c};this._client.request(b,function(e,f){if(e&&a._client.logging){console.log("could not get user followers")}for(entity in f.entities){f.entities[entity].createdDate=(new Date(f.entities[entity].created)).toUTCString();var g=a._client.getDisplayImage(f.entities[entity].email,f.entities[entity].picture);f.entities[entity]._portal_image_icon=g}a.followers=f.entities;if(typeof(d)==="function"){d(e,f,f.entities)}})};Usergrid.Entity.prototype.getRoles=function(d){var a=this;var c=this.get("type")+"/"+this.get("uuid")+"/roles";var b={method:"GET",endpoint:c};this._client.request(b,function(e,f){if(e&&a._client.logging){console.log("could not get user roles")}a.roles=f.entities;if(typeof(d)==="function"){d(e,f,f.entities)}})};Usergrid.Entity.prototype.getPermissions=function(d){var a=this;var c=this.get("type")+"/"+this.get("uuid")+"/permissions";var b={method:"GET",endpoint:c};this._client.request(b,function(g,m){if(g&&a._client.logging){console.log("could not get user permissions")}var p=[];if(m.data){var r=m.data;var o=0;for(var n in r){o++;var h=r[n];var l=h.split(":");var s="";var q=l[0];if(l.length>1){s=l[0];q=l[1]}s.replace("*","get,post,put,delete");var e=s.split(",");var f={};f.get="no";f.post="no";f.put="no";f["delete"]="no";for(var k in e){f[e[k]]="yes"}p.push({operations:f,path:q,perm:h})}}a.permissions=p;if(typeof(d)==="function"){d(g,m,m.entities)}})};Usergrid.Entity.prototype.disconnect=function(a,d,h){var k=this;var f=d.get("type");var c=this.getEntityId(d);if(!c){if(typeof(h)==="function"){var g="Error trying to delete object - no uuid specified.";if(k._client.logging){console.log(g)}h(true,g)}return}var e=this.get("type");var b=this.getEntityId(this);if(!b){if(typeof(h)==="function"){var g="Error in connect - no uuid specified.";if(k._client.logging){console.log(g)}h(true,g)}return}var j=e+"/"+b+"/"+a+"/"+f+"/"+c;var l={method:"DELETE",endpoint:j};this._client.request(l,function(m,n){if(m&&k._client.logging){console.log("entity could not be disconnected")}if(typeof(h)==="function"){h(m,n)}})};Usergrid.Collection=function(b,e){if(b){this._client=b.client;this._type=b.type;this.qs=b.qs||{};this._list=b.list||[];this._iterator=b.iterator||-1;this._previous=b.previous||[];this._next=b.next||null;this._cursor=b.cursor||null;if(b.list){var d=b.list.length;for(var c=0;c<d;c++){var a=this._client.restoreEntity(b.list[c]);this._list[c]=a}}}if(e){this.fetch(e)}};Usergrid.Collection.prototype.serialize=function(){var c={};c.type=this._type;c.qs=this.qs;c.iterator=this._iterator;c.previous=this._previous;c.next=this._next;c.cursor=this._cursor;this.resetEntityPointer();var b=0;c.list=[];while(this.hasNextEntity()){var a=this.getNextEntity();c.list[b]=a.serialize();b++}c=JSON.stringify(c);return c};Usergrid.Collection.prototype.addCollection=function(b,a,d){self=this;a.client=this._client;var c=new Usergrid.Collection(a,function(g,h){if(typeof(d)==="function"){c.resetEntityPointer();while(c.hasNextEntity()){var e=c.getNextEntity();var f=e.get("email");var j=self._client.getDisplayImage(e.get("email"),e.get("picture"));e._portal_image_icon=j}self[b]=c;d(g,c)}})};Usergrid.Collection.prototype.fetch=function(d){var b=this;var a=this.qs;if(this._cursor){a.cursor=this._cursor}else{delete a.cursor}var c={method:"GET",endpoint:this._type,qs:this.qs};this._client.request(c,function(g,h){if(g&&b._client.logging){console.log("error getting collection")}else{var o=h.cursor||null;b.saveCursor(o);if(h.entities){b.resetEntityPointer();var l=h.entities.length;b._list=[];for(var j=0;j<l;j++){var e=h.entities[j].uuid;if(e){var f=h.entities[j]||{};b._baseType=h.entities[j].type;f.type=b._type;var n={type:b._type,client:b._client,uuid:e,data:f};var m=new Usergrid.Entity(n);m._json=JSON.stringify(f,null,2);var k=b._list.length;b._list[k]=m}}}}if(typeof(d)==="function"){d(g,h)}})};Usergrid.Collection.prototype.addEntity=function(b,c){var a=this;b.type=this._type;this._client.createEntity(b,function(f,d){if(!f){var e=a._list.length;a._list[e]=d}if(typeof(c)==="function"){c(f,d)}})};Usergrid.Collection.prototype.addExistingEntity=function(a){var b=this._list.length;this._list[b]=a};Usergrid.Collection.prototype.destroyEntity=function(b,c){var a=this;b.destroy(function(d,e){if(d){if(a._client.logging){console.log("could not destroy entity")}if(typeof(c)==="function"){c(d,e)}}else{a.fetch(c)}});this.removeEntity(b)};Usergrid.Collection.prototype.removeEntity=function(a){var b=a.get("uuid");for(key in this._list){var c=this._list[key];if(c.get("uuid")===b){return this._list.splice(key,1)}}return false};Usergrid.Collection.prototype.getEntityByUUID=function(c,e){for(key in this._list){var d=this._list[key];if(d.get("uuid")===c){return d}}var b={data:{type:this._type,uuid:c},client:this._client};var a=new Usergrid.Entity(b);a.fetch(e)};Usergrid.Collection.prototype.getFirstEntity=function(){var a=this._list.length;if(a>0){return this._list[0]}return null};Usergrid.Collection.prototype.getLastEntity=function(){var a=this._list.length;if(a>0){return this._list[a-1]}return null};Usergrid.Collection.prototype.hasNextEntity=function(){var a=this._iterator+1;var b=(a>=0&&a<this._list.length);if(b){return true}return false};Usergrid.Collection.prototype.getNextEntity=function(){this._iterator++;var a=(this._iterator>=0&&this._iterator<=this._list.length);if(a){return this._list[this._iterator]}return false};Usergrid.Collection.prototype.hasPrevEntity=function(){var b=this._iterator-1;var a=(b>=0&&b<this._list.length);if(a){return true}return false};Usergrid.Collection.prototype.getPrevEntity=function(){this._iterator--;var a=(this._iterator>=0&&this._iterator<=this._list.length);if(a){return this.list[this._iterator]}return false};Usergrid.Collection.prototype.resetEntityPointer=function(){this._iterator=-1};Usergrid.Collection.prototype.saveCursor=function(a){if(this._next!==a){this._next=a}};Usergrid.Collection.prototype.resetPaging=function(){this._previous=[];this._next=null;this._cursor=null};Usergrid.Collection.prototype.hasNextPage=function(){return(this._next)};Usergrid.Collection.prototype.getNextPage=function(a){if(this.hasNextPage()){this._previous.push(this._cursor);this._cursor=this._next;this._list=[];this.fetch(a)}};Usergrid.Collection.prototype.hasPreviousPage=function(){return(this._previous.length>0)};Usergrid.Collection.prototype.getPreviousPage=function(a){if(this.hasPreviousPage()){this._next=null;this._cursor=this._previous.pop();this._list=[];this.fetch(a)}};Usergrid.Group=function(a,b){this._path=a.path;this._list=[];this._client=a.client;this._data=a.data||{};this._data.type="groups"};Usergrid.Group.prototype=new Usergrid.Entity();Usergrid.Group.prototype.fetch=function(f){var a=this;var e="groups/"+this._path;var d="groups/"+this._path+"/users";var b={method:"GET",endpoint:e};var c={method:"GET",endpoint:d};this._client.request(b,function(h,j){if(h){if(a._client.logging){console.log("error getting group")}if(typeof(f)==="function"){f(h,j)}}else{if(j.entities){var g=j.entities[0];a._data=g||{};a._client.request(c,function(p,q){if(p&&a._client.logging){console.log("error getting group users")}else{if(q.entities){var o=q.entities.length;a._list=[];for(var l=0;l<o;l++){var n=q.entities[l].uuid;if(n){var r=q.entities[l]||{};var m={type:r.type,client:a._client,uuid:n,data:r};var k=new Usergrid.Entity(m);a._list.push(k)}}}}if(typeof(f)==="function"){f(p,q,a._list)}})}}})};Usergrid.Group.prototype.members=function(a){if(typeof(a)==="function"){a(null,this._list)}};Usergrid.Group.prototype.add=function(b,c){var a=this;var b={method:"POST",endpoint:"groups/"+this._path+"/users/"+b.user.get("username")};this._client.request(b,function(d,e){if(d){if(typeof(c)==="function"){c(d,e,e.entities)}}else{a.fetch(c)}})};Usergrid.Group.prototype.remove=function(b,c){var a=this;var b={method:"DELETE",endpoint:"groups/"+this._path+"/users/"+b.user.get("username")};this._client.request(b,function(d,e){if(d){if(typeof(c)==="function"){c(d,e)}}else{a.fetch(c)}})};Usergrid.Group.prototype.feed=function(d){var a=this;var c="groups/"+this._path+"/feed";var b={method:"GET",endpoint:c};this._client.request(b,function(e,f){if(e&&a.logging){console.log("error trying to log user in")}if(typeof(d)==="function"){d(e,f,f.entities)}})};Usergrid.Group.prototype.createGroupActivity=function(c,d){var b=c.user;var c={actor:{displayName:b.get("username"),uuid:b.get("uuid"),username:b.get("username"),email:b.get("email"),picture:b.get("picture"),image:{duration:0,height:80,url:b.get("picture"),width:80},},verb:"post",content:c.content};c.type="groups/"+this._path+"/activities";var c={client:this._client,data:c};var a=new Usergrid.Entity(c);a.save(function(e,f){if(typeof(d)==="function"){d(e,a)}})};function isUUID(a){var b=/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;if(!a){return false}return b.test(a)}function encodeParams(d){tail=[];var b=[];if(d instanceof Array){for(i in d){b=d[i];if((b instanceof Array)&&(b.length>1)){tail.push(b[0]+"="+encodeURIComponent(b[1]))}}}else{for(var a in d){if(d.hasOwnProperty(a)){var c=d[a];if(c instanceof Array){for(i in c){b=c[i];tail.push(a+"="+encodeURIComponent(b))}}else{tail.push(a+"="+encodeURIComponent(c))}}}}return tail.join("&")};