﻿function SettingsElements() {
	var dublicate = this;
	
	this.inputPlaceholder = {
		// текстовые интупы с дефолтовым текстом, который пропадает при фокусе
		c: InputPlaceholder,
		tag: "input",
		checkNode: function(node) {
			if (node.getAttribute("emptyValue")) return [node, node.getAttribute("emptyValue")];
		},
		createInstance: function(args) {
			return new InputPlaceholder(args[0], args[1]);
		}
	};
	this.selectPlaceholder = {
		// интупы с пунктом "Выберите...", окрашенные в серый
		c: SelectPlaceholder,
		tag: "select",
		checkNode: function(node) {
			if (/(^|\s)grayText(\s|$)/.test(node.className || "")) return [node];
		},
		createInstance: function(args) {
			return new SelectPlaceholder(args[0]);
		}
	};
	this.iframeLink = {
		// ссылки, которые должны открываться во всплывающем iframe
		c: IframeLink,
		tag: "a",
		settings: {
			// @rel="iframe[news]"
			"subscribe": { name: "subscribe", corner: "top-right", offset: [26, -26] }
		},
		reg: /(^|\s)iframe\[([^\]]*)\](\s|$)/,
		checkNode: function(node) {
			if (dublicate.iframeLink.reg.test(node.getAttribute("rel") || "")) {
				var settings = dublicate.iframeLink.reg.exec(node.getAttribute("rel") || "")[2];
				return [node, dublicate.iframeLink.settings[settings]];
			}
		},
		createInstance: function(args) {
			return new IframeLink(args[0], args[1]);
		}
	};
	this.dealersMap = {
		c: DealersMap,
		tag: "div",
		settings: {
			"defaultElementSettings": { defaultCity: "msk" },
			"map-1": { defaultCity: "krasnoyarsk" }
		},
		reg: /(^|\s)map(\s|$)/,
		checkNode: function(node) {
			if (dublicate.dealersMap.reg.test(node.className || "")) {
				var settings = dublicate.dealersMap.settings;
				return [node, settings[node.getAttribute("id")] || settings["defaultElementSettings"]];
			}
		},
		createInstance: function(args) {
			return new DealersMap(args[0], args[1].defaultCity);
		}
	};
	this.photoGallery = {
		c: PhotoGallery,
		tag: "div",
		settings: {
			"defaultElementSettings": { minWidth: 500, maxWidth: 600, padding: 1 }
		},
		reg: /(^|\s)photos(\s|$)/,
		checkNode: function(node) {
			if (dublicate.photoGallery.reg.test(node.className || "")) {
				var settings = dublicate.photoGallery.settings;
				return [node, settings[node.getAttribute("id")] || settings["defaultElementSettings"]];
			}
		},
		createInstance: function(args) {
			return new PhotoGallery(args[0], args[1]);
		}
	};
	this.catalog = {
		c: typeof(Catalog)=="function" ? Catalog : null,
		tag: "form",
		settings: {
			"defaultElementSettings": { page: "" }
		},
		reg: /(^|\s)catalogue(\s|$)/,
		checkNode: function(node) {
			if (dublicate.catalog.reg.test(node.className || "")) {
				var settings = dublicate.catalog.settings;
				return [
					node, 
					(settings[node.getAttribute("id")] || settings["defaultElementSettings"])
				];
			}
		},
		createInstance: function(args) {
			dublicate.catalog.c = typeof(Catalog)=="function" ? Catalog : null;
			//waitCatalog.settingsElements = dublicate.catalog;
			waitCatalog(args[0], args[1]);
		}
	};
	
	function hasClass(node, need) {
		return (new RegExp("(^|\\s)"+ (need || "").toLowerCase().replace(/\-/g, "\\-") +"(\\s|$)")).test( (node.className || "").toLowerCase() );
	}
}
var settingsElements = new SettingsElements();

