﻿// ------------------------------------------------------------------------------------------------
// YahooChecker object
// ------------------------------------------------------------------------------------------------

var YahooChecker = new Object();
YahooChecker.getUrl = function(query,pos,pm,tries)
{
	try
	{
	this.param = pm;
	this.query = query;
	this.pos = pos;
	this.tries = tries;
    var obj = document.createElement('script');
    obj.type ='text/javascript';
    obj.charset ='utf-8';
    obj.src = 'http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=YahooDemo&output=json&callback=YahooChecker.processHTTP&results=100&query=' + query + '&start=' + pos;
    document.getElementsByTagName('head')[0].appendChild(obj);
    this.timeout = false;
	this.timeoutCall = setTimeout(this.timedOut,25000);
	}catch(e){logErrorObject(e);};
	//alert(url);
};

YahooChecker.timedOut = function()
{
    //logError('timedout','','');
    this.timeout = true;
    if (YahooChecker.callback)
    {
        YahooChecker.tryMore();
    }
};

YahooChecker.tryMore = function ()
{
   try{
       
       if (!this.tries)
       {
        this.tries = 1;
       }
       else
       {
        this.tries++;
       }
       if (this.tries < 3)
       {
        
         YahooChecker.getUrl(YahooChecker.query,YahooChecker.pos,YahooChecker.param,YahooChecker.tries);
       }
       else
       {
        alert('Sorry! There was an error. We will try to sort this issue soon. In the meantime, try refreshing the page. Hopefully, the report will work next time.');
        logError('total timedout','','');
       }
    }catch(e){logErrorObject(e);};
};

YahooChecker.processHTTP = function (yData) {
      try{
      clearTimeout(YahooChecker.timeoutCall);
      if (this.timeout)
      {
        return;
      }
      if (yData && yData.ResultSet)
      {
          if (this.callback)
	      {
		    this.callback(yData,this.param);
	      }
      
      }
      else
      {
           this.tryMore();
      }
       }catch(e){logErrorObject(e);};
} ;       
// ------------------------------------------------------------------------------------------------
// linkdiagnosis object
// ------------------------------------------------------------------------------------------------

var LD = new Object();
setInterval('LD.monitorExtensionData()',2000);
LD.monitorExtensionData = function()
{
    if ($('links_data'))
    {
        var ldata = null;
        var pdata = null;
        if ($('links_data').value != '')
        {
            LD.siteUrl = $('siteurl').value;
            $('backlinks_items').innerHTML = "";
            ldata = eval($('links_data').value);
        }
        $('links_data').value = '';
        
        if ($('pages_data').value != '')
        {
            LD.siteUrl = $('siteurl').value;
            $('toppages_items').innerHTML = "";
            pdata = eval($('pages_data').value);
        }
        $('pages_data').value = '';
        UIManager.load(pdata,ldata);
    }
    
    if ($('indexedpages_data'))
    {
        if ($('indexedpages_data').value != '')
        {
            $('indexedpages_items').innerHTML = "";
            indexPagesData = eval($('indexedpages_data').value);
            $('indexedpages_data').value = '';
            UIManager.loadIndexPages(indexPagesData);
        }
    }
};

LD.start = function(url)
{
	//alert(url);
    UIManager.changeUIOnStart(url);
    LD.hasExtension = false;
    
    setTimeout('LD.startWaited()',5000);
    setTimeout('LD.sendStartSignal()',1000);
    LD.pages = new Array();
    LD.links = new Array();
	LD.siteUrl = url;
};

LD.sendStartSignal = function()
{
  try
  {
  var element = document.createElement("StartSignalDataElement");
  element.setAttribute("url", document.location.href);
  document.documentElement.appendChild(element);

  var evt = document.createEvent("Events");
  evt.initEvent("StartSignalEvent", true, false);
  element.dispatchEvent(evt);
  }
  catch(e)
  {
  }
}

