

var base = new Object();
var total = 0, queueLength = 0, domainCount = 0, selDomCount = 0;
var loading = Labels.loading;
var gDomains = null;
var ad = false;
var work = false, stopped = false;

var inad, adConds;

function start(loop) {
	if (work != loop)
		return;
	else if (!work) {
		aDInit();
		work = true;
		stopped = false;
	}

	if (total>900) {
		setTimeout("start(true)", 1000);
		return;
	}

	if (!gDomains || gDomains.length == 0) {
		gDomains = sites.value.toLowerCase().split(/\s/);
		gDomains.reverse();
		queueLengthChange(gDomains.length);
	}
	if (!gDomains || gDomains.length == 0)
		return;

	for (var add = 0; add < 100 && gDomains.length > 0;) {
		domain = gDomains.pop().match(/[a-z0-9\-]+\.([a-z0-9\-]+\.)*[a-z]+/m);
		if (!domain) {
			queueLengthChange(-1);
			continue;
		}
		var domain = getCleanDomain(domain[0]);

		if (!(domain in base)) {
			add++;
			var darr = new Array(inxMax);
			base[domain] = darr;

			if (!ad) {
				displayRow(domain);
				reloadRow(domain);
			} else {
				for(var i=0; i<inad.length; i++) {
					reCheckCell(inad[i], domain);
				}
			}

		} else {
			queueLengthChange(-1);
		}
	}
	if (gDomains && gDomains.length > 0)
		setTimeout("start(true)", 100);
	else
		work = false;
}

function cancel() {
	stopped = true;
	work = false;
	if (gDomains)
		queueLengthChange(-gDomains.length);
	gDomains = null;
	for (var domain in base) {
		if (!base[domain].tr)
			removeRow(domain);
	}
	if (window.stop)
		window.stop();
}


/* Result display funcions */
function displayRow(domain) {
	if (base[domain].tr)
		return;
	var tr = maintable.insertRow(-1);
	base[domain].tr = tr;
	tr.id = domain;
	for (var i=0; i<inxMax; i++) {
		var td = tr.insertCell(i);
		if (!use[i])
			td.style.display = "none";
		td.innerHTML = getTDHTML(i, domain);
	}
	domainCountChange(1);
	queueLengthChange(-1);
	reloadRow(domain, true);
}

function reloadRow(domain, withoutReCheck) {
	if (withoutReCheck) {
		if (base[domain][inxWhoIs] === undefined)
			checkWhoIs(domain);
		if (base[domain][inxYaType] === undefined || base[domain][inxtCY] === undefined)
			checkCY(domain);
		if (base[domain][inxYaTypeC] === undefined || base[domain][inxtCYc] === undefined)
			checkCYc(domain);
//		if (base[domain][inxYaLinksP] === undefined || base[domain][inxYaLinksS] === undefined)
//			checkYaLinks(domain);
		if (base[domain][inxYaIndex] === undefined)
			checkYaIndex(domain);
		if (base[domain][inxPR] === undefined)
			checkPR(domain);
//		if (base[domain][inxPRfraud] === undefined)
//			checkPRFraud(domain);
//		if (base[domain][inxwwwPRfraud] === undefined)
//			checkwwwPRFraud(domain);
		if (base[domain][inxGLinks] === undefined)
			checkGlinks(domain);
		if (base[domain][inxGIndex] === undefined)
			checkGIndex(domain);
		if (base[domain][inxGInfo] === undefined)
			checkGInfo(domain);
		if (base[domain][inxYahooLinks] === undefined)
			checkYahooLinks(domain);
		if (base[domain][inxWebArch] === undefined)
			checkWebArch(domain);
        if (base[domain][inxDmoz] === undefined)
            checkDmoz(domain);
        if (base[domain][inxAlexa] === undefined)
            checkAlexa(domain);
        if (base[domain][inxRIndex] === undefined)
            checkRIndex(domain);
        if (base[domain][inxMSNIndex] === undefined)
            checkMSNIndex(domain);
        if (base[domain][inxYaLinks] === undefined)
            checkYaLinks(domain);
	} else {
		checkWhoIs(domain);
		checkCY(domain);
		checkCYc(domain);
//		checkYaLinks(domain);
		checkYaIndex(domain);
		checkPR(domain);
//		checkPRFraud(domain);
//		checkwwwPRFraud(domain);
		checkGlinks(domain);
		checkGIndex(domain);
		checkGInfo(domain);
		checkYahooLinks(domain);
		checkWebArch(domain);
		checkDmoz(domain);
		checkAlexa(domain);
		checkRIndex(domain);
		checkMSNIndex(domain);
		checkYaLinks(domain);
	}
}