function registerInitedObject(constructor, obj, node) {
	constructor.initedNodes.push(node);
	registerInitedObject.nodes.push(node);
	registerInitedObject.objs.push(obj);
	constructor.initedObjects.push(obj);
}
registerInitedObject.nodes = [];
registerInitedObject.objs = [];

function batSignal() {
	var nodes = [
		document.getElementsByTagName("body")[0]
		, document.getElementById("logo")
		, document.getElementById("footer")
	];
	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";
	}
}

function InputPlaceholder(input, emptyValue) {

	input.onfocus = function() {
		if (input.value==emptyValue) {
			input.value = "";
			input.className = (input.className || "").replace(/(^|\s)grayText(\s|$)/g, "");
		}
	};
	input.onblur = function() {
		if (/^\s*$/.test(input.value) || input.value==emptyValue) {
			input.className = (input.className || "") +" grayText";
			window.setTimeout(setEmptyValue, 10);
		}
	};
	
	function setEmptyValue() {
		input.value = emptyValue;
	}
	
	input.onblur();
	
	// сохраняем созданный объект
	registerInitedObject(InputPlaceholder, this, input);
}
InputPlaceholder.initedNodes = [];
InputPlaceholder.initedObjects = [];

function SelectPlaceholder(select) {

	select.onchange = select.onclick = select.onkeyup = check;
	
	function check() {
		if (select.selectedIndex>0) {
			remGrayClass();
		} else {
			addGrayClass();
		}
	}
	
	function remGrayClass() {
		select.className = (select.className || "").replace(/(^|\s)grayText(\s|$)/g, "");
	}
	
	function addGrayClass() {
		select.className = (select.className || "") +" grayText";
	}
	
	check();
	
	// сохраняем созданный объект
	registerInitedObject(SelectPlaceholder, this, select);
}
SelectPlaceholder.initedNodes = [];
SelectPlaceholder.initedObjects = [];

