var DT_NS = {};
DT_NS.Transport = function (url, callback) {
	var timestamp = new Date();
	var param = "timestamp=" + (timestamp * 1);
	var req;
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
		req.open("POST", url, false);
		req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		req.send(param);
		if(req.status == 200){
			if (callback) callback(req.responseText);
		}
	}
	else if (window.ActiveXObject) {
		req =  new ActiveXObject("Microsoft.XMLHTTP");
		req.open("POST", url, false);
		req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		req.onreadystatechange = processRequest;
		req.send(param);
	}
	function processRequest() {
		if (req.readyState == 4) {
			if (req.status == 200) {
				if (callback) callback(req.responseText);
			}
		}
	}
}

function getTemplate(template) {
	var lnk;
	DT_NS.tmplt.parseGETRequest();
	DT_NS.tmplt.parseCookie();
	lnk = DT_NS.tmplt.getTemplateLink();
	var id = template['element_id'];
	var instOfAJAX = new DT_NS.Transport(lnk, function(resp) {DT_NS.parseResponse(resp,id);});
	GETRequests = new Array();
	Cookies = new Array();
}

DT_NS.parseResponse = function(response, idOfInsertingPlace){
	document.write(response);
	for(var key in template) delete template[key];
}

var GETRequests = new Array();
var Cookies = new Array();