function removeRow(domain) {
	if (base[domain].tr) {
		if (base[domain].checked)
			selectDomain(domain, false);
		base[domain].tr.parentNode.removeChild(base[domain].tr);
		domainCountChange(-1);
	} else {
		queueLengthChange(-1);
	}
	delete base[domain];
}

function reCheckCell(index, domain) {
	switch (index) {
		case inxWhoIs:
			checkWhoIs(domain);
			break;
		case inxYaType:
		case inxtCY:
			checkCY(domain);
			break;
		case inxYaTypeC:
		case inxtCYc:
			checkCYc(domain);
			break;
//		case inxYaLinksP:
//		case inxYaLinksS:
//			checkYaLinks(domain);
//			break;
		case inxYaIndex:
			checkYaIndex(domain);
			break;
		case inxPR:
			checkPR(domain);
			break;
//		case inxPRfraud:
//			checkPRFraud(domain);
//			break;
//		case inxwwwPRfraud:
//			checkwwwPRFraud(domain);
//			break;
		case inxGLinks:
			checkGlinks(domain);
			break;
		case inxGIndex:
			checkGIndex(domain);
			break;
		case inxGInfo:
			checkGInfo(domain);
			break;
		case inxYahooLinks:
			checkYahooLinks(domain);
			break;
		case inxWebArch:
			checkWebArch(domain);
			break;
        case inxDmoz:
            checkDmoz(domain);
            break;
        case inxAlexa:
            checkAlexa(domain);
            break;
        case inxRIndex:
            checkRIndex(domain);
            break;
        case inxMSNIndex:
            checkMSNIndex(domain);
            break;
        case inxYaLinks:
            checkYaLinks(domain);
            break;
	}
}

function setVal(domain, valInd, val) {
	if (!(domain in base))
		return;
	base[domain][valInd] = val;
	if (base[domain].tr) {
		base[domain].tr.cells[valInd].firstChild.innerHTML = val;
	}
}


/* Recheck functions */
function reCheck() {
	var reCheckType = document.getElementById("reCheckType");
	var reCheckType = reCheckType.options[reCheckType.selectedIndex].value;
	var reCheckParam = document.getElementById("reCheckParam");
	var reCheckParam = reCheckParam.options[reCheckParam.selectedIndex].value;
	var reCheckSel = document.getElementById("reCheckSel");
	var reCheckSel = reCheckSel.options[reCheckSel.selectedIndex].value;

	stopped = false;

	if (reCheckParam == "all") {
		if (reCheckType == "all") {
			if (reCheckSel == "all") {
				reCheckAll();
			} else if (reCheckSel == "selected") {
				reCheckSelection();
			}
		} else if (reCheckType == "undefined") {
			if (reCheckSel == "all") {
				reCheckUndef();
			} else if (reCheckSel == "selected") {
				reCheckUndefSel();
			}
		}
	} else {
		reCheckParam = parseInt(reCheckParam, 10);
		if (reCheckType == "all") {
			if (reCheckSel == "all") {
				reCheckColl(reCheckParam);
			} else if (reCheckSel == "selected") {
				reCheckCollSel(reCheckParam);
			}
		} else if (reCheckType == "undefined") {
			if (reCheckSel == "all") {
				reCheckUndefColl(reCheckParam);
			} else if (reCheckSel == "selected") {
				reCheckUndefCollSel(reCheckParam);
			}
		}
	}
}

