if (typeof UGAD == "undefined") {
	var UGAD = {};
}

UGAD.VERSION = '0.2.0';
UGAD.COOKIE_VERSION = 3;
UGAD.COOKIE_KEY_VERSION = "ugad_ver";
UGAD.COOKIE_KEY_URLS = "ugad_urls";
UGAD.COOKIE_KEY_ATTRS = "ugad_attrs";
UGAD.COOKIE_KEY_ATTRS_HERE = "ugad_attrs_here";
UGAD.COOKIE_KEY_UID = "ugad_u";
UGAD.ATTRS_NUM = 27;
UGAD.ATTRS_DECLINE_RATE = 0.7;
UGAD.URL_ATTRS = "http://ad.utagoe.com:8800/attrsp";
UGAD.URL_LOG = "http://ad.utagoe.com/ugad_logs/access/";
UGAD.SEPARATER = " ";

UGAD.isEmpty = function(obj) {
	return typeof obj == "undefined" || obj == "";
}

UGAD.isZeros = function(array) {
	var len = array.length;
	for (var i = 0;i < len; i++) {
		if (array[i] != 0)
			return false;
	}
	return true;
}

UGAD.splitAttrs = function(attrsStr) {
	var attrs = attrsStr.split(UGAD.SEPARATER);
	var len = attrs.length;
	for (var i = 0;i < len; i++)
		attrs[i] = parseFloat(attrs[i]);

	return attrs;
}

UGAD.getCookie = function(key) {
	var cookieStr = " " + document.cookie + ";";
	var keyValStr = "";
	var startIdx = 0;
	var endIdx = 0;
	var keyEndIdx = 0;
	
	var len = cookieStr.length;
	while (startIdx < len) {
		endIdx = cookieStr.indexOf(";", startIdx);
		keyValStr = cookieStr.substring(startIdx + 1, endIdx);
		keyEndIdx = keyValStr.indexOf("=");
		if (keyValStr.substring(0, keyEndIdx) == key) {
			return (unescape(keyValStr.substring(keyEndIdx + 1, endIdx - startIdx - 1)));
		}

		startIdx = endIdx + 1;
	}
	return "";
}

UGAD.setCookie = function(key, val) {
	document.cookie = key + "=" + escape(val) + "; expires=Fri, 31-Dec-2030 23:59:59; ";
}

UGAD.getAttrs = function() {
	if (UGAD.isEmpty(UGAD._attrs)) {
		var attrsStr = UGAD.getCookie(UGAD.COOKIE_KEY_ATTRS);
		var attrs;
		if (attrsStr == "") {
			attrs = [];
			for (var i = 0;i < UGAD.ATTRS_NUM; i++)
				attrs.push(0);
		} else {
			attrs = UGAD.splitAttrs(attrsStr);
		}

		UGAD._attrs = attrs;
	}

	return UGAD._attrs.slice(0);
}

UGAD.setAttrs = function(attrs) {
	attrs = attrs.slice(0);
	var attrsStr = "";
	var attrsLen = attrs.length;
	if (attrsLen > 0) {
		attrsStr = attrs[0];
		for (var i = 1;i < attrsLen; i++)
			attrsStr += UGAD.SEPARATER + attrs[i];
	}
	UGAD._attrs = attrs;
	UGAD.setCookie(UGAD.COOKIE_KEY_ATTRS, attrsStr);
}

UGAD.addAttrs = function(addingAttrs) {
	if (UGAD.isEmpty(addingAttrs) || UGAD.isZeros(addingAttrs))
		return;

	var attrs = UGAD.getAttrs();
	var len = attrs.length;
	if (len == addingAttrs.length) {
		for (var i = 0;i < len; i++)
			attrs[i] = attrs[i] * UGAD.ATTRS_DECLINE_RATE + addingAttrs[i];
	}

	UGAD.setAttrs(attrs);
}

UGAD.getAttrsHere = function() {
	if (UGAD.isEmpty(UGAD._attrsHere)) {
		var attrsStr = UGAD.getCookie(UGAD.COOKIE_KEY_ATTRS_HERE);
		var attrs;
		if (attrsStr == "") {
			attrs = [];
			for (var i = 0;i < UGAD.ATTRS_NUM; i++)
				attrs.push(0);
		} else {
			attrs = UGAD.splitAttrs(attrsStr);
		}
		UGAD._attrsHere = attrs;
	}

	return UGAD._attrsHere.slice(0);
}

UGAD.setAttrsHere = function(attrs) {
	attrs = attrs.slice(0);
	var attrsStr = "";
	var attrsLen = attrs.length;
	if (attrsLen > 0)
		attrsStr = attrs[0];
	for (var i = 1;i < attrsLen; i++)
		attrsStr += UGAD.SEPARATER + attrs[i];

	UGAD._attrsHere = attrs;
	UGAD.setCookie(UGAD.COOKIE_KEY_ATTRS_HERE, attrsStr);
}

UGAD.getAttrsAll = function() {
	var attrs = UGAD.getAttrs();
	var attrsHere = UGAD.getAttrsHere();
	var attrsLen = attrs.length;

	for (var i = 0;i < attrsLen; i++)
		attrs[i] += attrsHere[i];

	return attrs.slice(0);
}