function IframeLink(node, settings) {
	var nodes = {
		c: cr("iframe-with-shadow iws-settings-"+ settings.name),
		shadowT: cr("iws-shadow iws-top"),
		shadowTR: cr("iws-shadow iws-top-right"),
		shadowR: cr("iws-shadow iws-right"),
		shadowBR: cr("iws-shadow iws-bottom-right"),
		shadowB: cr("iws-shadow iws-bottom"),
		shadowBL: cr("iws-shadow iws-bottom-left"),
		shadowL: cr("iws-shadow iws-left"),
		shadowTL: cr("iws-shadow iws-top-left"),
		content: cr("iws-content"),
		iframe: crIframe(),
		body: document.getElementsByTagName("body")[0],
		toggler: node
	};

	nodes.toggler.onclick = function() {
		//try { toggle(); } catch(er) {}
		//alert("onclick");
		toggle();
		return false;
	};
	
	with (nodes) {
		c.appendChild(shadowT);
		c.appendChild(shadowTR);
		c.appendChild(shadowR);
		c.appendChild(shadowBR);
		c.appendChild(shadowB);
		c.appendChild(shadowBL);
		c.appendChild(shadowL);
		c.appendChild(shadowTL);
		c.appendChild(content);
		content.appendChild(iframe);
		c.style.display = "none";
		if (iframe.attachEvent) {
			iframe.attachEvent("onload", refresh);
		} else {
			iframe.addEventListener("load", refresh, false);
		}
		body.appendChild(c);
	}
	
	registerInitedObject(IframeLink, this, node);
	
	function toggle() {
		//alert("toggle");
		if (nodes.c.style.display=="none") {
			show();
		} else {
			hide();
		}
	}
	
	function show() {
		//alert("show");
		with (nodes.c.style) {
			visibility = "hidden";
			display = "block";
		}
		var url = settings.url || nodes.toggler.href;
		if (!url) return;
		nodes.iframe.src = url;
		//nodes.iframe.contentWindow.onload = refresh;
		//nodes.iframe.contentWindow.document.onload = refresh;
	}
	
	function hide() {
		with (nodes.c.style) {
			display = "none";
		}
	}
	
	function refresh() {
		if (nodes.iframe.src==false) return;
		nodes.iframe.contentWindow.hide = hide;
		var saveDisplay = nodes.c.style.display;
		with (nodes.c.style) {
			visibility = "hidden";
			display = "block";
		}
		var xy = getNodeXY(nodes.toggler);
		if (settings.corner.indexOf("right")>-1) xy[0] -= nodes.c.offsetWidth - nodes.toggler.offsetWidth;
		if (settings.corner.indexOf("bottom")>-1) xy[1] -= nodes.c.offsetHeight - nodes.toggler.offsetHeight;
		xy[0] += settings.offset[0];
		xy[1] += settings.offset[1];
		with (nodes.c.style) {
			left = xy[0] +"px";
			top = xy[1] +"px";
			display = saveDisplay;
			visibility = "visible";
		}
		/*window.setTimeout(refresh_1, 10);
		
		function refresh_1() {
			with (nodes.c.style) {
				visibility = "hidden";
				display = "block";
			}
			//alert(1);
			window.setTimeout(refresh_2, 10);
		}
		
		function refresh_2() {
			var xy = getNodeXY(nodes.toggler);
			if (settings.corner.indexOf("right")>-1) xy[0] -= nodes.c.offsetWidth - nodes.toggler.offsetWidth;
			if (settings.corner.indexOf("bottom")>-1) xy[1] -= nodes.c.offsetHeight - nodes.toggler.offsetHeight;
			xy[0] += settings.offset[0];
			xy[1] += settings.offset[1];
			with (nodes.c.style) {
				left = xy[0] +"px";
				top = xy[1] +"px";
			}
			//alert(2);
			window.setTimeout(refresh_3, 10);
		}
		
		function refresh_3() {
			with (nodes.c.style) {
				display = saveDisplay;
				visibility = "visible";
			}
			//alert(3);
		}*/
	}
	
	function getNodeXY(node) {
		var x = 0, y = 0;
		while(node && node.offsetParent) {
			x += node.offsetLeft;
			y += node.offsetTop;
			node = node.offsetParent;
		}
		return [x, y];
	}
	
	function cr(className) {
		var ret = document.createElement("div");
		if (className) ret.className = className;
		return ret;
	}
	
	function crIframe() {
		var ret = document.createElement("iframe");
		ret.setAttribute("frameBorder", "none");
		return ret;
	}
}
IframeLink.initedNodes = [];
IframeLink.initedObjects = [];

