function SettignsElements() {
	var dublicate = this;

	this.popUP = {
		// html: "{close}<div class='header'>{title}</div><div class='content'>{iframe}</div><div class='scroll'>{scroll}</div>",
      html: "{close}<div class='content'>{iframe}</div><div class='scroll'>{scroll}</div>",
		titleHtml: "<h1>{text}</h1>",
		closeHtml: "<img class='close' src='/media/system/i/popup/close.gif' width='30' height='30' alt='x' />",
		containerClass: "center-popup",
		sizeClassPrefix: "cp-size-"
	};
}

var elements = new SettignsElements();

var dom = {
	ie: navigator.userAgent.indexOf("MSIE") > -1,
	opera: navigator.userAgent.indexOf("Opera") > -1,
	webkit: /WebKit/.test(navigator.userAgent),
	fox: navigator.userAgent.indexOf("Firefox") > -1,
	scrollSpeedInPage: .8,
	get: function(parent, tagName, className, attrHash) {
		// parent - родитель, или массивHTML-элементов или нодесет 
		// tagName - строка
		// className - строка или массив
		// attrHash - объект { name: value }
		var tags, ret;
		if (parent.length) {
			ret = dom.nodesetToArray(parent);
			for (var i=0, l=ret.length, r, ok; i<l; i++) {
				if ( (ret[i].tagName || "").toLowerCase() != tagName.toLowerCase() ) {
					ret.splice(i, 1);
					i--;
					l--;
				}
			}
		} else {
			ret = dom.nodesetToArray( parent.getElementsByTagName( tagName ) );
		}
		if (className) {
			for (var i=0, l=ret.length, r, ok; i<l; i++) {
				r = ret[i];
				ok = true;
				if (className.constructor == Array) {
					for (var i2=0, l2=className.length, c; ok, i2<l2; i2++) {
						c = className[i2];
						ok = true;
						if ( !dom.hasClass( r, c ) ) ok = false;
					}
				} else if (className) {
					if ( !dom.hasClass( r, className ) ) ok = false;
				}
				if (!ok) {
					ret.splice(i, 1);
					i--;
					l--;
				}
			}
		}
		if (attrHash) {
			for (var i=0, l=ret.length, r, ok; i<l; i++) {
				r = ret[i];
				ok = true;
				for (var attrName in attrHash) {
					if ( !dom.hasAttr(r, attrName, attrHash[attrName]) ) ok = false;
				}
				if (!ok) {
					ret.splice(i, 1);
					i--;
					l--;
				}
			}
		}
		return ret || [];
	},
	ancestors: function(node) {
		var ret = [];
		while(node = node.parentNode)
         if (node.nodeType == 1) ret.push(node);
		return ret;
	},
	descendants: function(node, nodeType) {
		var ret = [];
		f(ret, node.firstChild);
		if (typeof(nodeType)=="number") {
			var ret2 = [];
			for (var i=0, l=ret.length; i<l; i++) {
				if (ret[i].nodeType == nodeType) ret2.push(ret[i]);
			}
			return ret2;
		} else {
			return ret;
		}
	 
		function f(arr, cur) {
			arr.push(cur);
			if (cur.firstChild) f(arr, cur.firstChild);
			if (cur.nextSibling) f(arr, cur.nextSibling);
		}
	},
	cr: function(tagName, className, inside, attrHash, propHash, listenersHash) {
		var ret = document.createElement( tagName );
		if (className) ret.className = className;
		if (inside) {
			if ( typeof(inside)=="string" ) {
				ret.innerHTML = inside;
			} else if (inside.constructor == Array) {
				for (var i=0, l=inside.length; i<l; i++) {
					if (inside[i].nodeType) ret.appendChild(inside[i]);
				}
			} else if (inside.nodeType) {
				ret.appendChild(inside);
			}
		}
		if (attrHash) {
			for (var name in attrHash) ret.setAttribute(name, attrHash[name]);
		}
		if (propHash) {
			for (var name in propHash) ret[name] = propHash[name];
		}
		if (listenersHash) {
			dom.addListener(ret, listenersHash);
		}
		return ret;
	},
	rem: function(node) {
		return node.parentNode.removeChild( node );
	},
	clear: function(node) {
		while(node.firstChild) node.removeChild(node.firstChild);
		return node;
	},
	text: function(node) {
		return String(node.textContent || node.innerText);
	},
	nodesetToArray: function(nodeset) {
		var ret = [];
		for (var i=0, l=nodeset.length, r, ok; i<l; i++) {
			ret[i] = nodeset[i];
		};
		return ret;
	},
	hasClass: function(node, need) {
		return (new RegExp("(^|\\s)"+ (need || "").toLowerCase().replace(/\-/g, "\\-") +"(\\s|$)")).test( (node.className || "").toLowerCase() );
	},
	hasAttr: function(node, name, need) {
		return (new RegExp("(^|\\s)"+ need +"(\\s|$)")).test( node.getAttribute(name) );
	},
	addClass: function(node, name) {
		if (!dom.hasClass(node, name)) node.className += " " + name;
		return node;
	},
	remClass: function(node, name) {
		node.className = node.className.replace( new RegExp("(^|\\s)"+ name +"(\\s|$)"), " ");
		return node;
	},
	style: function(node, styleName, toInt) {
		if ( !document.defaultView && styleName.indexOf("-")>-1) {
			styleName = styleName.replace(/-top/, "Top");
			styleName = styleName.replace(/-right/, "Right");
			styleName = styleName.replace(/-bottom/, "Bottom");
			styleName = styleName.replace(/-left/, "Left");
		}
		var ret = document.defaultView 
			? document.defaultView.getComputedStyle(node, null).getPropertyValue(styleName)
			: node.runtimeStyle[styleName] || node.currentStyle[styleName];
		if (toInt) ret = parseInt(ret);
		return ret;
	},
	xy: function(node) {
		var x = 0, y = 0;
		while(node.offsetParent) {
			x += node.offsetLeft;
			y += node.offsetTop;
			node = node.offsetParent;
		}
		return [x, y];
	},
	whStyle: function(node, toggleVisibility) {
		if (toggleVisibility) {
			node.style.visibility = "hidden";
			node.style.display = "block";
		}
		if (dom.opera) {
			var ret = ret = [ parseInt(dom.style(node, "width")), parseInt(dom.style(node, "height"))];
			ret[0] -= dom.style(node, "border-left", 1) + dom.style(node, "padding-left", 1) + dom.style(node, "padding-right", 1) + dom.style(node, "border-right", 1);
			ret[1] -= dom.style(node, "border-top", 1) + dom.style(node, "padding-top", 1) + dom.style(node, "padding-bottom", 1) + dom.style(node, "border-bottom", 1);
		} else {
			var ret = [ parseInt(dom.style(node, "width")), parseInt(dom.style(node, "height"))];
		}
		if (toggleVisibility) {
			node.style.display = "none";
			node.style.visibility = "visible";
		}
		return ret;
	},
	addListener: function(node, listeners) {
		if (node==="body") node = document.getElementsByTagName("body")[0];
		if (node.addEventListener) {
			for (var name in listeners) {
				node.addEventListener(name, listeners[name], false);
			}
		} else {
			for (var name in listeners) {
				node.attachEvent("on"+ name, listeners[name]);
			}
		}
	},
	remListener: function(node, listeners) {
		if (node==="body") node = document.getElementsByTagName("body")[0];
		if (node.addEventListener) {
			for (var name in listeners) {
				try {
					node.removeEventListener(name, listeners[name], false);
				} catch(er) { ; }
			}
		} else {
			for (var name in listeners) {
				try {
					node.detachEvent("on"+ name, listeners[name]);
				} catch(er) { ; }
			}
		}
	},
	stopEvent: function(evt) {
		var evt = evt || window.event;
		if (evt.stopPropogandation) evt.stopPropogandation();
		if (evt.preventDefault) evt.preventDefault();
		evt.returnValue = false;
		evt.cancelBubble = true;
		return false;
	},
	setPositionNear: function(node, ofNode, x, y) {
		var coords = dom.xy(ofNode);
		var dx = typeof(x)=="number" ? x : x=="right" ? ofNode.offsetWidth : 0;
		var dy = typeof(y)=="number" ? y : y=="bottom" ? ofNode.offsetHeight : 0;
		node.style.left = coords[0] + dx + "px";
		node.style.top = coords[1] + dy + "px";
	},
	scrollUp: function(node, insideNode, scrollBar) {
		// node - .scroll-content - элемент, который проматывается (absolute+top) вверх/вниз
		// insideNode - .scroll-container - элемент, внутри которого 
		// scrollBar - .scroll-bar
		var insideNode = insideNode || node.scrollInto;
		if (insideNode) {
			var scrollBar = scrollBar || node.scrollBar;
			if (scrollBar && !scrollBar.scrollable) return;
			var area = dom.whStyle(insideNode);
			var scrollBy = area[1] * dom.scrollSpeedInPage;
			if (dom.ie) scrollBy *= .5;
			var newTop = parseInt(dom.style(node, "top")) + scrollBy;
			if (newTop >= 0) {
				return dom.scrollTop(node, insideNode, scrollBar);
			}
			node.style.top = newTop +"px";
			if (scrollBar) {
				var y = (node.offsetHeight - scrollBar.visibleHeight) / newTop *-1;
				scrollBar.style.top = scrollBar.top + scrollBar.workHeight / y +"px";
			}
			dom.zoomZoom(node);
		}
	},
	scrollDown: function(node, insideNode, scrollBar) {
		var insideNode = insideNode || node.scrollInto;
		if (insideNode) {
			var scrollBar = scrollBar || node.scrollBar;
			if (scrollBar && !scrollBar.scrollable) return;
			var area = dom.whStyle(insideNode);
			var scrollBy = area[1] * dom.scrollSpeedInPage;
			if (dom.ie) scrollBy *= .5;
			var newTop = Math.round( parseInt(dom.style(node, "top")) - scrollBy );
			var newBottom = newTop + node.offsetHeight;
			if (newBottom <= area[1]) {
				return dom.scrollBottom(node, insideNode, scrollBar);
			}
			node.style.top = newTop +"px";
			if (scrollBar && scrollBar.scrollable) {
				var y = (node.offsetHeight - scrollBar.visibleHeight) / newTop *-1;
				scrollBar.style.top = scrollBar.top + scrollBar.workHeight / y +"px";
			}
			dom.zoomZoom(node);
		}
	},
	scrollTop: function(node, insideNode, scrollBar) {
		var insideNode = insideNode || node.scrollInto;
		if (insideNode) {
			node.style.top = "0px";
			var scrollBar = scrollBar || node.scrollBar;
			if (scrollBar && scrollBar.scrollable) {
				scrollBar.style.top = Number( scrollBar.top ) + "px";
			}
			dom.zoomZoom(node);
		}
	},
	scrollBottom: function(node, insideNode, scrollBar) {
		var insideNode = insideNode || node.scrollInto;
		if (insideNode) {
			if (dom.ie) {
				for (var c=node.childNodes, contentHeight=0, i=0, l=c.length; i<l; i++) {
					contentHeight += c[i].offsetHeight;
				}
				var newVal = Math.max(contentHeight, node.offsetHeight) - dom.whStyle(insideNode)[1];
				if (window.location.href.indexOf("qq=qq")>-1) {
					//alert( node.style.top +" >> "+ newVal +"\n\n"+ node.offsetHeight +"\n"+ contentHeight +"\n"+ dom.whStyle(insideNode)[1] )
				}
				// alert( (contentHeight - dom.whStyle(insideNode)[1]) +"\r"+ contentHeight +"\r"+ dom.whStyle(insideNode)[1]);
				// node.style.top = ( contentHeight - dom.whStyle(insideNode)[1] ) *-1 + "px";
				node.style.top = ( newVal ) *-1 + "px";
			} else {
				node.style.top = ( node.offsetHeight - dom.whStyle(insideNode)[1] ) *-1 + "px";
			}
			var scrollBar = scrollBar || node.scrollBar;
			if (scrollBar && scrollBar.scrollable) {
				scrollBar.style.top = scrollBar.maxTop + "px";
			}
			dom.zoomZoom(node);
		}
	},
	scrollContentByScrollBar: function(node, insideNode, scrollBar) {
		var scrollBar = scrollBar || node.scrollBar;
		var insideNode = insideNode || node.scrollInto;
		node.style.top = (node.offsetHeight - dom.whStyle(insideNode)[1]) *
			(  ( parseInt(scrollBar.style.top) - scrollBar.top ) / scrollBar.workHeight ) *
			-1 + "px";
	},
	scrollFor: function(forNode, node, insideNode, scrollBar) {
		var insideNode = insideNode || node.scrollInto;
		var scrollBar = scrollBar || node.scrollBar;
		node.style.top = "0px";
		if (scrollBar && !scrollBar.scrollable) return;
		var top = dom.whStyle(insideNode)[1] / 2 - ( forNode.offsetTop + forNode.offsetHeight / 2 );
		node.style.top = top +"px";
		if (scrollBar) {
			if ( top >= 0 ) {
				dom.scrollTop(node, insideNode, scrollBar);
			} else if ( top <= (node.offsetHeight - dom.whStyle(insideNode)[1]) *-1 ) {
				dom.scrollBottom(node, insideNode, scrollBar);
			} else {
				scrollBar.style.top = (scrollBar.workHeight * top *-1) / ( node.offsetHeight - dom.whStyle(insideNode)[1] ) +"px";
			}
		}
	},
	ie6Refresh: function(allBrowsers) {
		//if (!dom.ie) return;
		if (dom.fox) return;
		// var zzz = window.location.href.indexOf("zzz")>-1;
		if (dom.opera) {
			var top = document.getElementById("header");
			var d = top.offsetParent.offsetTop;
			if (d) top.style.marginTop = d * -1 +"px";
			return;
		}
		var nodes = [
			document.getElementsByTagName("body")[0]
			// , document.getElementsByTagName("html")[0]
			, document.getElementById("header")
			// , document.getElementById("top")
			, document.getElementById("footer")
			// , document.getElementById("uefa-div")
			// , document.getElementById("top-bar")
		];
		// if (zzz) alert(navigator.userAgent +"\n"+ nodes.length);
		for (var i=0, l=nodes.length, node; i<l; i++) {
			node = nodes[i];
			if (!node) continue;
			node.style.paddingBottom = "1px";
			node.style.paddingBottom = "0px";
			// if (zzz) node.style.border = "1px solid "+ (i==3 ? "red" : "blue");
		}
		//alert(top.offsetTop)
	},
	zoomZoom: function(node) {
		if (!dom.ie) return;
		for (var c=node.childNodes, i=0, l=c.length; i<l; i++) {
			node.style.zoom = "101%";
		}
		for (var c=node.childNodes, i=0, l=c.length; i<l; i++) {
			node.style.zoom = "100%";
		}
	},
	getPage: function(adr, callBack) {
		if (adr.indexOf("about:blank")==0) adr = adr.substring("about:blank".length);
		var pos = adr.indexOf("?");
		if (pos > -1) {
			var path = adr.substring(0, pos);
			var get = adr.substring(pos+1);
			get = get.split("&");
			if (!get.length) get = adr.substring(pos+1);
			var hash = {};
			for (var i=0, l=get.length, param, v; i<l; i++) {
				param = get[i].split("=");
				v = param[1];
				hash[param[0]] = typeof(v)=="undefined" ? "" : v;
			}
		} else {
			var path = adr;
			var hash = {};
			
		}
		ajaxSend(path, hash, function(q) {
			callBack(q.responseText);
		} )
	},
	readCookie: function(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	},
	setCookie: function(name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	},
	eraseCookie: function(name) {
		setCookie(name,"",-1);
	}
};


