(function($) {

	function trim_str(str) {
	    // looking back, we can use the $.trim function in jquery
	    return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
	};

	function make_parsed_terms(value) {
	    //  The USPTO advanced search requires that each
	    //  query be explictly AND'ed, which turns out to
	    //  be a pain with quotes and such.  This nasty
	    //  bit of code tries to remedy this for simple
	    //  cases.
		var value = trim_str(value),
	    	ss = "Zw9ds24",
			temp_string = value.replace(/("[^"]+?")/g, ss+'$1'+ss);

	    var phrases = temp_string.split(ss);
	    //  Get our terms into blocks for AND'ing
	    var parsed_terms = new Array();
	    for (var i = 0; i < phrases.length; i++) {
	        phrase = trim_str(phrases[i]);
					phrase = phrase.replace(/\s*"\s*/g,'"');
	        if (phrase.length < 1) {
	            continue;
	        }
	        if (phrase.match(/^"/)) {
	            parsed_terms.push(phrase);

	        } else {
	            //  Push individual terms into parsed_terms 
	            //  after splitting on whitespace
	            subphrases = phrase.split(/\s+/);
	            for (var j = 0; j < subphrases.length; j++) {
	                subphrase = trim_str(subphrases[j]);
	                parsed_terms.push(subphrase);
	            };
	        };
	    };
	    return parsed_terms;
	};


	function join_terms_in_query(parsed_terms) {
	    boolean_operators = [(/^[Aa][Nn][Dd]$/), (/^[Oo][Rr]$/), (/^[Aa][Nn][Dd][Nn][Oo][Tt]$/)];
	    var parsed_terms; // gets to here definitely
	    var terms = [];
	    var joining_terms = [];
	    last_term_operator = false;
	    for (var i = 0; i < parsed_terms.length; i++) {
	        var term = parsed_terms[i];
	        // if it's not the first or last term, check if it's an operator
	        isOperator = false;
	        if (i != 0 && i != parsed_terms.length) {
	            for (var j = 0; j < boolean_operators.length; j++) {
	                re = boolean_operators[j];
	                if (term.match(re)) {
	                    isOperator = true;
	                }
	            }
	        }
	        // this will cover the normal case
	        //  terms needs to be one longer than joining_terms
	        if (isOperator == true) {
	            if (last_term_operator == false) {
	                joining_terms.push(term.toUpperCase());
	                last_term_operator = true;
	             }
	         } else {
	            terms.push(term);
	            if (i != 0 && i != parsed_terms.length && last_term_operator == false) {
	                joining_terms.push('AND');
	            }
	            last_term_operator = false;
	        }
	    }
	    query = terms[0];
	    for (var i = 1; i < terms.length; i++) {
	        query = query + ' ' + joining_terms[i-1] + ' ' + terms[i];
	    }
	    return query;
	};

	function get_subquery(field){
		var query_tags = {
	        'patent_number': 'PN',
	        'title': 'TTL',
	        'abstract': 'ABST',
	        'claims': 'ACLM',
	        'description': 'SPEC',
	        'inventor': 'IN',
	        'assignee': 'AN',
	        'ipc': 'ICL'
	    };
		if (field.value) {
			var subquery = join_terms_in_query(make_parsed_terms(field.value));
			subquery = "(" + subquery + ")";
			if (query_tags[field.name]) {
				subquery = query_tags[field.name] + "/" + subquery;
			};
			return subquery;
		};
		return "";
	};
	
	function form_to_query(form){
		var fields = form.formToArray(), query_array = new Array();
		for (var i = fields.length - 1; i >= 0; i--){
			if (fields[i].value) {
				query_array.push(get_subquery(fields[i]));				
			};
		};
		query = encodeURIComponent(query_array.join(' AND '));
	    return query;
	};

	
	$.fn.uspto_pipe_search = function(results_selector, pagination_selector) {
		return this.each(function(){
			var search_form = this;
			
			function doJson(form, page, results_selector, pagination_selector){
				var args = $(form).formSerialize(),
				action = $(form).attr('action'),
				query = form_to_query($(form)),
				page = parseInt(page, 10),
				pipes_page = page+1,
				total_results = 0;
				full_action = action + '?' + "_id=IGZ6aZoN3RGuC3yw8TxBKg&_render=json&page=" + pipes_page + "&query=" + query + "&_callback=?";
				$(results_selector+':first').html('<img src="img/ajax-loader.gif" /><p>Đang tải về...</p>');


				$.getJSON(full_action,
							function(json){
								
								function patentlens_redirect(p){
							        return 'http://www.patentlens.net/patentlens/quick.cgi?patnum=' + encodeURIComponent(p);
							    };
							    function espacenet_redirect(p){
									return [
									'http://v3.espacenet.com/textdoc?DB=EPODOC&IDX=',
									encodeURIComponent(p),
									'&F=0'
									].join("");
							    };
							    function uspto_redirect(p){
							        return 'http://patft.uspto.gov/netacgi/nph-Parser?TERM1=' + encodeURIComponent(p) + '&Sect1=PTO1&Sect2=HITOFF&d=PALL&p=1&u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&r=0&f=S&l=50';
							    };
								
								var result_list = 	'<table class="results"><thead><tr>'
													+ '<th>Stt</th>'
													+ '<th>Số&nbsp;công&nbsp;bố&nbsp;đơn</th>'
													+ '<th>Tên sáng chế/GPHI</th></tr></thead><tbody><tr><td> </td></tr>';
								$.each(json.value.items, function(i, item) {
									if (i==0) {
										total_results = item.total;
									};
									var tr = '<tr>';
									if (i%2!=0) {
										var tr = '<tr class="even">';										
									};
									result_list +=	tr + '<td>' + item.result_number +  '</td>' 
												+	'<td><a href="' + item.link + '">' + item.patent_number + '</a></td>'
												+	'<td class="patent-title"><a class="show-patent" name="'+item.patent_number+'" href="' + item.link + '">'
												+	item.title
												+	'</a></td>'
												+	'</tr>';
								});
								result_list += '</tbody></table>';
								$(results_selector+':first').html(result_list);
								var opts = {
											'current_page': page,
											'num_edge_entries': 1,
											'prev_text': 'trước',
											'next_text': 'sau',
											'items_per_page': 50,
											'num_display_entries': 5,
											'callback': handle_pagination_click
								};
								$(pagination_selector).html();
								
								$(pagination_selector).pagination(total_results, opts);
								$('a.show-patent').click(function(){
									return false;
								});
								$('a.show-patent').click(function(){
									
									function process_pipes_uspto_patent(blocks){
										
										function en2vn(text){
											return text.replace(
													'Inventors:', 'Tác&nbsp;giả:'
												).replace(
													'Appl. No.:', 'Số&nbsp;đơn:'
												).replace(
													'Assignee:', 'Người&nbsp;nộp&nbsp;đơn:'
												).replace(
													'PCT Filed:', 'Ngày&nbsp;nộp&nbsp;đơn&nbsp;PCT:'
												).replace(
													'Filed:', 'Ngày&nbsp;nộp&nbsp;đơn:'
												).replace(
													'PCT No.:', 'Số&nbsp;đơn&nbsp;PCT:'
												).replace(
													'PCT Pub. No.:', 'Số&nbsp;công&nbsp;bố&nbsp;quốc&nbsp;tế&nbsp;PCT:'
												).replace(
													'PCT Pub. Date: ', 'Ngày&nbsp;công&nbsp;bố&nbsp;đơn&nbsp;PCT:'
												).replace(
													/January/g,"tháng Giêng"
												).replace(
													/February/g,"tháng Hai"
												).replace(
													/March/g,"tháng Ba"
												).replace(
													/April/g,"tháng Tư"
												).replace(
													/May/g,"tháng Năm"
												).replace(
													/June/g,"tháng Sáu"
												).replace(
													/July/g,"tháng Bảy"
												).replace(
													/August/g,"tháng Tám"
												).replace(
													/September/g,"tháng Chín"
												).replace(
													/October/g,"tháng Mười"
												).replace(
													/November/g,"tháng Mười một"
												).replace(
													/December/g,"tháng Mười hai"
												).replace(
													/(<b>\s*)?Current U.S. Class:(<\/b>\s*)?/m,"Phân&nbsp;loại:"
												).replace(
													/(<b>\s*)?Current International Class:(<\/b>\s*)?/m,"Phân&nbsp;loại&nbsp;IPC:"
												).replace(
													/(<b>\s*)?Current U.S. Class(<\/b>\s*)?/m,"Phân&nbsp;loại"
												).replace(
													/(<b>\s*)?Current U.S. Class(<\/b>\s*)?/m,"Phân&nbsp;loại"
												).replace(
													/December/g,"tháng Mười hai"
												);
										};
										function translate(jq_obj){
											return jq_obj.html(en2vn(jq_obj.html()));
										}
										function replacem(s, r, n){
											return s.replace(/\n/g,'\uffff').replace(r, n).replace(/\uffff/g,'\n');
										}
										
										var a,b,c,d,i=0;
										// a = $(blocks[0].content);
										// a.find('tr:first').replaceWith();


										while(!blocks[i].content.match(/Abstract/)){
											i+=1;
										}
										blocks[i].content = blocks[i].content.replace(/\n/g,'\uffff');
										blocks[i].content = blocks[i].content.replace(/^.*?<p>/, '<p><b>Tóm tắt sáng chế/GPHI:</b>&nbsp;&nbsp;');
										// blocks[i].content = blocks[i].content.replace(/^.*?<p>/, '');
										// blocks[i].content = blocks[i].content.replace(/<\/p>/, '');
										blocks[i].content = blocks[i].content.replace(/\uffff/g,'\n');
										blocks[i].content = '<p class="uspto-abstract-en">' + blocks[i].content + '</p>';
										a = $(blocks[i].content);

										while(!blocks[i].content.match(/Inventors:/)){
											i+=1;
										}				
										blocks[i].content =						
											blocks[i].content.replace(
																/<\/?p>/gi,''
															).replace(
																/<font.*?<\/font>/i,''
															);
										b = $(blocks[i].content);
										b.find('tr:contains("371(c)")').replaceWith();
										var assignee_el = b.find('td:contains("Assignee")').siblings('td').siblings('td').find('b:first');
										var assignee_link = '<a href="http://www.google.com.vn/search?hl=vi&q=' + encodeURIComponent(assignee_el.text()) + '">'+assignee_el.text()+'</a>';
										assignee_el.html(assignee_link);
										b.find('td:contains("Assignee"):last').siblings('td').siblings('td').find('b:first').html(assignee_link);
										translate(b);
										
										// CLASSIFICAITON BLOCK
										while(!blocks[i].content.match(/Current U\.S\. Class:/gi)){
											i+=1;
										}
										if (blocks[i].content.match(/Foreign\s+Application/mig)) {
											blocks[i].content =	replacem(blocks[i].content, /.*<table /, '<table ');
										};
										blocks[i].content = blocks[i].content.replace(/\n/g,'\uffff');
										blocks[i].content =						
											blocks[i].content.replace(
																/<\/?p>/gi,''
															).replace(
																/<center.*?<\/center>/i,''
															).replace(
																/<hr.*?>/i,''
															);
										blocks[i].content = blocks[i].content.replace(/\uffff/g,'\n');
										
															
										c = $(blocks[i].content);
										c.find('tr:contains("Field of Search")').replaceWith();
										
										translate(c);
										return [b, c, a];
									};
									
									$('p.fetching').remove();
									var patent_number = $(this).attr("name");
									$(this).after('<p class="fetching"><img src="img/ajax-loader.gif" /><br />Đang tải về...</p>');
									$.getJSON('http://pipes.yahoo.com/pipes/pipe.run?_id=uie_h_4S3RGDxfHFGsevXg&_render=json&patents='+patent_number+'&_callback=?',
									 function(json){
										var spinner = $('p.fetching');
										var new_blocks = process_pipes_uspto_patent(json.value.items[0].html);
										var links = [
											'<div class="goto">[Đi đến <a href="',
											uspto_redirect(patent_number),
											'"> USPTO</a> / ',
											'<a href="',
											espacenet_redirect("US"+patent_number),
											'">EPO</a> / ',
											'<a href="',
											patentlens_redirect("US_"+patent_number),
											'">PatentLens</a>]</div>'
										].join("");
										spinner.after(links);
										for (var i = new_blocks.length - 1; i >= 0; i--){
											spinner.after(new_blocks[i]);
										};
										
										//  Add the translated abstract
										// spinner.after($('<p class="uspto-abstract-vi">ooo</p>'));
										
										
										// spinner.after(new_html);
										spinner.remove();								
									});
									

									return false;
								});
				});

			};
			function handle_pagination_click(page_id, pagination_dom){
				doJson(search_form, page_id, results_selector, pagination_selector);
				return false;
			};
			$(search_form).submit(function(){
				return false;
			});
			
			$(search_form).submit(function(){
				doJson(search_form, 0, results_selector, pagination_selector);
				return false;
			});
		});
	};
})(jQuery);

// http://pipes.yahoo.com/pipes/pipe.run?Page=1&_id=pDiDIOAL3RGe1Y2GODY80A&_render=json&abstract=x8&assignee=x1&claims=x6&fulltext=x4&inventor=x2&ipc=x9&number=x3&specification=x5&title=x7


$(document).ready(function() {
	$('#shtt-search').uspto_pipe_search('div#results', '#results-pagination-top,#results-pagination-bottom');
});
