// 2012-02-14 15:06

var __advPrsrConfig = {
	version: "1.21",
	versionSignatures: "1.04",
	bannerMinWidth: 20, // pixels
	bannerMinHeight: 20 // pixels
};

if(typeof(console)=="undefined") {var console = {log:function(){},debug:function(){},error:function(){},info:function(){},warn:function(){}};}
console.debug = console.debug || console.log; // For IE 8

var __advPrsr = {
	_tm_startTime: (new Date().getTime()),
	_tm_pageLoadTime: 0,
	_tm_pageLoadTimeIsSent: false,
	_tm_tnsId: null,
	_tm_isSendable: false,
	_tm_send: function(p1,p2,p3,p4) {
		// alert(p1+"\n"+p2+"\n"+p3+"\n"+p4);
		if(__advPrsr._tm_isSendable) {
			try {
				console.log(p1,p2,p3,p4);
				if(typeof(p4)!="undefined") {
					__advPrsr._tm_tnsId.send(p1,p2,p3,p4);
				} if(typeof(p3)!="undefined") {
					__advPrsr._tm_tnsId.send(p1,p2,p3);
				} else if(typeof(p2)!="undefined") {
					__advPrsr._tm_tnsId.send(p1,p2);
				} else if(typeof(p1)!="undefined") {
					__advPrsr._tm_tnsId.send(p1);
				}
			}catch(e){console.log(e);};
		} else {
			console.log("_tm_isSendable:"+_tm_isSendable);
		}
	},
	_tm_reportDuration_counter:0,
	_tm_reportDuration:function() {
		var sec = Math.round(((new Date().getTime()) - __advPrsr._tm_startTime)/1000);
		if(__advPrsr._tm_pageLoadTime>0 && __advPrsr._tm_pageLoadTimeIsSent==false) {
			__advPrsr._tm_send("~cm_timer~", sec, "", __advPrsr._tm_pageLoadTime);
			__advPrsr._tm_pageLoadTimeIsSent = true;
		} else {
			__advPrsr._tm_send("~cm_timer~", sec);
		}
		__advPrsr._tm_reportDuration_counter++;
		setTimeout(__advPrsr._tm_reportDuration, (__advPrsr._tm_reportDuration_counter<4 ? 4000 : 30000));
	},
	serverURL:(function(){
		var _scriptTags = document.getElementsByTagName("script");
		for(var i=0; i<_scriptTags.length; i++) {
			var _match = /^(.*)\/cmeter\.js$/.exec(_scriptTags[i].getAttribute("src"));
			if(_match && typeof(_match[1]) != "undefined") {
				return _match[1]+"/";
			}
		}		
	})(),
	_isPageReady: false,
	signatures: [],
	foundBanners: [],
	docSize: [0,0],	
	tryInit: function() {
		if(__advPrsr._isPageReady && __advPrsr._tm_isSendable) {
			__advPrsr._tm_pageLoadTime = (new Date().getTime()) - __advPrsr._tm_startTime;
			__advPrsr.loadSignatures();
		}
	},
	loadSignatures: function() {
		__advPrsr.__includeJS(__advPrsr.serverURL+"signatures/main.js?v="+__advPrsrConfig.versionSignatures, __advPrsr.parse);
	},
	setSignatures: function(signaturesArr) {
		var urlMaskToRegExp = function(str) {
			function replaceAll(str, what, to) {
				return str.split(what).join(to);
			}
			var res = str;
			var arr = ["\\", "#", "|", "(", ")", "[", "]", "{", "}", "^", "$", "+", "."];
			var len = arr.length;
			for(var i=0; i<len; i++) {
				res = replaceAll(res, arr[i], "\\"+arr[i]);
			}
			res = replaceAll(res, "*", ".*");
			res = replaceAll(res, "?", ".");
			return "^"+res+"$";
		}
		
		var sA = __advPrsr.signatures;
		for(var _s=0, _sL=signaturesArr.length; _s<_sL; _s++) {
			if(signaturesArr[_s][0]==3) {
			// if size-signature
				var size = signaturesArr[_s][1].split("x");
				sA.push([3, size[0], size[1]]);
			} else if(signaturesArr[_s][0]==1) {
			// if url-mask-signature
				sA.push([1, urlMaskToRegExp(signaturesArr[_s][1])]);
			} else {
			// if another-signature
				sA.push(signaturesArr[_s]);
			}
		}
	},
	parse: function () {
		var	getStyle = function(el, name) {
				if (el.style[name]) return el.style[name];
				else if (el.currentStyle) return el.currentStyle[name];
				else if (document.defaultView && document.defaultView.getComputedStyle) {
					name = name.replace(/([A-Z])/g,"-$1");
					name = name.toLowerCase();
					var s = document.defaultView.getComputedStyle(el,"");
					return s && s.getPropertyValue(name);
				} else return null;
			},
			getTop = function (el) {return el.offsetParent ? el.offsetTop + getTop( el.offsetParent ) : el.offsetTop;},
			getLeft = function (el) {return el.offsetParent ? el.offsetLeft + getLeft( el.offsetParent ) : el.offsetLeft;},
			getWOrH = function(el, type) {
				var	res = type=="width" ? el.offsetWidth : el.offsetHeight,
					_cssProps = type=="width" ? ["paddingLeft","paddingRight","borderLeftWidth","borderRightWidth"] : ["paddingTop","paddingBottom","borderTopWidth","borderBottomWidth"],
					l;
				if(res>0) {
					for(l=_cssProps.length; l--;) {
						res -= parseInt(getStyle(el, _cssProps[l]), 10) || 0;
					}
				}
				return parseInt(res || getStyle(el,type), 10);
			},
			getWidth = function(el) {return getWOrH(el, 'width');},
			getHeight = function(el) {return getWOrH(el, 'height');},
			_elSizes = [], /*[top, left, width, height]*/
			_setSizes = function(el) {_elSizes = [getTop(el), getLeft(el), getWidth(el), getHeight(el)];},
			_clearSizes = function() {_elSizes = [];},
			_isSizesSet = function() {return !(_elSizes.length==0);};
		
		__advPrsr.docSize = [getWidth(document.body), getHeight(document.body)];
		
		var filterAdv = function(doc, sel) {
			var elemArr = doc.getElementsByTagName(sel);
			var sA = __advPrsr.signatures;
			var isIframePermitted = function(el){
				var res = false;

				// Check if iframe loads from the same domain (if iframe is permited):
				var _elSrc = el.getAttribute("src");
				if(_elSrc === null) {_elSrc = "";}
				if(
					// Check if it's relative URL
					( _elSrc.indexOf("http")!==0 && _elSrc.indexOf("//")!==0 )
					||
					// it's not relative URL, so try to compare with site URL
					(
						_elSrc.indexOf("//"+location.host)===0
						|| _elSrc.indexOf(location.protocol + "//" + location.host)===0
					)

				) {
					res = true;
				}

				// Addition check if it's could be permitted iFrame, to confirm the result
				if(res == true) {
					res = false;
					try {
						if(typeof(el.contentDocument)!="undefined"){
							try {
								if(typeof(el.contentDocument.getElementById)!="undefined") {
									res = true;
								}
							} catch(e) {};
						}
					} catch(e2) {};
				}

				return res;
			}
			for(var _e=0, _eL=elemArr.length; _e<_eL; _e++) {
				var el = elemArr[_e];
				if(el.tagName=="IFRAME" && isIframePermitted(el)) {
					// recursive search in iframes
					if(!_isSizesSet()) {_setSizes(el);}
					filterAdv(el.contentDocument, "img");
					filterAdv(el.contentDocument, "embed");
					filterAdv(el.contentDocument, "object");
					filterAdv(el.contentDocument, "iframe");
				} else {
					var	_elScr='',
						_elWidth=0,
						_elHeight=0;

					if(sel=="object") {
						_elScr = el.getAttribute("data");
						if(!_elScr) {
							var _objParams = el.getElementsByTagName("param");
							for(var _len=_objParams.length; _len>0; _len--) {
								if(_objParams[_len-1].getAttribute("name") == "movie") {
									_elScr = _objParams[_len-1].getAttribute("value");
									break;
								}
							}
						}
					} else {
						_elScr = el.getAttribute("src");
					}

					_elWidth = getWidth(el);
					_elHeight = getHeight(el);

					/* If banner isn't less then min banner min size */
					if(_elWidth>__advPrsrConfig.bannerMinWidth && _elHeight>__advPrsrConfig.bannerMinHeight) {
						for(var _s=0, _sL=sA.length; _s<_sL; _s++) {
							// Comparison with signatures
							if(
								/*by banner size (example: 468x60)*/
								(sA[_s][0]==3 && _elWidth==sA[_s][1] && _elHeight==sA[_s][2])
								/*by url (example: *adv*.jpg)*/
								|| (sA[_s][0]==1 && (new RegExp(sA[_s][1]).test(_elScr)))
							) {
								if(!_isSizesSet()) {_setSizes(el);}
								_elScr = __advPrsr.__correctBannerURL(doc, _elScr);
								var _elSrcFoundFirstly = true;
								for(var _len = __advPrsr.foundBanners.length; _len>0; _len--) {
									if(_elScr === __advPrsr.foundBanners[_len-1][2]) {
										_elSrcFoundFirstly = false;
										break;
									}
								}
								if(_elSrcFoundFirstly) {
									// alert(sA[_s][1] +"\n"+ _elWidth +"x"+ _elHeight);
									__advPrsr.foundBanners.push([el, _elSizes, _elScr]);
								}
								_clearSizes();
								//el.style.boxShadow = "0px 0px 20px 10px #F00";
								//el.style.border = "2px solid #F00";
								break;
							}
						}
					}
				}
			}
		}
		filterAdv(document, "img");
		filterAdv(document, "embed");
		filterAdv(document, "object");
		filterAdv(document, "iframe");
		__advPrsr.postAdv();
	},
	getPosition: function(posArr /*[top, left, width, height]*/) {
		var	res = "",
			centerX = parseInt(posArr[1]) + Math.round(posArr[2]/2),
			centerY = parseInt(posArr[0]) + Math.round(posArr[3]/2),
			percentCX = __advPrsr.docSize[0]!=0 ? centerX/__advPrsr.docSize[0] : 0;
		res = percentCX<0.25 ? "l" : (percentCX>0.75 ? "r" : "m");
		res += centerY<300 ? "t" : (__advPrsr.docSize[1]-centerY<300 ? "b" : "m");
		return res;
	},
	postAdv: function() {
		console.log("found Banners: "+__advPrsr.foundBanners.length);
		var	fB = __advPrsr.foundBanners,
			_bL=fB.length,
			_siteURL = location;
		for(; _bL--;) {
			__advPrsr._tm_send("~cm~", fB[_bL][2], __advPrsr.getPosition(fB[_bL][1]));
		}
	},
	__correctBannerURL: function(doc, bannerURL) {
		if(bannerURL.indexOf("http://")!==0 && bannerURL.indexOf("https://")!==0 && bannerURL.indexOf("//")!==0) {
			var siteURL = doc.location.protocol + "//" + doc.location.host + "/";

			if(bannerURL.indexOf("/")===0) {
				bannerURL = bannerURL.replace("/", siteURL);
			} else {
				if(bannerURL.indexOf("./")===0) {
					bannerURL = bannerURL.replace("./", "");
				}
				var _h=doc.location.href;
				var _pos = _h.lastIndexOf("/");
				if(_pos>0) {
					_h = _h.substring(0, _pos);
				}
				bannerURL = _h + "/" + bannerURL;
			}
		}
		return bannerURL;
	},
	__includeJS: function(url, callback) {
		var sa = document.createElement("script");
		sa.type = "text/javascript";
		sa.async = true;
		sa.src = url;
		// sa.onload = callback; // <-- it does not work in IE
		// Attach handlers for all browsers
		sa.onload = sa.onreadystatechange = function() {
			if (!("readyState" in sa) /* for all browsers except IE */  || /loaded|complete/.test(sa.readyState) /* for IE */) {
				// Handle memory leak in IE
				sa.onload = sa.onreadystatechange = null;
				// Callback
				callback();
			}
		}
		var s=document.getElementsByTagName("script")[0];
		s.parentNode.insertBefore(sa,s);
	},
	__tryInitTnsId: function() {
		if(typeof tnsId !== "undefined") {
			__advPrsr._tm_tnsId = new tnsId("cm"+__advPrsrConfig.version+"-"+__advPrsrConfig.versionSignatures+"/");
		} else {
			setTimeout(__advPrsr.__tryInitTnsId, 500);
		}
	}
};
// try init TnsId for the case if it will be uplaoded latter
__advPrsr.__tryInitTnsId();

function onIdReady() {
	__advPrsr._tm_isSendable = true;
	__advPrsr.tryInit();
	__advPrsr._tm_reportDuration();
}

(function() {
	var	w = window,
		_tryInitAdvPrsr = function() {
			__advPrsr._isPageReady = true;
			__advPrsr.tryInit();
		};

	if (document.readyState === "complete") {
		_tryInitAdvPrsr();
	} else {
		if("addEventListener" in w) {
			w.addEventListener( "load", _tryInitAdvPrsr, false);
		} else if ("attachEvent" in w) {
			w.attachEvent("onload", _tryInitAdvPrsr);
		}
	}
})();
