﻿var over=0;
var parsing=0;
var askedId = 0;
var max_thread_num = 20;

var sstatus = 0;   // 0 start 1 query yahoo 2 analyse -1 close
var startid = 1;
var requestnum = 0;
var hhost = "";
var max_per_req = 100;

var totalLink =0;

var linkarr = new Array();
var domainarr = new Array();
var anchorarr = new Array();

var displayId = 1;
var lastUpdateTime = new Date();   // 当超出2分钟没有新数据的话，则自动关闭。


String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ''); };

function tablesort(){
		 $("#report1").tablesorter({sortList:[[0,0]], widgets: ['zebra']});
		 //$("#report2").tablesorter({sortList:[[1,0]], widgets: ['zebra']});
		 //$("#report3").tablesorter({sortList:[[1,0]], widgets: ['zebra']});
}
	  
var xmlhttp;
if (window.XMLHttpRequest)  {  // code for IE7+, Firefox, Chrome, Opera, Safari
	xmlhttp=new XMLHttpRequest();
}
else  {  // code for IE6, IE5
	xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
	if(xmlhttp.readyState==4)   {
		yahooApiCallback(xmlhttp.responseText);
	}
}

function pair (text, value) {
	this.text = text;
	this.value = value;
}


function ajaxFunction(link){
  xmlhttp.open("GET",link,true);
  xmlhttp.send(null);
}

// for debug
function updateDisplay(msg){
	return;
	tt = document.getElementById("display");
	tt.innerHTML = tt.innerHTML + "<br>" + msg;
}


function yahooApiCallback(jsontext){
	lastUpdateTime = new Date();
	
	var myObj = eval( '(' + jsontext + ')' );
	
	for(i in myObj.ResultSet.Result){
		//alert(myObj.ResultSet.Result[i].Url);	
		linkarr.push(myObj.ResultSet.Result[i].Url);
	}

  // shit , 	myObj.ResultSet.firstResultPosition is a STRING!!!!
	startid = Number(myObj.ResultSet.firstResultPosition) + Number(myObj.ResultSet.totalResultsReturned);
	totalLink = startid - 1;
	if(sstatus == 0){
		updateTotalLinks(myObj.ResultSet.totalResultsAvailable);
		sstatus = 1;
	}
	
	if(sstatus != -1){
		if((startid-1 < requestnum) 
		&& (startid-1 < myObj.ResultSet.totalResultsAvailable) ){ // not over , keep request
			yahooapi();
		}else{
			sstatus = 2;
		}
	}
}

function yahooapi(){
	left = requestnum-startid+1;
	t = "apiproxy.php?host="+escape(hhost)+"&number="+(left<max_per_req?left:max_per_req)+"&start="+startid;
	ajaxFunction(t);
}

function analysing(){
	if(sstatus == -1)
		return;
		
	if(sstatus==0){
		setTimeout("analysing()", 500);
		return;
	}
	
	//alert(linkarr.length);
	while(linkarr.length>0 && parsing < max_thread_num){
			url = linkarr.shift();
			xajax_multiply(url, askedId, hhost); 
			updateDisplay(String(askedId)+" "+url);
			parsing++;
			askedId++; 
	}
	
	document.getElementById("processing").innerHTML=parsing;
	document.getElementById("over").innerHTML=over;
	document.getElementById("amount").innerHTML=totalLink;
	
	curTime = new Date();
	var timeOut = (curTime.getTime()-lastUpdateTime.getTime())>30000; // 超出30seconds
	
	if(sstatus!=0 && ((0 ==linkarr.length && parsing == 0) || timeOut)){
			//alert(timeOut);		

			document.getElementById("status").innerHTML="结束";
			document.getElementById("done").style.display="block";
			document.getElementById("doing").style.display="none";
							
			document.getElementById("report").style.display="block";
			domainReport();
			anchorReport();
			
			tablesort();
			
			alert("分析结束");
	} else {
		
			document.getElementById("status").innerHTML="分析中";
			document.getElementById("done").style.display="none";
			document.getElementById("doing").style.display="block";
			
			setTimeout("analysing()", 3000);
	}
}

