/**
 * 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/>.
 *
 */

 
var pageModFinder = {

 
    image: null,

    stylesheet: null,

    button: null,

    displayPanel: false,

    links: null,

    box: null,

    infoBox: null,

    init: function () {

	var that = this, le;

	this.links = [];


	self.on('message', function (respData) {
		    
		    if (respData.event === 'assets-uri') {
			that.setComplaintPanel(respData.value);
		    } 
		    
		    else if (respData.event === 'page-url') {

			// search for contact list. Top level.
			contactFinder.init();
			//console.log('page url is', respData.value);
			contactFinder.searchForContactLink(respData.value);

		    }

		    else if (respData.contact != undefined){ 
			that.displayLinkByPriority(respData);
		    }
		});

    },

    /**
     * setComplaintPanel
     *
     * Create complaint panel and assign properties to the 
     * dom elements.
     *    
     */
    setComplaintPanel: function (uri) {
	
	// provide uri of stylesheet
	this.stylesheet = uri + 'css/style.css';

	// add stylesheet.
	$('head').append($('<link/>').attr({'rel': 'stylesheet',
					  'href': this.stylesheet, 
					  'type': 'text/css'}));

	$('body').prepend('<div id="librejs-complaint-box" style="display:none">'
			 + '\n\n      '
			 + '<a id="librejs-tab-button" href="#" title="LibreJS -- Complain to this site">LibreJS -- Complain to this site.</a>'
			 + '\n\n      '
			 + '<div id="librejs-complaint-info">'
			 + '\n\n	'
			 + '<h1 title="Nonfree JavaScript -- Complain">\n	Nonfree JavaScript Complain\n	</h1>'
			  + '\n\n'
			  + '<p id="librejs-time-mention">Searching for contact links in this website...</p>'
			  + '\n\n'
			  + '<div id="librejs-complaint-info-text">'

			 + '<h2>Emails you should use</h2>'
			 + '<ul id="librejs-certain-emails"></ul>'
			 
			 + '<h2>Non-webmaster Emails you might want to use</h2>'
			 + '<ul id="librejs-uncertain-emails"></ul>'

			 + '<h2>Contact form or useful Contact Information</h2>'		 
			 + '<ul id="librejs-certain-links"></ul>'

			 + '<h2>Twitter Links</h2>'
			 + '<ul id="librejs-twitter-links"></ul>'

			 + '<h2>Identi.ca Links</h2>'
			 + '<ul id="librejs-identica-links"></ul>'
			 			 
			 + '<h2>May be of interest</h2>'
			 + '<ul id="librejs-uncertain-links"></ul>'
			 
			 + '<h2>May be of interest</h2>'
			 + '<ul id="librejs-probable-links"></ul>'
			 
			 + '<h2>Phone Numbers</h2>'
			 + '<ul id="librejs-phone-numbers"></ul>'
			 
			 + '<h2>Snail Mail Addresses</h2>'
			 + '<ul id="librejs-snail-addresses"></ul>'
			  + '</div>'
			 + ' </div></div>');

	// main elements of the complaint panel.
	this.infoBox = $('#librejs-complaint-info');
	this.infoBoxText = $('#librejs-complaint-info-text');

	// all lists.
	this.certainEmails = $("#librejs-certain-emails");
	this.uncertainEmails = $("#librejs-uncertain-emails");
	this.certainLinks = $("#librejs-certain-links");
	this.uncertainLinks = $("#librejs-uncertain-links");
	this.probableLinks = $("#librejs-probable-links");
	this.twitterLinks = $("#librejs-twitter-links");
	this.identicaLinks = $("#librejs-identica-links");
	this.phoneNumbers = $("#librejs-phone-numbers");
	this.snailAddresses = $("#librejs-snail-addresses");
	
	this.button = $('#librejs-tab-button');
	this.box = $('#librejs-complaint-box');
	
	this.infoBox.height(window.innerHeight / 1.3);
	this.infoBoxText.height(this.infoBox.height() - 150);

    },


    /**
     *
     *  displayLinkByPriority
     * 
     *  Place the link in the correct list depending
     *  on the correct
     */
    displayLinkByPriority: function (respData) {
	
	// we have a link to show. Add it to the button.
	// first time finalLinkFound is triggered.
	if (this.displayPanel === false) {

	    this.addComplaintOverlay();
	    this.displayPanel = true;
	    this.hideBox(true);
	}

	// check link isn't already added.
	if (respData.contact != undefined && 
	    !this.isInLinks(respData.contact.link)) {
	    
	    // push link to list.
	    le = this.links.push(respData);
	    
	    // making sure this is the latest link added.
	    this.addALinkToPanel(this.links[le -1]);
	    
	}


    },

    isInLinks: function (searchValue) {
	var i = 0,
	le = this.links.length;
	
	for (; i < le; i++) {

	    if (this.links[i].contact.link.replace(/\/$/, '') === searchValue.replace(/\/$/, '')) {
		return true;
	    }
	} 

	// no match has been found.
	return false;
	
    },

    /**
     *  addALinkToPanel
     *
     *  Check the type of link and place it in the
     *  appropriate list in the complaint panel.
     *   
     */
    addALinkToPanel: function (link) {

	var listElem;

	switch (link.event) {
	    
	case linkTypes.CERTAIN_EMAIL_ADDRESS_FOUND:
	    listElem = this.certainEmails;
	    break;
	
	case linkTypes.UNCERTAIN_EMAIL_ADDRESS_FOUND:
	    listElem = this.uncertainEmails;
	    break;

	case linkTypes.CERTAIN_LINK_FOUND:
	    listElem = this.certainLinks;
	    break;

	case linkTypes.PROBABLE_LINK_FOUND:
	    listElem = this.probableLinks;
	    break;

	case linkTypes.UNCERTAIN_LINK_FOUND:
	    listElem = this.uncertainLinks;
	    break;
	    
	case linkTypes.TWITTER_LINK_FOUND:
	    listElem = this.twitterLinks;
	    break;
	    
	case linkTypes.IDENTICA_LINK_FOUND:
	    listElem = this.identicaLinks;
	    break;
	    
	case linkTypes.PHONE_NUMBER_FOUND:
	    listElem = this.phoneNumbers;
 	    break;
	    
	case linkTypes.SNAIL_ADDRESS_FOUND:
	    listElem = this.snailAddresses;
	    break;	    
	}

	listElem.prev('h2').css({'display': 'block'});
	listElem.append($('<li/>').append($('<a/>').attr({'href': link.contact.link,
							  'target': '_blank'}).text(link.contact.label)));

	
    },
    
    addComplaintOverlay: function () {
	var that = this;
	
	this.button.bind('mouseenter', function () { that.showBox(); });

	this.box.bind('mouseleave', function () { that.hideBox(); });

	this.button.bind('focus', function () { that.showBox(); });
	this.box.bind('blur', function () { that.hideBox()});

	this.box.css({'display': 'block'});

	//this.hideBox(true);
    },

    showBox: function () {
	this.box.stop().animate({
	    right: '-5px'
	}, {queue: false, duration: 1500, easing: 'easeInOutQuart'});
    },

    hideBox: function (hint) {
	var rightMargin = '-550px';

	if (hint) {
	    rightMargin = '-530px';
	}

	this.box.stop().delay(10000).animate({
	    right: rightMargin
	}, {queue:false, duration: 1500, easing: 'easeInOutQuart'});

    }
    

};
   