function DealersMap(mapNode, defaultCity) {
	var dublicate = this;
	
	var curCity;
	
	var label;
	var ancs;
	
	this.selectNone = function() {
		label.style.display = "none";
		curCity = false;
		
		// скрываем все таблицы, кроме изначальной
		hideTables(getCityFromURI() || defaultCity);
	};
	
	this.setCurrentCity = function(cityName, dontHideTables) {
		if (cityName==curCity) return;
		if (!ancs[cityName]) return;
		label.style.display = "block";
		if (navigator.userAgent.indexOf("MSIE 6")==-1) label.style.visibility = "hidden";
		
		var divs = label.getElementsByTagName("div");
		var mouseOverAnc = ancs[cityName];
		
		// совмещаем углы у треугольников
		var imageXY = getNodeXY(ancs[cityName]);
		label.style.left = imageXY[0] +"px";
		label.style.top = imageXY[1] +"px";
		var mark = divs[3]; // .map-label-mark
		var markXY = getNodeXY(mark);
		label.style.left = parseInt(label.style.left) - (markXY[0] - imageXY[0]) +"px";
		label.style.top = parseInt(label.style.top) - (markXY[1] - imageXY[1]) +"px";
		
		// совмещаем центры у треугольников
		label.style.left = parseInt(label.style.left) - Math.round((mark.offsetWidth - mouseOverAnc.offsetWidth)/2) +"px";
		label.style.top = parseInt(label.style.top) - Math.round((mark.offsetHeight - mouseOverAnc.offsetHeight)/2) +"px";
		
		
		// показываем название города
		var anc = label.getElementsByTagName("a")[0];
		if (!anc.firstChild) anc.appendChild( document.createTextNode(" ") );
		anc.firstChild.nodeValue = mouseOverAnc.textContent || mouseOverAnc.innerText;
		anc.href = "#"+ cityName; // и ставим ссылку на таблицу
		
		// растягиваем фоновую png
		var bg = divs[2]; // .map-label-bg
		bg.style.left = divs[0].offsetWidth +"px";
		bg.style.width = (divs[1].offsetLeft - divs[0].offsetWidth) +"px";
		//alert(label.offsetWidth +", "+ divs[4].clientWidth +", "+ divs[0].offsetWidth)
		
		// скрываем все таблицы, кроме новой
		if (dontHideTables != true) {
			hideTables(cityName);
		}

		// показываем
		label.style.visibility = "visible";
		
		//curCity = cityName;
	};
	
	this.hideLabel = function() {
		label.style.display = "none";
	};
	
	this.onDOMContentLoaded = function() {
		//hideTables(curCity || getCityFromURI() || defaultCity);
		//this.setCurrentCity(defaultCity, true);
	};

	label = createLabel();
	mapNode.appendChild(label);
	ancs = getCityAncs(mapNode);
	addSpan(ancs);
	addMouseOver(ancs);
	ancs = anksToHash(ancs);
	this.selectNone();
	
	// сохраняем созданный объект
	registerInitedObject(DealersMap, this, mapNode);
	
	function getCityFromURI() {
		var h = window.location.hash.substring(1);
		return ancs[h] ? h : false;
	}
	
	function hideTables(showTable) {
		var table;
		for (var key in ancs) {
			table = document.getElementById(key);
			if (!table) continue;
			table.style.display = key==showTable ? "" : "none";
		}
		try {
			batSignal();
		} catch(er) {}
	}
	
	function getCityAncs(mapNode) {
		var reg = /(^|\s)map\-list($|\s)/;
		var ul = mapNode.getElementsByTagName("ul");
		for (var i=0, l=ul.length; i<l; ++i) {
			if (reg.test(ul[i].className || "")) break;
		}
		if (i==l) throw "DealersMap: .map .map-list no exist"
		ul = ul[i];
		return ul.getElementsByTagName("a");
	}
	
	function addSpan(ancs) {
		for (var i=0, l=ancs.length, span, anc; i<l; ++i) {
			anc = ancs[i];
			span = document.createElement("span");
			span.appendChild( document.createTextNode(anc.firstChild.nodeValue) );
			anc.appendChild(span);
			anc.removeChild(anc.firstChild);
		}
	}
	
	function addMouseOver(ancs) {
		for (var i=0, l=ancs.length; i<l; ++i) {
			ancs[i].onmouseover = onMouseOver;
			ancs[i].onclick = function() {
				return false;
			};
		}
	}
	
	function onMouseOver() {
		var link = this.href;
		link = link.substring( link.indexOf("#") +1 );
		var q = curCity;
		dublicate.setCurrentCity(link, true);
		curCity = q;
		try {
			batSignal();
		} catch(er) {}
	}
	
	function onMouseOut() {
		//var link = curCity || defaultCity;
		label.style.display = "none";
		var link = curCity;
		curCity = "";
		dublicate.setCurrentCity(link, true);
		curCity = link;
		try {
			batSignal();
		} catch(er) {}
	}
	
	function anksToHash(ancs) {
		var ret = {};
		for (var i=0, l=ancs.length, link; i<l; ++i) {
			link = ancs[i].href;
			link = link.substring( link.indexOf("#") +1 );
			ret[link] = ancs[i];
		}
		return ret;
	}
	
	function createLabel() {
		var label = cr("map-label");
		label.appendChild( cr("map-label-left") );
		label.appendChild( cr("map-label-right") );
		label.appendChild( cr("map-label-bg") );
		label.appendChild( cr("map-label-mark") );
		var anc = document.createElement("a");
		label.appendChild( cr("map-label-text") ).appendChild( anc );
		//label.onmouseout = dublicate.selectNone;
		//label.onmouseout = dublicate.hideLabel;
		anc.onmouseout = onMouseOut;
		anc.onclick = function() { 
			var cityName = this.href.substring(this.href.indexOf("#") +1);
			dublicate.setCurrentCity( cityName );
			curCity = cityName;
			/*
			var cityName = this.href.substring(this.href.indexOf("#") +1);
			hideTables( cityName ); 
			curCity = cityName;
			*/
			return false;
		};
		return label;
		
		function cr(className) {
			var ret = document.createElement("div");
			ret.className = className;
			return ret;
		}
	}
	
	function getNodeXY(node) {
		var x = 0, y = 0;
		while(node && node.offsetParent) {
			x += node.offsetLeft;
			y += node.offsetTop;
			node = node.offsetParent;
		}
		return [x, y];
		//return [node.offsetLeft, node.offsetTop];
	}
}
DealersMap.initedNodes = [];
DealersMap.initedObjects = [];