function domainReport(){
	aa = new Array();
	i=0;
	for(key in domainarr){
		aa[i++] = new pair(key, domainarr[key]);
		//alert(key+" " +domainarr[key]);
	}
	
	aa.sort(function(a,b){return b.value-a.value;});
	//alert("aa:"+aa[0].text);
	table = document.getElementById("report2").tBodies[0];
	
	maxi = aa.length > 10 ? 10:aa.length;
	//alert("maxi:"+maxi);
	for(i=0; i<maxi; i++){
		tr = table.insertRow(-1);
		
		tc = tr.insertCell(-1);
		tc.innerHTML=aa[i].text;
		
		tc = tr.insertCell(-1);
		tc.innerHTML=aa[i].value;
	}
}

function anchorReport(){
	aa = new Array();
	i=0;
	for(key in anchorarr){
		aa[i++] = new pair(key, anchorarr[key]);
	}
	aa.sort(function(a,b){return b.value-a.value;});
	table = document.getElementById("report3").tBodies[0];
	maxi = aa.length > 10 ? 10:aa.length;
	//alert("maxi:"+maxi);
	for(i=0; i<maxi; i++){
		tr = table.insertRow(-1);
		
		tc = tr.insertCell(-1);
		tc.innerHTML=aa[i].text;
		
		tc = tr.insertCell(-1);
		tc.innerHTML=aa[i].value;
		
	}
}

function updateTotalLinks(t){
	document.getElementById("totalnum").innerHTML=t;
}

function getDomain (thestring) {
	var urlpattern = new RegExp("(http|ftp|https)://(.*?)/.*$");
	var parsedurl = thestring.match(urlpattern);
	return parsedurl[2];
}

function insertLink(id, url, pr, obl, anchorTxt, flag){
	if(sstatus == -1)
		return;
	
	lastUpdateTime = new Date();
	
	parsing--;
	over++;
	
	a = anchorTxt.trim();
	if(a && a.length>0){
			//alert(a);
			if(anchorarr[a])
				anchorarr[a]++;
			else
				anchorarr[a]=1;
	}
	
	
	if(url && url.length>0){
		domain = getDomain(url);
		//alert(domain);
		if(domain){
			if(domainarr[domain])
				domainarr[domain]++;
			else
				domainarr[domain]=1;
		}
	}

	table = document.getElementById("report1").tBodies[0];
	
	tr = table.insertRow(-1);
	
	tc = tr.insertCell(-1);
	tc.innerHTML=displayId++;
	
	tc = tr.insertCell(-1);
	s = url.length<60 ? url : url.substr(0, 56).concat(".....");
	tc.innerHTML = "<a target='_blank' href='"+url+"'>"+s+"</a>";
	
	tc = tr.insertCell(-1);
	tc.innerHTML = anchorTxt;
	
	tc = tr.insertCell(-1);
	tc.innerHTML = pr;
	
	tc = tr.insertCell(-1);
	tc.innerHTML = obl;
	
	tc = tr.insertCell(-1);
	tc.innerHTML = flag;
}

// start parse
function startAnalyse(s, n)	{
	requestnum = n;
	hhost = s;
	
	// start request 
	yahooapi();
	
	// start analyse 
	analysing(); 
}

function validate()
{
	if (document.f.q.value == "" || document.f.q.value == "http://www." ||
		!document.f.q.value.match(/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/))	{
		alert("Please enter complete URL. (format) http://www.yourwebsite.com \n Must include: \n http:// or https:// \n domain name with extension e.g www.firepress.com");
		document.f.q.focus();
		return false;
	}

	document.f.submit();
}


function stopParsing(){
	sstatus = -1;
	parsing = 0;
	document.getElementById("processing").innerHTML=parsing;
	document.getElementById("status").innerHTML="结束";
	document.getElementById("done").style.display="block";
	document.getElementById("doing").style.display="none";
	
	domainReport();
	anchorReport();
			
	tablesort();
			
	alert("分析结束!");

}