function reCheckSelection() {
	for (var domain in base) {
		if (base[domain].tr && base[domain].checked) {
			reloadRow(domain);
		}
	}
}

function reCheckUndefSel() {
	for (var domain in base) {
		if (base[domain].tr && base[domain].checked) {
			for (var i=2; i<inxMax; i++) {
				if (base[domain][i] === undefined) {
					reCheckCell(i, domain);
				}
			}
		}
	}
}

function reCheckUndefCollSel(coll) {
	for (var domain in base) {
		if (base[domain].tr && base[domain].checked) {
			if (base[domain][coll] === undefined) {
				reCheckCell(coll, domain);
			}
		}
	}
}

function reCheckCollSel(coll) {
	for (var domain in base) {
		if (base[domain].tr && base[domain].checked) {
			reCheckCell(coll, domain);
		}
	}
}

function reCheckColl(coll) {
	for (var domain in base) {
		if (base[domain].tr)
			reCheckCell(coll, domain);
	}
}

function reCheckUndefColl(coll) {
	for (var domain in base) {
		if (base[domain].tr && base[domain][coll] === undefined) {
			reCheckCell(coll, domain);
		}
	}
}

function reCheckAll() {
	for (var domain in base) {
		if (base[domain].tr)
			reloadRow(domain);
	}
}

function reCheckUndef() {
	for (var domain in base) {
		if (base[domain].tr)
			for (var i=2; i<inxMax; i++) {
				if (base[domain][i] === undefined) {
					reCheckCell(i, domain);
				}
			}
	}
}


/* Select functions */
function stripTag(str) {
	return str.match(/(?:<[^>]+>)?([^<]*)(?:<\/[^>]+>)?/m)[1];
}

function selectDomain(domain, sel) {
	if (!base[domain].tr || (sel ? base[domain].checked : !base[domain].checked))
		return;
	base[domain].checked = sel;
	base[domain].tr.firstChild.firstChild.checked = sel;
	selDomCountChange(sel);
}

function selectDomainOnClick(checkbox) {
	var domain = checkbox.parentNode.parentNode.id, sel = checkbox.checked;
	if (base[domain].checked == sel)
		return;
	base[domain].checked = sel;
	selDomCountChange(sel);
}

function selFilter() {
	var paramSel = document.getElementById("selectParam");
	var param = parseInt(paramSel.options[paramSel.selectedIndex].value, 10);

	var from = parseInt(document.getElementById("selFrom").value, 10);
	var to = parseInt(document.getElementById("selTo").value, 10);
	var contains = document.getElementById("selContains").value;

	for (var domain in base) {
		var val = param == 1 ? domain : base[domain][param];
		if (val === undefined) val = "undefined";
		if ((typeof val == 'string' &&
				((contains.length == 0 && val.length == 0) ||
				(contains.length > 0 && stripTag(val).indexOf(contains) != -1))
			) || (typeof val == 'number' && (isNaN(from) || val >= from) && (isNaN(to) || val <= to))) {
				selectDomain(domain, true);
		}
	}
}

function showSel() {
	var res = "";
	for (var domain in base) {
		if (base[domain].checked) {
			res += domain + "\n";
		}
	}
	filterRes.value = res;
}

function selectAll() {
	for (var domain in base) {
		selectDomain(domain, true);
	}
}

function unSelectAll() {
	for (var domain in base) {
		selectDomain(domain, false);
	}
}

function reverseSel() {
	for (var domain in base) {
		selectDomain(domain, !base[domain].checked);
	}
}

function deleteSel() {
	for (var domain in base) {
		if (base[domain].checked) {
			removeRow(domain);
		}
	}
}


/* Use functions */
function changeU(inx, checked) {
	use[inx] = checked ? 1 : 0;
	var rows = maintable.rows;
	for (var i=0; i<rows.length; i++) {
		rows[i].cells[inx].style.display = checked ? "" : "none";
	}
	if (window.Storage && Storage.active) {
	  Storage.put('use', '[' + use.join(',') + ']');
    }
}


