/**
 * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
 * *
 * Copyright (C) 2011, 2012 Loic J. Duros
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see  <http://www.gnu.org/licenses/>.
 *
 */



// page mod executing content script at every page load.

var data = require("sdk/self").data;
var pageMod = require("sdk/page-mod");

var urlHandler = require("url_handler/url_handler");

var pageWorker = require("sdk/page-worker");

var tabs = require("sdk/tabs");

// contain list of recently found contact links or email addresses.
var contactList = {};

// constants. Also available in lib/ui_info.js
const CERTAIN_EMAIL_ADDRESS_FOUND = 'certainEmailAddressFound';
const UNCERTAIN_EMAIL_ADDRESS_FOUND = 'uncertainEmailAddresFound';

// Looking for contact links
const CERTAIN_LINK_FOUND = 'certainLinkFound';
const PROBABLE_LINK_FOUND = 'probableLinkFound';
const UNCERTAIN_LINK_FOUND = 'uncertainLinkFound';
const LINK_NOT_FOUND = 'contactLinkNotFound';

// Looking for identi.ca and twitter accounts.
const TWITTER_LINK_FOUND = 'twitterLinkFound';
const IDENTICA_LINK_FOUND = 'identicaLinkFound';

// phone number and address
const PHONE_NUMBER_FOUND = 'phoneNumberFound';
const SNAIL_ADDRESS_FOUND = 'snailAddressFound';

/**
 * main pageMod.
 * Find blocked script in all pages being opened.
 * Launch the scripts that search for a complaint contact.
 * 
 */

pageMod.PageMod({
	
	include: ['file://*','*', 'data:*', 'about:*'],

	contentScriptWhen: 'end',

	contentScriptFile: [
		data.url('complain/contact_regex.js'),
		data.url('complain/link_types.js'),
		data.url('third_party/jquery-src.js'), 
		data.url('third_party/jquery.easing.1.3.js'),
		data.url('complain/contact_finder.js'),
		data.url('complain/pagemod_finder.js'),
		data.url('script_detector/script_detector.js')
	],

	onAttach: function onAttach(worker) {
		
		if (worker.tab != undefined) {
			
			// this is a tab.
			if (!foundInContactList(worker.url)) {
				// the hostname doesn't appear in the object literal.
				// run script fetching/complaint feature if applicable.
				tabProcess(worker);
			} else {
				worker.postMessage(foundInContactList(worker.url));
			}
		} 

	}
});

/**
 * foundInContactList
 *
 * Provides link if contact link is found for given url, or else
 * false.
 */
var foundInContactList = function (url) {

  var hostname = urlHandler.getHostname(url);
  
  if (contactList[hostname] != undefined) {

	  return contactList[hostname];

  } else {

	  return false;

  }

};

/**
 * tabProcess
 * Find blocked/accepted scripts, prepare
 * display panel and complaint panel, ...
 * 
 */
var tabProcess = function (worker) {

  var visitedUrl = {};

  // webmaster email is better than a webpage.
  worker.emailFound = false;
  var modUrl = '',
      searchUrl = '';

  modUrl = worker.url;

  //console.log('pagemod triggered');

  // send local path to complain button graphic.
  worker.postMessage({'event': 'assets-uri', 'value':  data.url('assets/')});
  worker.postMessage({'event': 'page-url', 'value': modUrl});

  worker.on('message', function (respData) {
    
	  // console.log('worker is receiving a message', respData.event);

	  var pw;

	  worker.on('detach', function () {
	    //console.log('detaching worker');
	    if (pw) {
	      pw.destroy();
        
	    }
	  });
	  if (respData.contact != undefined) {
	    // pass the message to the complaint display panel.
	    worker.postMessage(respData);	
	  }
	  
	  else if (respData.event === 'complaintSearch') {

	    //console.log('complaintSearch triggered');
	    //console.log('worker tab url', worker.tab.url);
	    if (!(respData.urlSearch.linkValue in visitedUrl)) {

		    visitedUrl[respData.urlSearch.linkValue] = 1;

		    respData.urlSearch.linkValue = urlHandler.addFragment(respData.urlSearch.linkValue, 'librejs=true');
		    pw = searchSecondLevelPage(this, respData.urlSearch.linkValue, this.url);

	    } 
	    // currently not needed.
	    /*else {
		   console.log(respData.urlSearch.linkValue, 'already visited');
	     }*/
	  }
	  

  });

};

var searchSecondLevelPage = function (worker, urlToSearch, originalUrl) {
  var originalWorker = worker;
  
  //console.log('url to search is', urlToSearch);

  //console.log(urlToSearch, 'and', originalUrl);
  
  if (urlHandler.haveSameHostname(urlToSearch, originalUrl)) {

	  return pageWorker.Page({
	    contentURL: urlToSearch,
	    contentScriptFile: [
		    data.url('complain/contact_regex.js'),
		    data.url('complain/link_types.js'),
		    data.url('third_party/jquery-src.js'), 
		    data.url('third_party/jquery.easing.1.3.js'),
		    data.url('complain/contact_finder.js'),
		    data.url('complain/worker_finder.js')
	    ],
	    contentScriptWhen: "end",
	    
	    onMessage: function (respData) {
        //console.log(JSON.stringify(respData));
        //console.log(originalWorker.url);
	      originalWorker.postMessage(respData);		

		    if (respData.event === 'destroy') {
		      try {
			      //console.log('destroying worker', this.contentURL);
		        this.destroy();
		      } catch (e) {
			      console.log('in worker', e);
		      }
		    }
	    }
	  });

  }

};




exports.testModule = {

  'contactList': contactList,

  'foundInContactList': foundInContactList,
  
  'tabProcess': tabProcess

};