DT_NS.tmplt = {
	getTemplateLink : function(){
		var url;
		var ref = this.referrerComparison();
		var current_location = this.getCurrentLocation();
		var default_item_index = null;
		var random = Math.floor(Math.random() * 100) + 1;// alert('Random number: ' + random);
		var percent_top = 0;
		var percent_bottom = 1;
		for(var i = 0; i < template['items'].length; i++) {
			for(var j = 0; j < template['items'][i]['conds'].length; j++) {
				for(var z = 0; z < template['items'][i]['conds'][j]['params'].length; z++) {
					if(template['items'][i]['conds'][j]['params'][z]['type'] == 9 && this.conformToCookie(template['id'] + 'PercentageTemplateItem', template['items'][i]['link'])) return template['items'][i]['link'];
				}
			}
		}
		for(var i = 0; i < template['items'].length; i++) {
			if(template['items'][i]['default_item'] != 0) default_item_index = i;
			var conds_match_count = 0;
			var conds_count = 0;
			if(template['items'][i]['conds'].length == 0){
				url = template['items'][i]['link'];
				return url;
			}
			template['items'][i]['percentage'] = false;
			for(var j = 0; j < template['items'][i]['conds'].length; j++) {
				var params_match_count = 0;
				var params_count = template['items'][i]['conds'][j]['params'].length;
				for(var z = 0; z < template['items'][i]['conds'][j]['params'].length; z++) {
					switch(template['items'][i]['conds'][j]['params'][z]['type']) {
						/* refferal */
						case '1': if(template['items'][i]['conds'][j]['params'][z]['value'] == ref) params_match_count++; break;
						/* get-request */
						case '2': if(this.conformToGetRequest(template['items'][i]['conds'][j]['params'][z]['name'], template['items'][i]['conds'][j]['params'][z]['value'])) params_match_count++; break;
						/* cookies */
						case '3': if(this.conformToCookie(template['items'][i]['conds'][j]['params'][z]['name'], template['items'][i]['conds'][j]['params'][z]['value'])) params_match_count++; break;
						/* current location */
						case '4': if(template['items'][i]['conds'][j]['params'][z]['value'] == current_location) params_match_count++; break;
						/* refferal reg exp */
						case '5': {
							try {
								var value_reg = new RegExp(template['items'][i]['conds'][j]['params'][z]['value']);
							}
							catch(e) {
								//alert(e);
								break;
							}
							if(ref.match(value_reg)) params_match_count++;
							break;
						}
						/* get-request reg exp */
						case '6': if(this.conformToGetRequestReg(template['items'][i]['conds'][j]['params'][z]['name'], template['items'][i]['conds'][j]['params'][z]['value'])) params_match_count++; break;
						/* cookies reg exp */
						case '7': if(this.conformToCookieReg(template['items'][i]['conds'][j]['params'][z]['name'], template['items'][i]['conds'][j]['params'][z]['value'])) params_match_count++; break;
						/* current location reg exp */
						case '8': {
							try {
								var value_reg = new RegExp(template['items'][i]['conds'][j]['params'][z]['value']);
							}
							catch(e) {
								//alert(e);
								break;
							}
							if(current_location.match(value_reg)) params_match_count++;
							break;
						}
						case '9': {
							template['items'][i]['percentage'] = true;
							var value = parseInt(template['items'][i]['conds'][j]['params'][z]['value']);
							if(!value) value = 0;
							percent_top = value + percent_bottom;
							if(random >= percent_bottom && random < percent_top) params_match_count++;
							percent_bottom = percent_top;
							break;
						}
					}
					if(((template['items'][i]['param_oper'] == '1' && params_count == params_match_count) && !(template['items'][i]['param_oper'] == '2' && params_match_count)) || (!(template['items'][i]['param_oper'] == '1' && params_count == params_match_count) && ((template['items'][i]['param_oper'] == '2') && params_match_count))) conds_match_count++;
				}
				conds_count = template['items'][i]['conds'].length;
				if(((template['items'][i]['cond_oper'] == '1' && conds_count == conds_match_count) && !(template['items'][i]['cond_oper'] == '2' && conds_match_count)) || (!(template['items'][i]['cond_oper'] == '1' && conds_count == conds_match_count) && ((template['items'][i]['cond_oper'] == '2') && conds_match_count))) url = template['items'][i]['link'];
			}
			if(typeof(url) != 'undefined') {
				if(percent_top && template['items'][i]['percentage']) this.setCookie(template['id'] + 'PercentageTemplateItem', template['items'][i]['link']);
				return url;
			}
		}
		if(default_item_index === null) url = template['items'][0]['link'];
		else url = template['items'][default_item_index]['link'];
		return url;
	},

	conformToGetRequest : function(name, value) {
		for (x in GETRequests)
			if(x == name && GETRequests[x] == value) return true;
		return false;
	},
	
	conformToGetRequestReg : function(name, value) {
		try {
			var name_reg = new RegExp(name);
		}
		catch(e) {
			//alert(e);
			return false;
		}
		try {
			var value_reg = new RegExp(value);
		}
		catch(e) {
			//alert(e);
			return false;
		}
		for (x in GETRequests)
			if(x.match(name_reg) && GETRequests[x].match(value_reg)) return true;
		return false;
	},
	
	parseGETRequest : function() {
		var request = location.search;
		if(request == '') return;
		var params = (request.substr(1)).split('&');
		var length = params.length;
		for (var i = 0; i < length; i++) {
			param = params[i].split('=');
			GETRequests[param[0]] = typeof(param[1]) == 'undefined' ? '' : param[1];
		}
	},

	conformToCookie : function(name, value){
		var pattern = "(?:; )?" + name + "=([^;]*);?";
		var regexp  = new RegExp(pattern);
		if (regexp.test(document.cookie) && value == decodeURIComponent(RegExp["$1"])) return true;
		return false;
	},
	
	conformToCookieReg : function(name, value){
		try {
			var name_reg = new RegExp(name);
		}
		catch(e) {
			//alert(e);
			return false;
		}
		try {
			var value_reg = new RegExp(value);
		}
		catch(e) {
			//alert(e);
			return false;
		}
		for (x in Cookies) {
			//alert(x + "\r\n" + name + "\r\n" + Cookies[x] + "\r\n" + value);
			if(x.match(name_reg) && Cookies[x].match(value_reg)) return true;
		}
		return false;
	},
	
	parseCookie : function() {
		var request = document.cookie;
		if(request == '') return;
		var params = request.split('; ');
		var length = params.length;
		for (var i = 0; i < length; i++) {
			param = params[i].split('=');
			param_name = param[0];
			Cookies[param_name] = '';
			if(typeof(param[1]) != 'undefined') {
				param.shift();
				Cookies[param_name] = param.join('=');
			}
		}
	},

	referrerComparison : function(){
		var refer_full = document.referrer;
		var myRe=/^\w+:\/\/[^/]+\//;
		var main_part_of_refer = myRe.exec(refer_full) + '';
		var current_url = window.location;
		var main_part_of_current_url = myRe.exec(current_url) + '';
		main_part_of_current_url = main_part_of_current_url;
		switch(main_part_of_refer){
			case "http://search.yahoo.com/" :
				var searchRequestWords = /p=[^&]+/i ;
				var yahooWords = searchRequestWords.exec(refer_full);
				var url = "http://search.yahoo.com/search?" + yahooWords;
				break;
			case "http://www.google.com/" :
				var searchRequestWords = /q=[^&]+/i ;
				var googleWords = searchRequestWords.exec(refer_full);
				var url = "http://www.google.com/search?" + googleWords;
				break;
			default :
				var url = main_part_of_refer == main_part_of_current_url ? (/[^\?]+/.exec(document.referrer) + '').substring(main_part_of_current_url.length - 1) : (/[^\?]+/.exec(document.referrer) + '');
				break;
		}
		return url;
	},

	getCurrentLocation : function () {
		var myRe=/^\w+:\/\/[^/]+\//;
		var current_url = window.location + '';
		var domain = myRe.exec(current_url) + '';
		var myRe=/\?.*/;
		var get = myRe.exec(current_url);
		get = get == null ? '' : (get + '');
		var current_location = current_url.substring(domain.length - 1, current_url.length - get.length);
		return current_location;
	},

	setCookie : function (name, value) {
		document.cookie = name + "=" + value + ";";// Path=/
	},

	setCookie2 : function (name, value, expires, path, domain, secure) {
		var curCookie = name + "=" + escape(value) +
		((expires) ? "; expires=" + expires.toGMTString() : "") +
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		((secure) ? "; secure" : "");
		document.cookie = curCookie;
	}

}