function PopUp(settings) {
	var dublicate = this;
	var node = null;
	var subcontrols = {
		title: [Title, []],
		close: [Close, []],
		iframe: [Frame, []],
		scroll: [Scroll, []]
	};
	var settings = settings || typeof(elements)!="undefined" ? elements.popUP : false;
	var cover;
	var visible = false;
	var headerText, src;
	
	this.setSrc = function(newSrc) {
		//try {
			src = newSrc;
			for (var i=0, a=subcontrols.iframe[1], l=a.length; i<l; i++) {
				a[i].onSrcChange();
			}
			// dom.addClass( dom.get(node, "div", "content")[0], "reloading");
			dom.addClass( node, "reloading");
		//} catch(er) {}
	};
	
	this.get = function() {
		//try {
			return node || create();
		//} catch(er) {}
	};
	
	this.show = function() {
		//try {
			if (!node) create();
			dublicate.addCover();
			dublicate.refresh(true);
			node.style.display = "block";
			if (cover) cover.style.display = "block";
			visible = true;
			dublicate.refresh();
		//} catch(er) {}
	};
	
	this.hide = function() {
		//try {
			node.style.display = "none";
			if (cover) cover.style.display = "none";
			visible = false;
			dom.setCookie('ASP.NET_SessionId','',-1);
		//} catch(er) {}
	};
	
	this.addCover = function() {
		//try {
			if (!cover) {
				cover = dom.cr("div", "popup-cover");
				cover.style.display = "none";
				if (node) {
					node.parentNode.insertBefore(cover, node);
				} else {
					document.getElementsByTagName("body")[0].appendChild(cover);
				}
				cover.onclick = dublicate.hide;
			}
		//} catch(er) {}
	};
	
	this.changeSize = function(name) {
		node.className = settings.containerClass +" "+ settings.sizeClassPrefix + name;
	};
	
	this.refresh = function(noCheckVisible) {
		if (!visible && noCheckVisible!==true) return;
		//try {
			if (!node) return;
			var docHeight = document.documentElement.scrollHeight;
			var visibleLeft = document.documentElement.scrollLeft;
			var visibleTop = document.documentElement.scrollTop;
			
			// cover.style.display = "none"; // ie6 window.resize
			var visibleWidth = document.documentElement.clientWidth;
			var visibleHeight = document.documentElement.clientHeight;
			
			var visibleCenter = [
				visibleLeft + visibleWidth / 2,
				visibleTop + visibleHeight / 2
			];
			
			var wh = dom.whStyle(node, !visible);
			var newLeft = Math.max(document.documentElement.scrollLeft, visibleCenter[0] - (wh[0]/2));
			var newTop = Math.max(document.documentElement.scrollTop, visibleCenter[1] - (wh[1]/2));
			if (newTop + wh[1] >= docHeight) newTop = docHeight - wh[1] - 5;
			node.style.left = newLeft +"px";
			node.style.top = newTop +"px";
			if (cover) {
				cover.style.width = visibleLeft + visibleWidth +"px";
				if (visible) cover.style.display = "block";
				cover.style.height = document.documentElement.scrollHeight+"px"; // visibleTop + visibleHeight +"px";
			}
		//} catch(er) {}
	};
	
	function contentLoad() {
		for (var i=0, a=subcontrols.iframe[1], l=a.length; i<l; i++) {
			try {
				a[i].onContentLoad();
			} catch(er) {}
		}
		// dom.remClass( dom.get(node, "div", "content")[0], "reloading");
		dom.remClass( node, "reloading");
	}
	
	function contentUnload() {
		for (var i=0, a=subcontrols.iframe[1], l=a.length; i<l; i++) {
			try {
				a[i].onContentUnload();
			} catch(er) {}
		}
	}
	
	function create() {
		var strInnerHTML = settings.html;
		if (!strInnerHTML) return;
		var ret = dom.cr("div", settings.containerClass);
		ret.innerHTML = strInnerHTML;
		var nodes = dom.descendants(ret, 3);
		node = ret;
		for (var i=0, l=nodes.length, text, charFirst, charLast, subcontrolName, subcontrolData, subcontrol, collect=[], blockCollect; i<l; i++) {
			text = nodes[i].nodeValue +"";
			blockCollect = [];
			while( text.indexOf("}") > -1 ) {
				charFirst = text.indexOf("{");
				charLast = text.indexOf("}");
				subcontrolName = text.substring(charFirst+1, charLast);
				subcontrolData = subcontrols[subcontrolName];
				if (!subcontrolData) break;
				subcontrol = new subcontrolData[0]();
				blockCollect.push(subcontrol);
				collect.push(subcontrol);
				subcontrolData[1].push(subcontrol);
				text = text.substring(charLast+1);
			}
			if (blockCollect.length) {
				nodes[i].nodeValue = text;
				for (var i2=0, l2=blockCollect.length; i2<l2; i2++) {
					if (blockCollect[i2].get) {
						nodes[i].parentNode.insertBefore( blockCollect[i2].get(),  nodes[i]);
					} else {
						a=1;
					}
				}
			}
		}
		node.style.display = "none";
		document.getElementsByTagName("body")[0].appendChild(node);
		// window.onresize = window.onscroll = dublicate.refresh;
		dom.addListener(window, {resize: dublicate.refresh});
		dom.addListener(window, {scroll: dublicate.refresh});
		dom.addListener(node, {mousewheel: dom.stopEvent, DOMMouseScroll: dom.stopEvent});
		return node;
	};
	
	function Title() {
		var node = null;
		var textNode = null;
		var text = "";
		
		this.get = function() {
			return node || create();
		};
		
		this.set = function(val) {
			text = val;
			textNode.nodeValue = text;
		};
		
		function create() {
			var ret = dom.cr("div");
			ret.innerHTML = settings.titleHtml;
			node = ret.firstChild.cloneNode(true);
			ret.innerHTML = "";
			delete ret;
			var nodes = dom.descendants(node, 3);
			for (var i=0, l=nodes.length, t; i<l; i++) {
				t = nodes[i].nodeValue +"";
				if (t=="{text}") {
					textNode = document.createTextNode(text);
					nodes[i].parentNode.insertBefore(textNode, nodes[i]);
					nodes[i].parentNode.removeChild(nodes[i]);
					break;
				}
			}
			return node;
		}
	};
	
	function Close() {
		var node = null;
		
		this.get = function() {
			return node || create();
		};
		
		function create() {
			var ret = dom.cr("div");
			ret.innerHTML = settings.closeHtml;
			node = ret.firstChild.cloneNode(true);
			ret.innerHTML = "";
			delete ret;
			node.onclick = dublicate.hide;
			return node;
		}
	};
	
	function Frame() {
		var dublicate = this;
		var node;
		
		this.get = function() {
			return node || create();
		};
		
		this.setScroll = function(value) {
			var win = node.contentWindow;
			var doc = win.document;
			var docEl = doc.documentElement;
			//docEl.scrollTop = value;
			docEl.getElementsByTagName("body")[0].scrollTop = docEl.scrollTop = value;
		};
		
		this.getScrollData = function() {
			var win = node.contentWindow;
			var doc = win.document;
			var docEl = doc.documentElement;
			var body = docEl.getElementsByTagName("body")[0];
			//alert(Math.max(docEl.scrollTop, body.scrollTop));
			//return [docEl.scrollHeight, node.offsetHeight, docEl.scrollTop];
			return [docEl.scrollHeight, node.offsetHeight, Math.max(docEl.scrollTop, body.scrollTop)];
		};
		
		this.onSrcChange = function() {
			if (!src || src=="") return;
			if (node) node.setAttribute("href", src);
			if (node) node.setAttribute("src", src);
			node.href = src;
			node.src = src;
			node.style.display = "none";
		};
		
		this.onContentLoad = function() {
			window.setTimeout(wait100ms, 100);
			
			function wait100ms() {
				node.style.display = "block";
				var win = node.contentWindow;
				var doc = win.document;
				var docEl = doc.documentElement;
				var body = docEl.getElementsByTagName("body")[0];
				docEl.style.overflow = "hidden";
				if (body && body.style) body.style.overflow = "hidden";
				win.onunload = doc.onunload = docEl.onunload = contentUnload;
				onContentScrolled();
				// при overflow = "hidden", если крутить колесо мышки, событие scroll не создается (оно убого эмулируется onMouseWheelScroll'ом и вызывается onContentScrolled
				// тем не менее, scroll генерируется во многих других случаях (кроме клавиатуры): переход фокуса на элемент вне пределов видимости, перемещение мышки при зажатом колесе, etc.
				dom.addListener(win, {scroll: onContentScrolled, mousewheel: onMouseWheelScroll, DOMMouseScroll: onMouseWheelScroll});
				dom.addListener(docEl, {mousewheel: onMouseWheelScroll, DOMMouseScroll: onMouseWheelScroll});
				var title = docEl.getElementsByTagName("title");
				if (title) {
					title = title[0];
					title = title.innerHTML || " ";
					for (var i=0, l=subcontrols.title[1].length; i<l; i++) {
						subcontrols.title[1][i].set(title);
					}
				}
			}
		}
		
		function onMouseWheelScroll(evt) {
			var evt = evt || window.event;			
			var direction = evt.detail && evt.detail > 0 ? "down" : evt.wheelDelta && evt.wheelDelta < 0 ? "down" : "up";						
			
			if (dom.opera) direction = evt.detail && evt.detail > 0 ? "down" : "up";
			
			var win = node.contentWindow;
			var doc = win.document;
			var docEl = doc.documentElement;			
			if (dom.webkit) docEl = docEl.getElementsByTagName("body")[0];			
			docEl.scrollTop = docEl.scrollTop + ( docEl.clientHeight / ( direction=="down" ? 5 : -5 ) );
			
			onContentScrolled();
			dom.stopEvent(evt);
		}
		
		this.onContentUnload = function() {
			node.style.display = "none";
		};
		
		function onContentScrolled() {
			if (dublicate.skipNotify) return;
			var h = dublicate.getScrollData();
			subcontrols.scroll[1][0].setScrollData( h[0], h[1], h[2] );
		}
		
		function create() {
			node = dom.cr("iframe" , false, false, {"frameBorder": "0"}, false, { load: contentLoad } );
			return node;
		}
	};
	
	function Scroll() {
		var dublicate = this;
		var container;
		var bar;
		var overflowImg;
		var hide = true;
		var dragData = false;
		var contentHeight = {
			fullHeight: null, 
			visibleHeight: null, 
			scrolled: null,
			maxTop: null
		};
		var scrollHeight = {
			fullHeight: null,
			barHeight: null,
			maxTop: null,
			k: null // отношение одного проскроленного пиксела в контенте к одному проскроленному пикселу в полоске прокрутки
		};
		var noRefresh;
		
		this.get = function() {
			if (!container) create();
			// document.getElementsByTagName("body")[0].appendChild(scrollerContainer);
			return container;
		};
		
		this.show = function() {
			if (hide) {
				hide = false;
				container.style.display = "block";
			}
		};
		
		this.hide = function() {
			if (!hide) {
				hide = true;
				container.style.display = "none";
			}
		};
		
		this.refresh = function() {
			if (noRefresh) return;
			if (contentHeight.fullHeight <= contentHeight.visibleHeight) {
				dublicate.hide();
			} else {
				bar.style.top = contentHeight.scrolled / scrollHeight.k +"px";
				bar.style.height = scrollHeight.barHeight +"px";
				// overflowImg.style.height = scrollHeight.fullHeight +"px";
				dublicate.show();
			}
		};
		
		this.setScrollData = function(fullHeight, visibleHeight, scrolled) {
			var c = contentHeight;
			var s = scrollHeight;
			c.fullHeight = fullHeight;
			c.visibleHeight = visibleHeight;
			c.scrolled = scrolled;
			c.maxTop = fullHeight - visibleHeight;
			// var k = c.maxTop / c.fullHeight; // >= 1
			var k = c.fullHeight / c.visibleHeight; // >= 1
			
			s.fullHeight = dom.whStyle(container, hide)[1];
			s.barHeight = Math.round(scrollHeight.fullHeight / k);
			s.maxTop = s.fullHeight - s.barHeight;
			s.k = c.maxTop / s.maxTop; // >= 1
			// s.maxTop * s.k == c.maxTop
			dublicate.refresh();
		};
		
		function create() {
			container = dom.cr(
				"div", "scroll-container", [
					bar = dom.cr("div", "scroll-bar", "<div> </div>"), 
					overflowImg = dom.cr("img", "overflow-image", false, { src: "/media/system/i/popup/b.gif" }, false, { dragstart: dom.stopEvent } )
				],
				false,
				false,
				{ mousedown: onMouseDown }
			);
			dom.addListener( cover, { mousemove: onMouseMove, mouseup: onMouseUp } );
			dom.addListener( node, { mousemove: onMouseMove, mouseup: onMouseUp } );
		}
		
		function onMouseDown(evt) {
			var evt = evt || window.event;
			var yStart = dom.xy(bar)[1];
			var yEnd = yStart + scrollHeight.barHeight;
			var y = evt.clientY + Math.max(document.documentElement.scrollTop, document.getElementsByTagName("body")[0].scrollTop) // evt.clientY
			if (y>=yStart && y<=yEnd) {
				dragData = {
					startY: y,
					lastY: y
				};
			} else if (y<yStart) {
				subcontrols.iframe[1][0].setScroll( Math.max(0, contentHeight.scrolled - contentHeight.visibleHeight) );
			} else {
				subcontrols.iframe[1][0].setScroll( Math.min(contentHeight.maxTop, contentHeight.scrolled + contentHeight.visibleHeight) );
			}
			dom.stopEvent(evt);
		}
		
		function onMouseMove(evt) {
			if (!dragData || !scrollHeight.maxTop) return;
			var evt = evt || window.event;
			var y = evt.clientY + Math.max(document.documentElement.scrollTop, document.getElementsByTagName("body")[0].scrollTop) // evt.clientY
			var dy = y - dragData.lastY;
			var top = Math.round(parseInt(bar.style.top));
			var newTop = Math.min(scrollHeight.maxTop, Math.max(top + dy, 0));
			dragData.lastY = y;
			if (newTop!=top) {
				// bar.style.top = newTop + "px";
				// subcontrols.iframe[1][0].setScroll( newTop * scrollHeight.k );
				/*
				var needTop = newTop;
				var i=0;
				newTop += i;
				while( Math.round(Math.round(newTop * scrollHeight.k) / scrollHeight.k) != needTop ) {
					if (i==0) {
						i = 1;
					} else if (i>0) {
						i = i *-1;
					} else {
						i = i *-1 + 1;
					}
					newTop -= i*2;
				}
				*/
				subcontrols.iframe[1][0].skipNotify = true;
				subcontrols.iframe[1][0].setScroll( newTop * scrollHeight.k );
				subcontrols.iframe[1][0].skipNotify = false;
				bar.style.top = newTop +"px";
				// dublicate.refresh();
			}
		}
		
		function onMouseUp(evt) {
			dragData = false;
		}
	}
}


function popItUp(url, sizeName) {
	var p = new PopUp();
	p.addCover();
	p.show();
	if (typeof sizeName == "string") {
		p.changeSize(sizeName);
		p.refresh();
	}
	p.setSrc(url);
	return p;
}





