changeorgapi.min.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // Change.org JavaScript API (c) 2014 Rick Buczynski. Under MIT License.
  2. var ChangeOrgApiUtils={debugMode:false,lastTimestamp:0,proxy:'',addParams:function(url,params){if(typeof url=='string'){var body=[],parts=url.split('?');if(typeof params=='string')
  3. params=this.expandRequest(params);if(parts.length>1)
  4. params=this.extend(this.expandRequest(parts.pop()),params||{});for(var key in params)
  5. body.push(key+'='+encodeURIComponent(params[key]));return url.split('?').shift()+'?'+body.join('&');}},bind:function(input,data){if(typeof data!='object')
  6. data=[data];if(typeof input=='string'&&typeof data=='object'){for(var key in data){if(data instanceof Array)
  7. input=input.replace(new RegExp(':[a-zA-Z0-9_]+'),new String(data[key]));else
  8. input=input.replace(new RegExp(':'+key,'g'),new String(data[key]));}}
  9. return input;},expandRequest:function(data,targetForm){var parts=data.split('&'),pair,data={};for(var i=0;i<parts.length;i++){if(!parts[0])
  10. continue;pair=parts[i].split('=');data[pair[0]]=decodeURIComponent(pair[1]);if(targetForm){var element=document.createElement('input');element.type='hidden';element.name=pair[0];element.value=data[pair[0]];targetForm.appendChild(element);}}
  11. return data;},extend:function(){var objects=arguments,object={};for(var i=0;i<objects.length;i++){if(objects[i]){for(var property in objects[i])
  12. object[property]=objects[i][property];}}
  13. return object;},getKey:function(prefix,suffix){if(!prefix)
  14. prefix='';if(!suffix)
  15. suffix='';var min=(this.lastTimestamp?this.lastTimestamp:(new Date()).getTime()),max=this.lastTimestamp=(new Date()).getTime()+1;return prefix+(Math.floor(Math.random()*(max-min+1))+min).toString()+suffix;},lamda:function(){},};var ChangeOrgApiException=function(message){return{name:'ChangeOrgApiException','message':message,toString:function(){return this.name+': '+this.message;}};};var ChangeOrgApiClient=function(data){this._data={};this._getDefaults=function(){return{api_key:'',secret:''};};this.getApiKey=function(){return this._data.api_key;};this.getSecret=function(){return this._data.secret;};this.setApiKey=function(apiKey){this._data[api_key]=apiKey;return this;};this.setSecret=function(secret){this._data[secret]=secret;return this;};this._data=this._getDefaults();if(typeof data=='object'){for(var key in data){this._data[key]=data[key];}}};var ChangeOrgApiConnection=function(options){this._api='https://api.change.org';this._data={};this._connection=null;this._params={};this._proxy='';this._getDefaults=function(){return{content_type:'application/x-www-form-urlencoded',endpoint:'',method:'GET',onSuccess:ChangeOrgApiUtils.lambda};};this._getEndpoint=function(endpointOnly){var params=[];for(var key in this._params)
  16. params.push(key+'='+encodeURIComponent(this._params[key]));params=(params.length?'?':'')+params.join('&');return((endpointOnly?'':this._api)
  17. +this._data.endpoint
  18. +params);};this._getEndpointProxied=function(data){return ChangeOrgApiUtils.addParams(this._proxy,{r:this._getEndpoint(),p:data,m:this._data.method,c:this._data.content_type,d:ChangeOrgApiUtils.debugMode?'1':'0'});};this._getXmlHttpRequest=function(data){var object=new XMLHttpRequest();var self=this;object.onreadystatechange=function(){if(self.getIsDone()){var response=new ChangeOrgApiResponse(self);data.onSuccess.call(null,response);}};return object;};this._prepareConnection=function(){this._connection=this._getXmlHttpRequest(this._data);return this;};this.getConnection=function(){return this._connection;};this.getContentType=function(){return this._data.content_type;};this.getEndpoint=function(withParams){return(withParams?this._getEndpoint(true):this._data.endpoint);};this.getHasReceivedHeaders=function(){return(this._connection.readyState===2);};this.getIsDone=function(){return(this._connection.readyState===4);};this.getIsLoading=function(){return(this._connection.readyState===3);};this.getIsOpened=function(){return(this._connection.readyState===1);};this.getIsUnsent=function(){return(this._connection.readyState===0);};this.getMethod=function(){return this._data.method;};this.getOnSuccess=function(){return this._data.onSuccess;};this.getParams=function(){return this._params;};this.getResponse=function(){var response=null;try{response=JSON.parse(this._connection.responseText);}
  19. catch(error){response=null;}
  20. return response;};this.getReadyState=function(){return this._connection.readyState;};this.getStatus=function(){return this._connection.status;}
  21. this.send=function(data){if(!this._connection||this.getIsUnsent())
  22. this._prepareConnection();if(!this.getIsOpened()){var endpoint=this._getEndpoint();if(this._proxy){endpoint=this._getEndpointProxied(data);this._data.method='GET';}
  23. this._connection.open(this._data.method,endpoint,true);}
  24. if(this._connection.setRequestHeader)
  25. this._connection.setRequestHeader('Content-type',this._data.content_type);this._connection.send(data);return this;};this.setApi=function(url){this._api=url;return this;}
  26. this.setContentType=function(contentType){this._data.content_type=contentType;return this;};this.setEndpoint=function(endpoint,params){this._data.endpoint=endpoint;if(typeof params=='object')
  27. this._params=params;return this;};this.setMethod=function(method){this._data.method=method.toUpperCase();return this;};this.setOnSuccess=function(callback){if(typeof callback=='function')
  28. this._data.onSuccess=callback;return this;};this.setParams=function(params){this._params=params;return this;};this._data=this._getDefaults();if(typeof options=='object'){for(var key in options){if(typeof this._data[key]!='undefined')
  29. this._data[key]=options[key];}}
  30. if(ChangeOrgApiUtils.proxy)
  31. this._proxy=ChangeOrgApiUtils.proxy;};var ChangeOrgApiRequest=function(client){this._authKey=null;this._connection=null;this._data={};this._useSignature=true;this._useAuthKeyInSignature=true;this._getDefaults=function(){return{api_key:'',endpoint:'',timestamp:''};};this.addClient=function(){this._data.api_key=this._client.getApiKey();return this;};this.addData=function(data){if(typeof this._data=='object'){for(var key in data){if(key=='auth_key')
  32. this.setAuthKey(data[key]);else
  33. this._data[key]=data[key];}}
  34. return this;};this.addSignature=function(){try{if(!this.getClient().getSecret()&&this.getSignatureRequiredFlag()){this._data.server_sign=1;this._data.include_auth_key=this.getSignatureAuthKeyRequiredFlag()?1:0;if(this._data.include_auth_key)
  35. this._data.auth_key=this._authKey;}
  36. else if(typeof this._data.rsig=='undefined'||!this._data.rsig.length){var body=[],signature='';for(var key in this._data){if(key!='rsig')
  37. body.push(key+'='+encodeURIComponent(this._data[key]));}
  38. this._data.rsig=CryptoJS.SHA256(body.join('&')
  39. +this.getClient().getSecret()
  40. +(this._useAuthKeyInSignature===true?this._authKey:''));}}
  41. catch(error){}
  42. return this;};this.addTimestamp=function(){this._data.timestamp=this.newTimestamp();return this;};this.buildRequest=function(){this.addClient();this.addTimestamp();if(this._useSignature===true)
  43. this.addSignature();else if(typeof this._data.rsig!='undefined')
  44. delete this._data.rsig;var body=[];for(var key in this._data)
  45. body.push(key+'='+encodeURIComponent(this._data[key]));return body.join('&');};this.getAuthKey=function(){return this._authKey;};this.getClient=function(){return this._client;};this.getConnection=function(options){if(!this._connection)
  46. this._connection=new ChangeOrgApiConnection(options);return this._connection;};this.getData=function(key){if(!key)
  47. return this._data;if(typeof this._data[key]!='undefined')
  48. return this._data[key];return null;};this.getEndpoint=function(){return this._data.endpoint;};this.getMethod=function(){return this.getConnection().getMethod();};this.getSignatureAuthKeyRequiredFlag=function(){return this._useAuthKeyInSignature;};this.getSignatureRequiredFlag=function(){return this._useSignature;};this.getTimestamp=function(){return this._data.timestamp;};this.newTimestamp=function(){return(new Date()).toISOString().replace(/(\.[0-9]+)/,'');};this.resetConnection=function(){this._connection=null;return this;};this.removeSignature=function(){if(typeof this._data.rsig!='undefined')
  49. delete this._data.rsig;return this;};this.send=function(){var connection=this.getConnection();connection.setEndpoint(this._data.endpoint);if(this._doFollowup===true)
  50. this._setFollowupCallback();this.getConnection().send(this.buildRequest());return this;};this.setAuthKey=function(authKey){this._authKey=authKey;return this;};this.setClient=function(client){if(!(client instanceof ChangeOrgApiClient))
  51. throw new ChangeOrgApiException('Client must be an instance of ChangeOrgApiClient.');this._client=client;return this;};this.setData=function(key,value){this._data[key]=value;return this;};this.setEndpoint=function(endpoint){this._data.endpoint=endpoint;return this;};this.setMethod=function(method){this.getConnection().setMethod(method);return this;};this.setOnSuccess=function(handler){this.getConnection().setOnSuccess(handler);return this;};this.setSignatureAuthKeyRequiredFlag=function(bool){this._useAuthKeyInSignature=bool;return this;};this.setSignatureRequiredFlag=function(bool){this._useSignature=bool;return this;};this.setTimestamp=function(timestamp){this._data.timestamp=timestamp;return this;};this.unsetData=function(key){if(typeof this._data[key]!='undefined')
  52. delete this._data[key];return this;};if(typeof CryptoJS=='undefined')
  53. throw new ChangeOrgApiException('ChangeOrgApiRequest cannot initialize because the required library CryptoJS was not found.');if(client)
  54. this.setClient(client);this._data=this._getDefaults();};var ChangeOrgApiResponse=function(data){this._data={};this.getData=function(key){if(!key)
  55. return this._data;if(typeof this._data[key]!='undefined')
  56. return this._data[key];return null;};this.setData=function(data){try{if(data instanceof ChangeOrgApiConnection)
  57. this._data=data.getResponse();else if(typeof data=='string')
  58. this._data=JSON.parse(data);else if(typeof data=='object')
  59. this._data=data;else
  60. throw new ChangeOrgApiException('Data format not recognized.');}
  61. catch(error){this._data={};}
  62. return this;}
  63. this.setData(data);};var ChangeOrgApiPetition=function(client){this._authorization=null;this._callback=null;this._client=null;this._endpoints=['/v1/petitions/:petition_id/signatures','/v1/petitions/:petition_id/signatures','/v1/petitions/:petition_id/signatures/recent','/v1/petitions/:petition_id/targets','/v1/petitions/:petition_id/reasons','/v1/petitions/:petition_id/updates','/v1/petitions','/v1/petitions/:petition_id','/v1/petitions/get_id'];this._getDefaults=function(){return{};};this.addSignature=function(data,callback){if(typeof data.auth_key=='undefined')
  64. throw new ChangeOrgApiException('An authorization key is required to sign a petition.');var request=new ChangeOrgApiRequest(this.getClient()).setMethod('POST').addData(data).setEndpoint(this.getEndpoint(0,data));if(callback)
  65. request.setOnSuccess(callback);else if(this._callback)
  66. request.setOnSuccess(this._callback);request.send();return this;};this.getAuthorization=function(){if(!this._authorization){this._authorization=new ChangeOrgApiPetitionAuthorization(this._client);}
  67. return this._authorization;};this.getClient=function(){return this._client;};this.getEndpoint=function(index,data){if(typeof this._endpoints[index]=='undefined')
  68. return false;return ChangeOrgApiUtils.bind(this._endpoints[index],data);};this.get=function(data,callback){if(typeof data=='number'||typeof data=='string')
  69. data={petition_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(7,data)).setSignatureRequiredFlag(false);if(callback)
  70. request.setOnSuccess(callback);else if(this._callback)
  71. request.setOnSuccess(this._callback);request.send();return this;};this.getId=function(data,callback){if(typeof data=='string')
  72. data={petition_url:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(8,data)).setSignatureRequiredFlag(false);if(callback)
  73. request.setOnSuccess(callback);else if(this._callback)
  74. request.setOnSuccess(this._callback);request.send();return this;};this.getPetitions=function(data,callback){if(typeof data=='number')
  75. return this.getPetition(data,callback);if(typeof data=='string')
  76. data={petition_ids:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(6,data)).setSignatureRequiredFlag(false);if(callback)
  77. request.setOnSuccess(callback);else if(this._callback)
  78. request.setOnSuccess(this._callback);request.send();return this;};this.getRecentSignatures=function(data,callback){if(typeof data=='number'||typeof data=='string')
  79. data={petition_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(2,data)).setSignatureRequiredFlag(false);if(callback)
  80. request.setOnSuccess(callback);else if(this._callback)
  81. request.setOnSuccess(this._callback);request.send();};this.getSignatures=function(data,callback){if(typeof data=='number'||typeof data=='string')
  82. data={petition_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(1,data)).setSignatureRequiredFlag(false);if(callback)
  83. request.setOnSuccess(callback);else if(this._callback)
  84. request.setOnSuccess(this._callback);request.send();return this;};this.getReasons=function(data,callback){if(typeof data=='number'||typeof data=='string')
  85. data={petition_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(4,data)).setSignatureRequiredFlag(false);if(callback)
  86. request.setOnSuccess(callback);else if(this._callback)
  87. request.setOnSuccess(this._callback);request.send();return this;};this.getTargets=function(data,callback){if(typeof data=='number'||typeof data=='string')
  88. data={petition_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(3,data)).setSignatureRequiredFlag(false);if(callback)
  89. request.setOnSuccess(callback);else if(this._callback)
  90. request.setOnSuccess(this._callback);request.send();return this;};this.getUpdates=function(data,callback){if(typeof data=='number'||typeof data=='string')
  91. data={petition_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(5,data)).setSignatureRequiredFlag(false);if(callback)
  92. request.setOnSuccess(callback);else if(this._callback)
  93. request.setOnSuccess(this._callback);request.send();};this.setCallback=function(callback){this._callback=callback;return this;};this.setClient=function(client){if(!(client instanceof ChangeOrgApiClient))
  94. throw new ChangeOrgApiException('Client must be an instance of ChangeOrgApiClient.');this._client=client;return this;};if(client)
  95. this.setClient(client);};var ChangeOrgApiPetitionAuthorization=function(client){this._authorizationCallback=ChangeOrgApiUtils.lambda;this._client=null;this._connection=null;this._data={};this._doFollowup=false;this._endpoint='/v1/petitions/:petition_id/auth_keys';this._petition_id='';this._getAuthorizationCallback=function(){if(this._doFollowup===true)
  96. return this._getFollowupCallback(this._authorizationCallback);return this._authorizationCallback;};this._getDefaults=function(){return{callback_endpoint:'',requester_email:'',source:'',source_description:''};};this._getFollowupCallback=function(originalCallback){var self=this;return function(response){self.setFollowupFlag(false);if(response.getData('status')!='granted'||!response.getData('auth_key'))
  97. self.authorize(originalCallback);else
  98. originalCallback.call(originalCallback,response);};};this.authorize=function(callback){this.setCallback(callback);var request=new ChangeOrgApiRequest(this._client);request.addData(this._data).setMethod('POST').setEndpoint(ChangeOrgApiUtils.bind(this._endpoint,this._petition_id)).setSignatureAuthKeyRequiredFlag(false).setOnSuccess(this._getAuthorizationCallback());request.send();return this;};this.getCallbackEndpoint=function(){return this._data.callback_endpoint;};this.getClient=function(){return this._client;};this.getEndpoint=function(data){return ChangeOrgApiUtils.bind(this._endpoint,data);};this.getFollowupFlag=function(){return this._doFollowup;}
  99. this.getRequesterEmail=function(){return this._data.requester_email;};this.getSource=function(){return this._data.source;};this.getSourceDescription=function(){return this._data.source_description;};this.setCallback=function(callback){if(typeof callback=='function')
  100. this._authorizationCallback=callback;return this;};this.setCallbackEndpoint=function(endpoint){this._data.callback_endpoint=endpoint;return this;};this.setClient=function(client){if(!(client instanceof ChangeOrgApiClient))
  101. throw new ChangeOrgApiException('Client must be an instance of ChangeOrgApiClient.');this._client=client;return this;};this.setFollowupFlag=function(bool){this._doFollowup=bool;return this;};this.setPetitionId=function(id){this._petition_id=id;return this;};this.setRequesterEmail=function(email){this._data.requester_email=email;return this;};this.setSource=function(source){this._data.source=source;return this;};this.setSourceDescription=function(description){this._data.source_description=description;return this;};this._data=this._getDefaults();if(client)
  102. this.setClient(client);};var ChangeOrgApiOrganization=function(client){this._callback=null;this._client=null;this._endpoints=['/v1/organizations/:organization_id','/v1/organizations/:organization_id/petitions','/v1/organizations/get_id'];this._getDefaults=function(){return{};};this.getClient=function(){return this._client;};this.getEndpoint=function(index,data){if(typeof this._endpoints[index]=='undefined')
  103. return false;return ChangeOrgApiUtils.bind(this._endpoints[index],data);};this.get=function(data,callback){if(typeof data=='number')
  104. data={organization_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(0,data)).setSignatureRequiredFlag(false);if(callback)
  105. request.setOnSuccess(callback);else if(this._callback)
  106. request.setOnSuccess(this._callback);request.send();return this;};this.getId=function(data,callback){if(typeof data=='string')
  107. data={organization_url:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(2,data)).setSignatureRequiredFlag(false);if(callback)
  108. request.setOnSuccess(callback);else if(this._callback)
  109. request.setOnSuccess(this._callback);request.send();return this;};this.getPetitions=function(data,callback){if(typeof data=='number')
  110. data={organization_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(1,data)).setSignatureRequiredFlag(false);if(callback)
  111. request.setOnSuccess(callback);else if(this._callback)
  112. request.setOnSuccess(this._callback);request.send();};this.setCallback=function(callback){this._callback=callback;return this;};this.setClient=function(client){if(!(client instanceof ChangeOrgApiClient))
  113. throw new ChangeOrgApiException('Client must be an instance of ChangeOrgApiClient.');this._client=client;return this;};if(client)
  114. this.setClient(client);};var ChangeOrgApiUser=function(client){this._callback=null;this._client=null;this._endpoints=['/v1/users/:user_id','/v1/users/:user_id/petitions','/v1/users/:user_id/signatures/petitions','/v1/users/get_id'];this._getDefaults=function(){return{};};this.getClient=function(){return this._client;};this.getEndpoint=function(index,data){if(typeof this._endpoints[index]=='undefined')
  115. return false;return ChangeOrgApiUtils.bind(this._endpoints[index],data);};this.get=function(data,callback){if(typeof data=='number')
  116. data={user_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(0,data)).setSignatureRequiredFlag(false);if(callback)
  117. request.setOnSuccess(callback);else if(this._callback)
  118. request.setOnSuccess(this._callback);request.send();};this.getId=function(data,callback){if(typeof data=='string')
  119. data={user_url:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(3,data)).setSignatureRequiredFlag(false);if(callback)
  120. request.setOnSuccess(callback);else if(this._callback)
  121. request.setOnSuccess(this._callback);request.send();};this.getPetitions=function(data,callback){if(typeof data=='number')
  122. data={user_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(1,data)).setSignatureRequiredFlag(false);if(callback)
  123. request.setOnSuccess(callback);else if(this._callback)
  124. request.setOnSuccess(this._callback);request.send();};this.getSignedPetitions=function(data,callback){if(typeof data=='number')
  125. data={user_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(2,data)).setSignatureRequiredFlag(false);if(callback)
  126. request.setOnSuccess(callback);else if(this._callback)
  127. request.setOnSuccess(this._callback);request.send();};this.setCallback=function(callback){this._callback=callback;return this;};this.setClient=function(client){if(!(client instanceof ChangeOrgApiClient))
  128. throw new ChangeOrgApiException('Client must be an instance of ChangeOrgApiClient.');this._client=client;return this;};if(client)
  129. this.setClient(client);};