UGAD.getMaxAttrId = function() {
	var maxAttrId = -1;
	var attrs = UGAD.getAttrsAll();
	var attrsLen = attrs.length;
	if (attrsLen > 0 && attrs[0] > 0)
		maxAttrId = 0;
	for (var i = 1;i < attrsLen; i++) {
		if (maxAttrId < 0) {
			if (attrs[i] > 0)
				maxAttrId = i;
		} else if (attrs[maxAttrId] < attrs[i]) {
			maxAttrId = i;
		}
	}

	return maxAttrId;
}

UGAD.getUrls = function() {
	if (UGAD.isEmpty(UGAD._urls)) {
		var urlsStr = UGAD.getCookie(UGAD.COOKIE_KEY_URLS);
		var urls;
		if (urlsStr == "")
			urls = [];
		else
			urls = urlsStr.split(UGAD.SEPARATER);

		UGAD._urls = urls;
	}

	return UGAD._urls.slice(0);
}

UGAD.setUrls = function(urls) {
	urls = urls.slice(0);
	var urlsStr = "";
	var urlsLen = urls.length;
	if (urlsLen > 0)
		urlsStr = urls[0];
	for (var i = 1;i < urlsLen; i++)
		urlsStr += UGAD.SEPARATER + urls[i];

	UGAD._urls = urls;
	UGAD.setCookie(UGAD.COOKIE_KEY_URLS, urlsStr);
}

UGAD.addUrl = function(url) {
	if (UGAD.isEmpty(url))
		return;

	var urls = UGAD.getUrls();
	urls.push(url);
	UGAD.setUrls(urls);
}

UGAD.getUid = function() {
	if (UGAD.isEmpty(UGAD._uid)) {
		var uid = UGAD.getCookie(UGAD.COOKIE_KEY_UID);
		if (UGAD.isEmpty(uid)) {
			uid = parseInt(Math.random() * 1000000000000);
			UGAD.setCookie(UGAD.COOKIE_KEY_UID, uid);
		}
		UGAD._uid = uid;
	}

	return UGAD._uid;
}

UGAD.requestAttrs = function(url, callback) {
	var query = UGAD.URL_ATTRS + "?r="+Math.random()+"&uid=" + UGAD.getUid() + "&callback="
			+ callback + "&url=" + encodeURIComponent(url);

	var script = document.createElement("script");
	script.type = "text/javascript";
	script.src = query;

	var ugad_div = document.getElementById("ugad_div");
	ugad_div.appendChild(script);
}

UGAD.responseAttrs = function(data) {
	var attrs = data.attrs;
	var urlToRemove = decodeURIComponent(data.url);

	if (urlToRemove == location.href)
		UGAD.setAttrsHere(attrs);
	else
		UGAD.addAttrs(attrs);

	var oldUrls = UGAD.getUrls();
	var oldUrlsLen = oldUrls.length;
	var newUrls = [];
	for (var i = 0;i < oldUrlsLen; i++) {
		if (oldUrls[i] != urlToRemove)
			newUrls.push(oldUrls[i]);
	}
	UGAD.setUrls(newUrls);

	if (newUrls.length <= 0) {
		UGAD.reportLog();
	}
}

UGAD.reportLog = function() {
	var query = UGAD.URL_LOG + UGAD.getUid() + "/" + UGAD.getMaxAttrId() + "/?r="+Math.random();

	var script = document.createElement("script");
	script.type = "text/javascript";
	script.src = query;

	var ugad_div = document.getElementById("ugad_div");
	ugad_div.appendChild(script);
}

UGAD.startRequestingAttrs = function() {
	var ref = document.referrer;
	if (!UGAD.isEmpty(ref))
		UGAD.addUrl(ref);

	var attrsHere = UGAD.getAttrsHere();
	if (UGAD.isZeros(attrsHere)) {
		UGAD.addUrl(location.href);
	}

	var urls = UGAD.getUrls();
	var urlsLen = urls.length;
	if (urlsLen > 0) {
		for (var i = 0;i < urlsLen; i++)
			UGAD.requestAttrs(urls[i], "UGAD.responseAttrs");
	} else {
		UGAD.reportLog();
	}
}

UGAD.checkVersion = function() {
	var cookieVer = UGAD.getCookie(UGAD.COOKIE_KEY_VERSION);
	if (UGAD.isEmpty(cookieVer) || parseInt(cookieVer) < UGAD.COOKIE_VERSION) {
		UGAD.setCookie(UGAD.COOKIE_KEY_VERSION, UGAD.COOKIE_VERSION);
		UGAD.setCookie(UGAD.COOKIE_KEY_URLS, "");
		UGAD.setCookie(UGAD.COOKIE_KEY_ATTRS, "");
		UGAD.setCookie(UGAD.COOKIE_KEY_ATTRS_HERE, "");
		UGAD.setCookie(UGAD.COOKIE_KEY_UID, "");
	}
}

UGAD.addClickEvent = function() {
	var nodes = document.getElementsByTagName("a");
	
	for (var i = 0, len = nodes.length; i < len; i++) (function(node, i) {
	    if (node.addEventListener) {
	        // other
	        node.addEventListener("click", function(){UGAD.addUrl(node.href)}, false);
	    } else {
	        // IE
	        node.attachEvent("onclick", function(){UGAD.addUrl(node.href)});
	    }
	})(nodes[i],i);
}

UGAD.setUgad = function() {
	document.write('<div id="ugad_div"></div>');
	UGAD.checkVersion();
	UGAD.startRequestingAttrs();
	UGAD.addClickEvent();
}

UGAD.main = UGAD.setUgad;