LD.startWaited = function()
{   
    if ($('do_start').value == '')
    {
        LD.getPages(LD.siteUrl);
    }
    else
    {
        LD.hasExtension = true;
    }
};

LD.startIndexedPages = function(url)
{
    LD.indexedPages = new Array()   
    tmpUrl = url.toLowerCase();
    if (tmpUrl.search("http://") != 0 && tmpUrl.search("https://") != 0)
    {
        url = "http://" + url;
    }
    LD.siteUrl = url;
    $('progress').style.display = 'block';
    $('intro_text').style.display = 'none';
    $('indexedpages_items').innerHTML = "";
    $('siteurl').value = url;
    //$('query_container').style.marginTop = '200px';
	try{
		var element = document.createElement("StartIndexedPagesSignalDataElement");
		element.setAttribute("url", url);
		document.documentElement.appendChild(element);
		
		var evt = document.createEvent("Events");
		evt.initEvent("IndexedPagesStartSignalEvent", true, false);
		element.dispatchEvent(evt);
	}
	catch(e){
	}
}

LD.getPages = function()
{
	YahooChecker.callback = LD.getPagesResponse;
	YahooChecker.getUrl('site:' + getDomain(LD.siteUrl),1);
};
LD.getPagesResponse = function(yData,param)
{
	LD.savePages(yData);
	var totalResults = parseInt(yData.ResultSet.totalResultsAvailable);
	if (totalResults > 1000)
	{
		totalResults = 1000;
	}
	if (totalResults <= 100)
	{
		LD.pagesCompleted();
		return;
	}
	UIManager.setProgress(5);
	LD.totalPagesCalls = totalResults/100;
	LD.completedPagesCalls = 1;
    YahooChecker.callback = LD.getMorePagesResponse;
	YahooChecker.getUrl('site:' + getDomain(LD.siteUrl),101);
};
LD.getMorePagesResponse = function(yData,param)
{
	LD.completedPagesCalls++;
	LD.savePages(yData);
    var done = false;
    if (LD.completedPagesCalls == LD.totalPagesCalls)
    {
        done = true;
    }
    var totalResultsReturned = parseInt(yData.ResultSet.totalResultsReturned);
	if (totalResultsReturned < 100)
	{
		done = true;
	}

	if (done)
	{
	    LD.pagesCompleted();
        
	}
	else
	{
    	YahooChecker.getUrl('site:' + getDomain(LD.siteUrl),(LD.completedPagesCalls * 100) + 1);
	}
};

LD.pagesCompleted = function()
{
        var undupes = new Object();
        for (i=0;i<LD.pages.length;i++)
        {
            undupes[LD.pages[i].url] = LD.pages[i];
        }
        LD.pages = new Array();
        for (x in undupes)
        {
            LD.pages.push(undupes[x]);
        }
        //UIManager.load(LD.pages);
        LD.checkBacklinks();	
};

LD.savePages = function(yData)
{
    
    if (!yData.ResultSet)
    {
        alert('Sorry! There was an error. We will try to sort this issue soon. In the meantime, try refreshing the page. Hopefully, the report will work next time');
        return;
    }

    //DEBUG HACK
	for (i=0;i<yData.ResultSet.Result.length;i++)
	//for (i=0;i<10;i++)
	  {
		var pObj = new Object();
		pObj.url = unescape(yData.ResultSet.Result[i].Url);
		pObj.title = yData.ResultSet.Result[i].Title;
		pObj.linkcount = 0;
		pObj.strength = 0;
		LD.pages.push(pObj);
		
	  }
};

// --------------------------------- BackLink checking----------------------------------
LD.checkBacklinks = function()
{
	LD.checkBacklinkLastProcessedPage = 0;
	LD.checkBacklinkLastIndex = 1;
	LD.checkBacklinksCore(null);
};