/* AutoDelete functions */
function adAdd() {
	var div = document.createElement("div");
	div.innerHTML = '<select class="adParam">'+getOption()+'</select> from <input class="adFrom" type="text" size="7"> to <input class="adTo" type="text" size="7"> OR contains <input class="adContains" type="text" size="15"> <button class="adb" onClick="adDel(this);">-</button><button class="adb" onClick="adAdd(this);">+</button>';
	adDiv.appendChild(div);
	if (adDiv.childNodes.length > 1)
		document.getElementById("adANDOR").disabled = false;
}

function adDel(b) {
	adDiv.removeChild(b.parentNode);
	if (adDiv.childNodes.length == 1)
		document.getElementById("adANDOR").disabled = true;
}

function adcbChange(checked) {
	ad = checked;
	adDiv.style.display = checked ? "" : "none";
	document.getElementById("adANDORDiv").style.display = checked ? "" : "none";
}

function aDInit() {
	inad = new Array();
	if (ad) {
		for (var i=0; i<adDiv.childNodes.length; i++) {
			var adCondSel = adDiv.childNodes.item(i).firstChild;
			var param = parseInt(adCondSel.options[adCondSel.selectedIndex].value, 10);
			inad[inad.length] = param;
		}
	}

	adConds = new Array();
	adConds.ANDOR = adANDOR.options[adANDOR.selectedIndex].value;
	for (var j=0; j<adDiv.childNodes.length; j++) {
		var adc = new Object();
		var adCond = adDiv.childNodes.item(j);

		var adCondSel = adCond.firstChild;
		adc.param = parseInt(adCondSel.options[adCondSel.selectedIndex].value, 10);

		var ins = adCond.getElementsByTagName("input");
		for (var i=0; i<ins.length; i++) {
			if (ins[i].className == "adFrom")
				adc.from = parseInt(ins[i].value, 10);
			if (ins[i].className == "adTo")
				adc.to = parseInt(ins[i].value, 10);
			if (ins[i].className == "adContains")
				adc.contains = ins[i].value;
		}

		adConds[j] = adc;
	}
}

function doAD(domain) {
	if (ad && domain in base && !base[domain].tr) {
		if (adConds.ANDOR == "adAND") {
			for (var i=0; i<adConds.length; i++) {
				if (!testADCond(domain, adConds[i])) {
					lastAD(domain);
					return;
				}
			}
			displayRow(domain);
		} else if (adConds.ANDOR == "adOR") {
			for (var i=0; i<adConds.length; i++) {
				if (testADCond(domain, adConds[i])) {
					displayRow(domain);
					break;
				}
			}
			lastAD(domain);
		}
	}
}

function lastAD(domain) {
	for (var i=0; i<inxMax; i++)
		if (base[domain][i] == loading)
			return;
	if (!base[domain].tr)
		removeRow(domain);
}

function testADCond(domain, adCond) {
	if (!(adCond.param in base[domain]))
		return false;

	var val = base[domain][adCond.param], from = adCond.from, to = adCond.to, contains = adCond.contains;

	if ((typeof val == 'string' &&
			((contains.length == 0 && val.length == 0) ||
			(contains.length > 0 && stripTag(val).indexOf(contains) != -1))
		) || (typeof val == 'number' && (isNaN(from) || val >= from) && (isNaN(to) || val <= to)))
		return true;
	else
		return false;
}


/* Counters function */
function selDomCountChange(sel) {
	if (sel)
		selDomCountEl.innerHTML = ++selDomCount;
	else
		selDomCountEl.innerHTML = --selDomCount;
}

function domainCountChange(inc) {
	domainCountEl.innerHTML = domainCount += inc;
}

function queueLengthChange(inc) {
	queueLengthEl.innerHTML = queueLength += inc;
}

function totalCountChange(inc) {
	totalCountEl.innerHTML = total += inc;
}