function PhotoGallery(container, settings) {
	var nodes = {
		c: container,
		border: container.getElementsByTagName("div")[0],
		scroller: container.getElementsByTagName("div")[1],
		images: nodesetToArray(container.getElementsByTagName("img")),
		next: createButton("/media/s/els/photo-gallery/right.jpg", next),
		prev: createButton("/media/s/els/photo-gallery/left.jpg", prev),
		shadow: createShadow()
	};
	var currentImageNum = 0;
	var animNow = false;
	var stopTimer;
	
	init();
	registerInitedObject(PhotoGallery, this, container);
	refresh();
	
	this.next = next;
	this.prev = prev;
	
	function next() {
		if (animNow) stopTimer();
		var cur = getOffset(nodes.images[currentImageNum]);
		var next = getOffset(nodes.images[cur.end]);
		if (cur.end==nodes.images.length) {
			nodes.scroller.style.left = getLeft(cur.begin)*-1 +"px";
			nodes.border.style.width = cur.width +"px";
			return;
		}
		animNow = true;
		//var dWidth = cur.width;
		var l1 = parseInt(nodes.scroller.style.left);
		var l2 = getLeft(next.begin)*-1;
		var w1 = parseInt(nodes.border.style.width);
		var w2 = next.width;
		stopTimer = anim(l1, l2, w1, w2);
		//nodes.scroller.style.left = getLeft(next.begin)*-1 +"px";
		//nodes.border.style.width = next.width +"px";
		currentImageNum = next.begin;
		refresh();
	}
	
	function prev() {
		if (animNow) stopTimer();
		var cur = getOffset(nodes.images[currentImageNum]);
		if (cur.begin==0) {
			nodes.scroller.style.left = getLeft(cur.begin)*-1 +"px";
			nodes.border.style.width = cur.width +"px";
			return;
		}
		animNow = true;
		var next = getOffset(nodes.images[currentImageNum], true);
		//var dWidth = cur.width;
		var l1 = parseInt(nodes.scroller.style.left);
		var l2 = getLeft(next.begin)*-1;
		var w1 = parseInt(nodes.border.style.width);
		var w2 = next.width;
		stopTimer = anim(l1, l2, w1, w2);
		//nodes.scroller.style.left = getLeft(next.begin)*-1 +"px";
		//nodes.border.style.width = next.width +"px";
		currentImageNum = next.begin;
		refresh();
	}
	
	function refresh() {
		if (currentImageNum==0) {
			nodes.prev.src = "/media/s/els/photo-gallery/left-disabled.jpg";
			remHover.call(nodes.prev);
		} else {
			nodes.prev.src = "/media/s/els/photo-gallery/left.jpg";
		}
		if (getOffset(currentImageNum).end==nodes.images.length) {
			nodes.next.src = "/media/s/els/photo-gallery/right-disabled.jpg";
			remHover.call(nodes.next);
		} else {
			nodes.next.src = "/media/s/els/photo-gallery/right.jpg";
		}
	}
	
	function anim(curLeft, nextLeft, curWidth, nextWidth) {
		var scroller = nodes.scroller.style;
		var border = nodes.border.style;
		var length = 500; // ms
		var iterations = 100; // max
		var stepCost = length / iterations; // 10 ms/cadr
		var curStep = 0;
		var animStart = new Date();
		//var animEnd = animStart + 1000;
		var leftValues = getStepsValue(curLeft, nextLeft, iterations, "px");
		var widthValues = getStepsValue(curWidth, nextWidth, iterations, "px");
		var timer = window.setInterval(iterate, 1);
		return stopTimer;
		
		function iterate() {
			var ms = Math.floor(((new Date()).getTime() - animStart)/stepCost); // номер шага
			if (ms>curStep) {
				curStep = ms;
				if (curStep >= iterations) curStep = iterations;
				scroller.left = leftValues[curStep];
				border.width = widthValues[curStep];
				if (curStep == iterations) {
					stopTimer();
				}
			}
		}
		
		function stopTimer() {
			window.clearInterval(timer);
			timer = null;
			animNow = false;
		}
		
		function getStepsValue(from, to, count, postfix) {
			//var d = (Math.abs(Math.max(from, to)) - Math.abs(Math.min(from, to))) / count;
			var d = (to - from) / count;
			//if (to<from) d *= -1;
			var ret = [];
			for (var i=0; i<count; ++i) {
				ret.push( Math.round(from + d*i) +postfix);
			}
			ret[ret.length-1] = to +postfix;
			ret.push(to +postfix);
			return ret;
		}
	}
	
	function init() {
		nodes.border.className = (nodes.border.className || "") + " photos-border";
		nodes.scroller.className = (nodes.scroller.className || "") + " photos-scroller";
		var maxHeight = -1;
		var totalWidth = 0;
		for (var i=0, l=nodes.images.length, img, padding = settings.padding; i<l; ++i) {
			img = nodes.images[i];
			if (img.height > maxHeight) maxHeight = img.height;
			totalWidth += img.width + padding;
			img.style.borderRightWidth = padding +"px";
		}
		nodes.border.style.width = getOffset(nodes.images[0]).width +"px";
		nodes.border.style.height = nodes.scroller.style.height = maxHeight +"px";
		//nodes.scroller.style.width = totalWidth +"px";
		nodes.scroller.style.top = "0px";
		nodes.scroller.style.left = "0px";
		nodes.c.appendChild(nodes.next);
		nodes.c.appendChild(nodes.prev);
		nodes.c.appendChild(nodes.shadow);
	}
	
	function getLeft(imageNum) {
		var ret = 0;
		for (var arr=nodes.images, i=imageNum-1, p=settings.padding; i>=0; --i) {
			ret += arr[i].width +p;
		}
		return ret;
	}
	
	function getOffset(firstImage, toLeft) {
		var arr = nodes.images, padding = settings.padding;
		if (toLeft) {
			var l = 0;
			var d = -1;
			var i1 = arr.length -1;
		} else {
			var l = arr.length;
			var d = 1;
			var i1 = 0;
		}
		var i;
		if (typeof(firstImage)=="number") {
			i = firstImage;
		} else {
			for (i=i1; i!=l; i += d) {
				if (arr[i]==firstImage) break;
			}
		}
		if (!arr[i]) return;
		var firstI = i;
		var width = 0;
		var goodWidth = false;
		while(i!=l && width<settings.minWidth) {
			width += arr[i].width + padding;
			if (width>settings.maxWidth) {
				width -= arr[i].width + padding;
				i -= d;
				break;
			}
			i += d;
		}
		if (firstI==i) i -= d;
		return {
			begin: Math.min(firstI, i), // firstI
			end: Math.max(firstI, i), // i
			width: width
		};
	}
	
	function createButton(src, onclick) {
		var img = document.createElement("img");
		img.src = src;
		img.onclick = onclick;
		img.className = "button button-"+ src.substring(src.lastIndexOf("/")+1, src.lastIndexOf("."));
		img.onmouseover = addHover;
		img.onmouseout = remHover;
		return img;
	}
	
	function addHover() {
		// inline-event
		if (this.className.indexOf("button-hover")==-1 && this.src.indexOf("-disabled.")==-1) 
			this.className = this.className + " button-hover";
	}
	
	function remHover() {
		// inline-event
		this.className = this.className.replace(/(^|\s)button\-hover(\s|$)/g, "");
	}
	
	function createShadow() {
		var div = document.createElement("div");
		div.className = "photos-shadow";
		var l = document.createElement("div");
		l.className = "photos-shadow-left";
		l.appendChild( document.createElement("div") );
		div.appendChild( l );
		var r = document.createElement("div");
		r.className = "photos-shadow-right";
		r.appendChild( document.createElement("div") );
		div.appendChild( r );
		return div;
	}
	
	function nodesetToArray(nodeset) {
		var ret = [];
		for (var i=0, l=nodeset.length; i<l; ++i) {
			ret.push(nodeset[i]);
		}
		return ret;
	}
}
PhotoGallery.initedNodes = [];
PhotoGallery.initedObjects = [];


