<%
require 'net/http'
require 'uri'

#	Ruby sample code for Copyscape Premium API
#	
#	Compatible with Ruby 1.8.7 or later on Rails 2.0.1 or later
#	
#	You may install, use, reproduce, modify and redistribute this code, with or without
#	modifications, subject to the general Terms and Conditions on the Copyscape website. 
#	
#	For any technical assistance please contact us via our website.
#	
#	01-May-2013: First version
#	
#	Copyscape (c) Indigo Stream Technologies 2013 - http://www.copyscape.com/
#
#
#	Instructions for use:
#	
#	1. Set the constants COPYSCAPE_USERNAME and COPYSCAPE_API_KEY below to your details.
#	2. Call the appropriate API function, following the examples below.
#	3. The API response is in XML, which in this sample code is parsed and returned as a Hash.
#	4. To run the examples provided, please uncomment the next line:

#	@run_examples=false

#	Error handling:
#	
#	* If a call failed completely (e.g. Net::HTTP failed to connect), functions return nil.
#	* If the API returned an error, the response array will contain an 'error' element.


# A. Constants you need to change

@COPYSCAPE_USERNAME = "your-copyscape-username"
@COPYSCAPE_API_KEY = "your-copyscape-api-key"

@COPYSCAPE_API_URL = "http://www.copyscape.com/api/"


# B. Functions for you to use (all accounts)

def copyscape_api_url_search_internet(url, full=0) 
	return copyscape_api_url_search(url, full, 'csearch')
end

def copyscape_api_text_search_internet(text, encoding, full=0)
	return copyscape_api_text_search(text, encoding, full, 'csearch')
end

def copyscape_api_check_balance()
	return copyscape_api_call('balance')
end


# C. Functions for you to use (only accounts with private index enabled)

def copyscape_api_url_search_private(url, full=0)
	return copyscape_api_url_search(url, full, 'psearch')
end

def copyscape_api_url_search_internet_and_private(url, full=0)
	return copyscape_api_url_search(url, full, 'cpsearch')
end

def copyscape_api_text_search_private(text, encoding, full=0)
	return copyscape_api_text_search(text, encoding, full, 'psearch')
end

def copyscape_api_text_search_internet_and_private(text, encoding, full=0)
	return copyscape_api_text_search(text, encoding, full, 'cpsearch')
end

def copyscape_api_url_add_to_private(url, id=nil)
	params = {'q'=>url}
	params['i']=id if !id.nil?
	
	return copyscape_api_call('pindexadd', params)
end

def copyscape_api_text_add_to_private(text, encoding, title=nil, id=nil)
	params = {'e'=>encoding}
	params['a']=title if !title.nil?	
	params['i']=id if !id.nil?

	return copyscape_api_call('pindexadd', params, text)
end

def copyscape_api_delete_from_private(handle)
	params = {'h'=>(handle.nil? ? '' : handle)}
	
	return copyscape_api_call('pindexdel', params)
end


# D. Functions used internally

def copyscape_api_url_search(url, full=0, operation='csearch')
	params = {'q'=>url}
	params['c']=full.to_s
	
	return copyscape_api_call(operation, params)
end

def copyscape_api_text_search(text, encoding, full=0, operation='csearch')
	params = {'e'=>encoding}
	params['c']=full.to_s

	return copyscape_api_call(operation, params, text);
end

def copyscape_api_call(operation, params={}, postdata=nil)
	uri = "#{URI.encode(@COPYSCAPE_API_URL)}?u=#{URI.encode(@COPYSCAPE_USERNAME)}&k=#{URI.encode(@COPYSCAPE_API_KEY)}&o=#{URI.encode(operation)}"
	
	params.each do |key, value| uri += "&#{URI.encode(key)}=#{URI.encode(value)}"; end
	
	uri = URI.parse(URI.encode(uri))

	res = ''
	if postdata.nil?
		res = Net::HTTP.get_response(uri)
	else
		http = Net::HTTP.new(uri.host, uri.port)
		request = Net::HTTP::Post.new(uri.request_uri)
		request.body = postdata
		res = http.request(request)
	end

	return Hash.from_xml(res.body) if res.is_a?(Net::HTTPSuccess) || res.is_a(Net::HTTPRedirection)

	return nil
end

def title_wrap(title) 
	return to_html "<big style='margin-left:5%'><b>#{title}:</b></big><br>"
end

def node_wrap(hash)
	ret = to_html "<div style='overflow:auto; max-height:300px; margin-left:5%; width:90%'><pre>"
	ret += h node_recurse(hash)
	ret += to_html "</pre></div><br>"
	return ret
end