LD.checkBacklinksCore = function(yData)
{
    if (yData)
    {
        LD.saveLinks(yData);
        
        if (parseInt(yData.ResultSet.totalResultsReturned) < 100 || LD.checkBacklinkLastIndex >= 900)
        {
            LD.checkBacklinkLastProcessedPage++;    
            LD.checkBacklinkLastIndex = 1;
        }
        else
        {
            LD.checkBacklinkLastIndex = LD.checkBacklinkLastIndex + 100;
        }
    }
    
    if (LD.checkBacklinkLastProcessedPage >= LD.pages.length)
    {
        var undupes = new Object();
        for (i=0;i<LD.links.length;i++)
        {
            undupes[LD.links[i].url] = LD.links[i];
        }
        LD.links = new Array();
        for (x in undupes)
        {
            LD.links.push(undupes[x]);
        }
        //we are done
        LD.updatePagesLinkCount();
        UIManager.setProgress(100);
        UIManager.load(LD.pages,LD.links);
        return;
    }
    var progress = (LD.checkBacklinkLastProcessedPage / LD.pages.length ) * 100;
    if (progress < 5) progress = 5;
    UIManager.setProgress(progress);
	YahooChecker.callback = LD.checkBacklinksCore;
	
	if (!LD.pages[LD.checkBacklinkLastProcessedPage])
	{
	    logError('err123','','');
	    LD.checkBacklinkLastProcessedPage++;
	    LD.checkBacklinksCore(null);
	    return;
	}
	
	//end debug
	YahooChecker.getUrl('link:' + LD.pages[LD.checkBacklinkLastProcessedPage].url + ' -site:' + getDomain(LD.siteUrl),LD.checkBacklinkLastIndex,LD.pages[LD.checkBacklinkLastProcessedPage].url);
	
};

LD.saveLinks = function(yData)
{
    if (!yData.ResultSet)
    {
        alert('Sorry! There was an error. We will try to sort this issue soon. In the meantime, try refreshing the page. Hopefully, the report will work next time');
    }
	for (i=0;i<yData.ResultSet.Result.length;i++)
	  {
	    if (yData.ResultSet.Result[i].Url.search(LD.siteUrl) != 0)
	    {
	        var pObj = new Object();
	        pObj.url = yData.ResultSet.Result[i].Url;
	        pObj.pageIndex = LD.checkBacklinkLastProcessedPage;
	        pObj.page = LD.pages[LD.checkBacklinkLastProcessedPage].url;
	        pObj.pagerank = -1;
	        pObj.anchor = null;
	        pObj.obl = 0;
	        pObj.linktype = -1;
	        LD.links.push(pObj);
        }		
	  }
};

LD.print = function(what)
{
	//alert(what);
	//document.getElementById('debug').innerHTML = document.getElementById('debug').innerHTML + '<br/>' + what;
};

LD.updatePagesLinkCount = function()
{
    for (i=0;i<LD.links.length;i++)
    {
            LD.pages[LD.links[i].pageIndex].linkcount++;
    }

};


// Get the domain from a url
function getDomain(url) {
  if (!url) return '';
  var temp = url.replace('http://','');
  temp = temp.replace('https://','');
  var temp = temp.split('/');
  return temp[0];
};

// Get the domain from a url
function cutDomain(url) {
    var temp = url.replace('http://','');
  temp = temp.replace('https://','');
  return temp.replace(getDomain(url),'' );
};

function escapeHTML (str)
{
   var div = document.createElement('div');
   var text = document.createTextNode(str);
   div.appendChild(text);
   return div.innerHTML;
};

    function unescapeHTML(html) {
   var htmlNode = document.createElement("DIV");
   htmlNode.innerHTML = html;
   if(htmlNode.innerText)
      return htmlNode.innerText; // IE
   return htmlNode.textContent; // FF
};

function cutString(str,len)
{
    if (str)
    {
        if (str.length > len)
        {
            str = str.substring(0,len - 3) + "...";
        }
    }
    return str;
};