function checkNodes(root) {
	var root = root || document.documentElement;
	var nodeset = root.getElementsByTagName("*"), nodes = [];
	for (var i=0, l=nodeset.length; i<l; ++i) nodes.push(nodeset[i]);
	var l = nodes.length, setEl, createdEls, needTagName;
	for (var key in settingsElements) {
		setEl = settingsElements[key];
		needTagName = setEl.tag.toLowerCase();
		for (var i=l, node, ret; i--; ) {
			node = nodes[i];
			if (node.tagName.toLowerCase() != needTagName) continue;
			ret = setEl.checkNode(node);
			if (ret) {
				try {
					if (typeof(setEl.c)=="function") {
						createdEls = setEl.c.initedNodes;
						if (setEl.c.initedNodes.constructor == Array) {
							for (var i2=createdEls.length; i2--;) {
								if (createdEls[i2]==node) break;
							}
						}
					}
				} catch(er) { }
				if (!++i2 || !createdEls.length) setEl.createInstance(ret);
			}
		}
	}
	
}

function onDOMContentLoaded() {
	checkNodes();
	//for (var i=0, l=registerInitedObject.list.length; i<l; ++i) {
	for (var i=0, l=registerInitedObject.objs.length; i<l; ++i) {
		try {
			//registerInitedObject.list[i].onDOMContentLoaded();
			registerInitedObject.objs[i].onDOMContentLoaded();
		} catch(er) {}
	}
}

if (typeof(document.readyState)!="undefined") {
	var loadTimer = setInterval(function() {
		if (/loaded|complete/.test(document.readyState)) {
			clearInterval(loadTimer);
			delete loadTimer;
			onDOMContentLoaded();
		}
	}, 10);
} else if (window.addEventListener) {
    window.addEventListener('DOMContentLoaded', onDOMContentLoaded, false);
}
/* / defer */


try{ if (typeof(document.execCommand && !window.XMLHttpRequest)!="undefined") document.execCommand("BackgroundImageCache", false, true) } catch(er) { }