def node_recurse(node, depth=0)
	ret = ""
	return ret if node.nil?

	if node.is_a?(Hash)
		node.each do |key, value|
			depth.times do ret += "\t"; end
			ret += "#{key}: "
			ret += "\n" if value.nil? || value.is_a?(Hash) || value.is_a?(Array)
			ret += node_recurse(value,depth+1) if !value.nil?
		end
	elsif node.is_a?(Array)
		node.each do |value|
			ret += node_recurse(value,depth)
			ret += "\n"
		end
	else
		text = node.to_s
		ret += text
		ret += "\n"
	end
	return ret
end

def get_encoding(str)
	return str.encoding.to_s if str.respond_to?(:encoding)
	return "UTF-8"
end

def to_html(str)
	return raw str if defined?(raw)
	return str
end


#	E. Some examples of use

return "" if @run_examples.nil?

exampletext='We hold these truths to be self-evident, that all men are created equal, that they are endowed by their '+
	'Creator with certain unalienable rights, that among these are Life, Liberty, and the pursuit of Happiness. That to '+
	'secure these rights, Governments are instituted among Men, deriving their just powers from the consent of the '+
	'governed. That whenever any Form of Government becomes destructive of these ends, it is the Right of the People to '+
	'alter or to abolish it, and to institute new Government, laying its foundation on such principles and organizing '+
	'its powers in such form, as to them shall seem most likely to effect their Safety and Happiness. Prudence, indeed, '+
	'will dictate that Governments long established should not be changed for light and transient causes; and '+
	'accordingly all experience hath shown, that mankind are more disposed to suffer, while evils are sufferable, than '+
	'to right themselves by abolishing the forms to which they are accustomed. But when a long train of abuses and '+
	'usurpations, pursuing invariably the same Object evinces a design to reduce them under absolute Despotism, it is '+
	'their right, it is their duty, to throw off such Government, and to provide new Guards for their future security. '+
	'Such has been the patient sufferance of these Colonies; and such is now the necessity which constrains them to '+
	'alter their former Systems of Government. The history of the present King of Great Britain is a history of '+
	'repeated injuries and usurpations, all having in direct object the establishment of an absolute Tyranny over these '+
	'States. To prove this, let Facts be submitted to a candid world. He has refused his Assent to Laws, the most '+
	'wholesome and necessary for the public good. '+
	'We, therefore, the Representatives of the United States of America, in General Congress, Assembled, '+
	'appealing to the Supreme Judge of the world for the rectitude of our intentions, do, in the Name, and by Authority '+
	'of the good People of these Colonies, solemnly publish and declare, That these United Colonies are, and of Right '+
	'ought to be free and independent states; that they are Absolved from all Allegiance to the British Crown, and that '+
	'all political connection between them and the State of Great Britain, is and ought to be totally dissolved; and '+
	'that as Free and Independent States, they have full Power to levy War, conclude Peace, contract Alliances, '+
	'establish Commerce, and to do all other Acts and Things which Independent States may of right do. And for the '+
	'support of this Declaration, with a firm reliance on the Protection of Divine Providence, we mutually pledge to '+
	'each other our Lives, our Fortunes, and our sacred Honor.'
%>

<%= title_wrap('Response for a simple URL Internet search') %>
<%= node_wrap(copyscape_api_url_search_internet('http://www.copyscape.com/example.html')) %>

<%= title_wrap('Response for a URL Internet search with full comparisons for the first two results') %>
<%= node_wrap(copyscape_api_url_search_internet('http://www.copyscape.com/example.html', 2)) %>

<%=	title_wrap('Response for a simple text Internet search') %>
<%=	node_wrap(copyscape_api_text_search_internet(exampletext, get_encoding(exampletext))) %>

<%= title_wrap('Response for a text Internet search with full comparisons for the first two results') %>
<%=	node_wrap(copyscape_api_text_search_internet(exampletext, get_encoding(exampletext), 2)) %>

<%=	title_wrap('Response for a check balance request') %>
<%=	node_wrap(copyscape_api_check_balance()) %>

<%=	title_wrap('Response for a URL add to private index request') %>
<%=	node_wrap(copyscape_api_url_add_to_private('http://www.copyscape.com/example.html')) %>

<%=	title_wrap('Response for a text add to private index request') %>
<%	response=copyscape_api_text_add_to_private(exampletext, get_encoding(exampletext), 'Extract from Declaration of Independence', 'EXAMPLE_1234') %>
<%=	node_wrap(response) %>
<%	handle=response['response']['handle'] if !response.nil? && !response['response'].nil? %>

<%=	title_wrap('Response for a URL private index search') %>
<%=	node_wrap(copyscape_api_url_search_private('http://www.copyscape.com/example.html')) %>

<%=	title_wrap('Response for a delete from private index request') %>
<%=	node_wrap(copyscape_api_delete_from_private(handle)) %>

<%=	title_wrap('Response for a text search of both Internet and private index with full comparisons for the first result (of each type)') %>
<%=	node_wrap(copyscape_api_text_search_internet_and_private(exampletext, get_encoding(exampletext), 1)) %>