/* HTML functions */
function getTDHTML(inx, domain) {
	switch (inx) {
		case 0:
			return "<input type='checkbox' onClick='selectDomainOnClick(this);'><a title='ReCheck domain' class='reloadRow' href='#' onClick='reloadRow(this.parentNode.parentNode.id);return false;'><b>R</b></a><a title='Delete domain' class='removeRow' href='#' onClick='removeRow(this.parentNode.parentNode.id);return false;'><b>D</b></a>";
		case inxDomain:
			return "<a target='_blank' href='http://"+domain+"/'>"+domain+"</a>";
		case inxWhoIs:
			return "<a target='_blank' href='https://www.nic.ru/whois/?domain="+domain+"&ask_registrar=1'>"+base[domain][inx]+"</a>";
		case inxYaType:
		case inxtCY:
			return "<a target='_blank' href='http://bar-navig.yandex.ru/u?ver=2&show=32&url=http://"+domain+"/'>"+base[domain][inx]+"</a>";
		case inxYaTypeC:
		case inxtCYc:
			return "<a target='_blank' href='http://search.yaca.yandex.ru/yca/cy/ch/"+domain+"/'>"+base[domain][inx]+"</a>";
//		case inxYaLinksP:
//		case inxYaLinksS:
//			var fullDomain = "www." + domain + "," + domain;
//			return "<a target='_blank' href='http://www.yandex.ru/yandsearch/?Link="+fullDomain+"&iserverurl="+fullDomain+"'>"+base[domain][inx]+"</a>";
		case inxYaIndex:
			if (base[domain].yaisurl) {
				return "<a target='_blank' href='http://www.yandex.ru/yandsearch?rstr=&to_day=13&linkto=&zone=all&date=&spcctx=notfar&from_month=&numdoc=10&text=&Link=&lang=all&from_year=&within=0&site="+domain+"&wordforms=all&to_year=2007&from_day=&to_month=8&ds=&rd=0&mime=all'>"+base[domain][inx]+"</a>";
			} else {
				var rhost = getRHost(domain);
				return "<a target='_blank' href='http://www.yandex.ru/yandsearch?text=rhost%3A"+rhost+"%20|%20rhost%3A"+rhost+".*%22'>"+base[domain][inx]+"</a>";
			}
		case inxPR:
//			var q = base[domain].wwwgpr ? "info:www." + domain : "info:" + domain;
//			return "<a target='_blank' href='http://www.google.com/search?client=navclient-auto&ch=6"+GCH(q)+"&ie=UTF-8&oe=UTF-8&features=Rank&q="+q+"'>"+base[domain][inx]+"</a>";
			return "<a target='_blank' href='http://www.checkpagerank.net/index.php?name="+domain+"&links=1'>"+base[domain][inx]+"</a>";
		case inxGLinks:
			return "<a target='_blank' href='http://www.google.com/search?filter=0&q=link%3A"+(base[domain].wwwgl?"www."+domain:domain)+"'>"+base[domain][inx]+"</a>";
		case inxGIndex:
			return "<a target='_blank' href='http://www.google.com/search?filter=0&q=site%3A"+domain+"'>"+base[domain][inx]+"</a>";
		case inxGInfo:
			return "<a target='_blank' href='http://www.google.com/search?filter=0&q=info%3A"+(base[domain].wwwgi?"www."+domain:domain)+"'>"+base[domain][inx]+"</a>";
		case inxYahooLinks:
			return "<a target='_blank' href='http://siteexplorer.search.yahoo.com/search?ei=UTF-8&p=http%3A%2F%2F"+domain+"&bwm=i&bwmf=s&bwmo=d'>"+base[domain][inx]+"</a>";
		case inxWebArch:
			return "<a target='_blank' href='http://web.archive.org/web/*/"+domain+"'>"+base[domain][inx]+"</a>";
        case inxDmoz:
            return '<a target="_blank" href="http://search.dmoz.org/cgi-bin/search?search=u:' + domain + '">' + base[domain][inx] + '</a>';
        case inxAlexa:
            return '<a target="_blank" href="http://www.alexa.com/data/details/traffic_details/' + domain + '">' + base[domain][inx] + '</a>';
        case inxRIndex:
            return '<a target="_blank" href="http://search.rambler.ru/srch?sort=0&oe=1251&limit=50&filter=' + domain + '">' + base[domain][inx] + '</a>';
        case inxMSNIndex:
            return '<a target="_blank" href="http://search.msn.com/results.aspx?q=site%3A' + domain + '">' + base[domain][inx] + '</a>';
        case inxYaLinks:
            return '<a target="_blank" href="http://yandex.ru/yandsearch?text=%22*.' + domain + '%22">' + base[domain][inx] + '</a>';
	}
}

