123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- // Change.org JavaScript API (c) 2014 Rick Buczynski. Under MIT License.
- var ChangeOrgApiUtils={debugMode:false,lastTimestamp:0,proxy:'',addParams:function(url,params){if(typeof url=='string'){var body=[],parts=url.split('?');if(typeof params=='string')
- params=this.expandRequest(params);if(parts.length>1)
- params=this.extend(this.expandRequest(parts.pop()),params||{});for(var key in params)
- body.push(key+'='+encodeURIComponent(params[key]));return url.split('?').shift()+'?'+body.join('&');}},bind:function(input,data){if(typeof data!='object')
- data=[data];if(typeof input=='string'&&typeof data=='object'){for(var key in data){if(data instanceof Array)
- input=input.replace(new RegExp(':[a-zA-Z0-9_]+'),new String(data[key]));else
- input=input.replace(new RegExp(':'+key,'g'),new String(data[key]));}}
- return input;},expandRequest:function(data,targetForm){var parts=data.split('&'),pair,data={};for(var i=0;i<parts.length;i++){if(!parts[0])
- 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);}}
- 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])
- object[property]=objects[i][property];}}
- return object;},getKey:function(prefix,suffix){if(!prefix)
- prefix='';if(!suffix)
- 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)
- params.push(key+'='+encodeURIComponent(this._params[key]));params=(params.length?'?':'')+params.join('&');return((endpointOnly?'':this._api)
- +this._data.endpoint
- +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);}
- catch(error){response=null;}
- return response;};this.getReadyState=function(){return this._connection.readyState;};this.getStatus=function(){return this._connection.status;}
- this.send=function(data){if(!this._connection||this.getIsUnsent())
- this._prepareConnection();if(!this.getIsOpened()){var endpoint=this._getEndpoint();if(this._proxy){endpoint=this._getEndpointProxied(data);this._data.method='GET';}
- this._connection.open(this._data.method,endpoint,true);}
- if(this._connection.setRequestHeader)
- this._connection.setRequestHeader('Content-type',this._data.content_type);this._connection.send(data);return this;};this.setApi=function(url){this._api=url;return this;}
- this.setContentType=function(contentType){this._data.content_type=contentType;return this;};this.setEndpoint=function(endpoint,params){this._data.endpoint=endpoint;if(typeof params=='object')
- this._params=params;return this;};this.setMethod=function(method){this._data.method=method.toUpperCase();return this;};this.setOnSuccess=function(callback){if(typeof callback=='function')
- 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')
- this._data[key]=options[key];}}
- if(ChangeOrgApiUtils.proxy)
- 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')
- this.setAuthKey(data[key]);else
- this._data[key]=data[key];}}
- 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)
- this._data.auth_key=this._authKey;}
- else if(typeof this._data.rsig=='undefined'||!this._data.rsig.length){var body=[],signature='';for(var key in this._data){if(key!='rsig')
- body.push(key+'='+encodeURIComponent(this._data[key]));}
- this._data.rsig=CryptoJS.SHA256(body.join('&')
- +this.getClient().getSecret()
- +(this._useAuthKeyInSignature===true?this._authKey:''));}}
- catch(error){}
- return this;};this.addTimestamp=function(){this._data.timestamp=this.newTimestamp();return this;};this.buildRequest=function(){this.addClient();this.addTimestamp();if(this._useSignature===true)
- this.addSignature();else if(typeof this._data.rsig!='undefined')
- delete this._data.rsig;var body=[];for(var key in this._data)
- 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)
- this._connection=new ChangeOrgApiConnection(options);return this._connection;};this.getData=function(key){if(!key)
- return this._data;if(typeof this._data[key]!='undefined')
- 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')
- delete this._data.rsig;return this;};this.send=function(){var connection=this.getConnection();connection.setEndpoint(this._data.endpoint);if(this._doFollowup===true)
- 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))
- 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')
- delete this._data[key];return this;};if(typeof CryptoJS=='undefined')
- throw new ChangeOrgApiException('ChangeOrgApiRequest cannot initialize because the required library CryptoJS was not found.');if(client)
- this.setClient(client);this._data=this._getDefaults();};var ChangeOrgApiResponse=function(data){this._data={};this.getData=function(key){if(!key)
- return this._data;if(typeof this._data[key]!='undefined')
- return this._data[key];return null;};this.setData=function(data){try{if(data instanceof ChangeOrgApiConnection)
- this._data=data.getResponse();else if(typeof data=='string')
- this._data=JSON.parse(data);else if(typeof data=='object')
- this._data=data;else
- throw new ChangeOrgApiException('Data format not recognized.');}
- catch(error){this._data={};}
- return this;}
- 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')
- 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)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();return this;};this.getAuthorization=function(){if(!this._authorization){this._authorization=new ChangeOrgApiPetitionAuthorization(this._client);}
- return this._authorization;};this.getClient=function(){return this._client;};this.getEndpoint=function(index,data){if(typeof this._endpoints[index]=='undefined')
- return false;return ChangeOrgApiUtils.bind(this._endpoints[index],data);};this.get=function(data,callback){if(typeof data=='number'||typeof data=='string')
- data={petition_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(7,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();return this;};this.getId=function(data,callback){if(typeof data=='string')
- data={petition_url:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(8,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();return this;};this.getPetitions=function(data,callback){if(typeof data=='number')
- return this.getPetition(data,callback);if(typeof data=='string')
- data={petition_ids:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(6,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();return this;};this.getRecentSignatures=function(data,callback){if(typeof data=='number'||typeof data=='string')
- data={petition_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(2,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();};this.getSignatures=function(data,callback){if(typeof data=='number'||typeof data=='string')
- data={petition_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(1,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();return this;};this.getReasons=function(data,callback){if(typeof data=='number'||typeof data=='string')
- data={petition_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(4,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();return this;};this.getTargets=function(data,callback){if(typeof data=='number'||typeof data=='string')
- data={petition_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(3,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();return this;};this.getUpdates=function(data,callback){if(typeof data=='number'||typeof data=='string')
- data={petition_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(5,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();};this.setCallback=function(callback){this._callback=callback;return this;};this.setClient=function(client){if(!(client instanceof ChangeOrgApiClient))
- throw new ChangeOrgApiException('Client must be an instance of ChangeOrgApiClient.');this._client=client;return this;};if(client)
- 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)
- 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'))
- self.authorize(originalCallback);else
- 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;}
- 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')
- this._authorizationCallback=callback;return this;};this.setCallbackEndpoint=function(endpoint){this._data.callback_endpoint=endpoint;return this;};this.setClient=function(client){if(!(client instanceof ChangeOrgApiClient))
- 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)
- 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')
- return false;return ChangeOrgApiUtils.bind(this._endpoints[index],data);};this.get=function(data,callback){if(typeof data=='number')
- data={organization_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(0,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();return this;};this.getId=function(data,callback){if(typeof data=='string')
- data={organization_url:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(2,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();return this;};this.getPetitions=function(data,callback){if(typeof data=='number')
- data={organization_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(1,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();};this.setCallback=function(callback){this._callback=callback;return this;};this.setClient=function(client){if(!(client instanceof ChangeOrgApiClient))
- throw new ChangeOrgApiException('Client must be an instance of ChangeOrgApiClient.');this._client=client;return this;};if(client)
- 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')
- return false;return ChangeOrgApiUtils.bind(this._endpoints[index],data);};this.get=function(data,callback){if(typeof data=='number')
- data={user_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(0,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();};this.getId=function(data,callback){if(typeof data=='string')
- data={user_url:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(3,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();};this.getPetitions=function(data,callback){if(typeof data=='number')
- data={user_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(1,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();};this.getSignedPetitions=function(data,callback){if(typeof data=='number')
- data={user_id:data};var request=new ChangeOrgApiRequest(this.getClient()).setMethod('GET').addData(data).setEndpoint(this.getEndpoint(2,data)).setSignatureRequiredFlag(false);if(callback)
- request.setOnSuccess(callback);else if(this._callback)
- request.setOnSuccess(this._callback);request.send();};this.setCallback=function(callback){this._callback=callback;return this;};this.setClient=function(client){if(!(client instanceof ChangeOrgApiClient))
- throw new ChangeOrgApiException('Client must be an instance of ChangeOrgApiClient.');this._client=client;return this;};if(client)
- this.setClient(client);};
|