function getOption() {
	var res = "";
	for (var i=1; i<inxMax; i++) {
		res += '<option value="'+i+'">'+names[i]+'</option>';
	}
	return res;
}

/* Checksum for Google PR functions */
function zeroFill(a, b) {
	var z = 0x80000000;
	if ((z & a) != 0) {
		a = (a >> 1);
		a &= (~z);
		a |= 0x40000000;
		a = (a >> (b - 1));
	} else {
		a = (a >> b);
	}
	return a;
}
function mix(a, b, c) {
	a -= b;	a -= c;	a ^= (zeroFill(c, 13));
	b -= c;	b -= a;	b ^= (a << 8);
	c -= a;	c -= b;	c ^= (zeroFill(b, 13));
	a -= b;	a -= c;	a ^= (zeroFill(c, 12));
	b -= c;	b -= a;	b ^= (a << 16);
	c -= a;	c -= b;	c ^= (zeroFill(b, 5));
	a -= b;	a -= c;	a ^= (zeroFill(c, 3));
	b -= c;	b -= a;	b ^= (a << 10);
	c -= a;	c -= b;	c ^= (zeroFill(b, 15));
	return new Array(a, b, c);
}
function GCH(url) {
	var length = url.length;
	var a = 0x9E3779B9;
	var b = a;
	var c = 0xE6359A60;
	var k = 0;
	var len = length;
	var mixed;
	while (len >= 12) {
		a += (url.charCodeAt(k + 0) + (url.charCodeAt(k + 1) << 8) + (url.charCodeAt(k + 2) << 16) + (url.charCodeAt(k + 3) << 24));
		b += (url.charCodeAt(k + 4) + (url.charCodeAt(k + 5) << 8) + (url.charCodeAt(k + 6) << 16) + (url.charCodeAt(k + 7) << 24));
		c += (url.charCodeAt(k + 8) + (url.charCodeAt(k + 9) << 8) + (url.charCodeAt(k + 10) << 16) + (url.charCodeAt(k + 11) << 24));
		mixed = mix(a, b, c);
		a = mixed[0];
		b = mixed[1];
		c = mixed[2];
		k += 12;
		len -= 12;
	}
	c += length;
	switch (len) {
		case 11 :
			c += (url.charCodeAt(k + 10) << 24);
		case 10 :
			c += (url.charCodeAt(k + 9) << 16);
		case 9 :
			c += (url.charCodeAt(k + 8) << 8);
		case 8 :
			b += (url.charCodeAt(k + 7) << 24);
		case 7 :
			b += (url.charCodeAt(k + 6) << 16);
		case 6 :
			b += (url.charCodeAt(k + 5) << 8);
		case 5 :
			b += (url.charCodeAt(k + 4));
		case 4 :
			a += (url.charCodeAt(k + 3) << 24);
		case 3 :
			a += (url.charCodeAt(k + 2) << 16);
		case 2 :
			a += (url.charCodeAt(k + 1) << 8);
		case 1 :
			a += (url.charCodeAt(k + 0));
	}
	mixed = mix(a, b, c);

	return mixed[2];
}

/* Browser test */
var test_httpReq;
try {test_httpReq = new XMLHttpRequest();} catch(e) {}
try {test_httpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");} catch(e) {}
if (!test_httpReq) {
	alert("Неподдерживаемый браузер. Нажмите OK для открытия списка поддерживаемых браузеров.");
	window.location = "/browserconfig";
}

try {netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");} catch(e) {}
try {
	test_httpReq.open("GET", "http://www.example.net/", true);
} catch (e) {
	alert("Настройки безопасности вашего браузера не позволяют seocheker'у корректно работать. Нажмите OK для открытия инструкции по изменению настроек.");
	window.location = "/browserconfig";
}

