// ---- fabric ----

Autocomplete.prototype.fabricAutocompleteBox = {};

Autocomplete.prototype.fabricAutocompleteBox.dataList = function(node, listBox, list) {
	// this==listBox
	// alert("дада, dataList");
	var ret = new this.types.dataList(listBox, node);
	// ret.setList( ret, list, ret.getListBox(), ret.getContainer() );
	ret.setList( list );
	// ret.attachToNode( ret, ret.getContainer() );
	ret.attachToNode( );
	return ret;
};

Autocomplete.prototype.fabricAutocompleteBox.customSelect = function(node, listBox, list) {
	// this==listBox
	var ret = new this.types.customSelect(listBox, node);
	var opt = node.getElementsByTagName("option");
	var optList = [];
	for (var i=0, l=opt.length; i<l; i++) {
		optList.push({ title: opt[i].innerHTML, value: opt[i].value, selected: opt[i].selected });
	}
	ret.setList( optList );
	ret.attachToNode( );
	return ret;
};

Autocomplete.prototype.fabricAutocompleteBox.searchByKeyboard = function(node, listBox, list) {
	// this==listBox
	var ret = new this.types.searchByKeyboard(listBox, node);
	ret.setList( list );
	ret.attachToNode( );
	return ret;
};

Autocomplete.prototype.fabricAutocompleteBox.searchPages = function(node, listBox, url) {
	// this==listBox
	// alert("дада, yandexSearch");
	var ret = new this.types.yandexSearch(listBox, node, url);
	// ret.attachToNode( ret, ret.getContainer() );
	ret.attachToNode( );
	return ret;
};
// ---- / fabric ----


// ---- automatic ----

function autocompleteCheck(container, objAutocomplete) {
	var ret = [];
	for (var i=0, need, nodes; i<(container || document).getElementsByTagName("*").length; i++) {
		nodes = (container || document).getElementsByTagName("*");
		need = checkClass(nodes[i]);
		if (need) ret.push({
			node: nodes[i], 
			fabricName: need.fabricName, 
			fabricParams: need.fabricParams
		});
	}
	if (ret.length) {
		var objAutocomplete = objAutocomplete || new Autocomplete( new ListBox() );
		for (var i=0, l=ret.length; i<l; i++) {
			objAutocomplete.createAutocompleteBox(ret[i].fabricName, ret[i].node, ret[i].fabricParams);
		}
	}
	return objAutocomplete;
	function checkClass(node) {
		for (var name in autocompleteCheck.prototype.glossary) {
			if ( (new RegExp("(^|\\s)"+ name +"($|\\s)")).test( node.className || "" ) ) {
			// (new RegExp("(^|\\s)"+name+"($|\\s)")).test(node.className)
				var tags = autocompleteCheck.prototype.glossary[name].tags;
				if (!tags) {
					return {
						fabricName:   autocompleteCheck.prototype.glossary[name].fabricName,
						fabricParams: autocompleteCheck.prototype.glossary[name].fabricParams
					}
				}
				if (tags.constructor!=Array) tags = [tags];
				for (var i=0, l=tags.length; i<l; i++) {
					if ( tags[i].toLowerCase() == node.tagName.toLowerCase() ) {
						return {
							fabricName:   autocompleteCheck.prototype.glossary[name].fabricName,
							fabricParams: autocompleteCheck.prototype.glossary[name].fabricParams
						}
					}
				}
			}
		}
		return false;
	}
}

autocompleteCheck.prototype.glossary = {
	"custom-select": {
		fabricName: "customSelect",
		fabricParams: [ ]
	}
	/*
	"autocomplete-yandex-search": {
		fabricName: "searchByKeyboard",
		fabricName: "searchPages",
		fabricParams: [
			"02.xml"
		]
	},
	"autocomplete-search-by-keyboard": {
		fabricName: "searchByKeyboard",
		fabricParams: [[
			"qwe", "rty", "uio", "asd", "fgh", "jkl" 
			, "qqwwee", "qwwee", "qqqw", "qwee", "qwwwe"
			, "qweqwe", "qweqwe", "qweqweqwe", "qweqweqweqwe", "qweqweqwe2"
			, "qweqweqwe23", "qweqweqwe24", "qweqweqwe231", "qweqweqwe232", "qweqweqwe245"
			, "rrtt", "rrtty", "rttt", "rrrt", "rtyyy"
		]]
	},
	"autocomplete-data-list-01": {
		fabricName: "dataList",
		fabricParams: [[
			"qwe", "rty", "uio", "asd", "fgh", "jkl" 
			, "2qwe", "2rty", "2uio", "2asd", "2fgh", "2jkl", "3qwe", "3rty", "3uio", "3asd", "3fgh", "3jkl", "4qwe", "4rty", "4uio", "4asd", "4fgh", "4jkl", "5qwe", "5rty", "5uio", "5asd", "5fgh", "5jkl", "6qwe", "6rty", "6uio", "6asd", "6fgh", "6jkl"
		]]
	}
	*/
};

// ---- /automatic ----

// ---- defer ----

function autocomplete_DOMContentLoaded() {
	window.setTimeout(autocomplete_DOMContentLoaded_and700ms, 1);
}

function autocomplete_DOMContentLoaded_and700ms() {
	var obj;
	if (typeof(autocompleteCheck_disable)=="undefined") {
		obj = autocompleteCheck();
	} else if (!autocompleteCheck_disable) {
		obj = autocompleteCheck();
	}
	if (obj) {
		var el = document.documentElement || document.body;
		if (el.addEventListener) {
			el.addEventListener("click", hideAllBoxes, false);
		} else {
			el.attachEvent("onclick", hideAllBoxes);
		}
		for (var i=0, boxes=obj.getBoxes(), l=boxes.length; i<l; i++) {
			boxes[i].events.addSubscriber("show", "*", hideAnotherBoxes);
		}
	}
	function hideAllBoxes(evt) {
		for (var i=0, boxes=obj.getBoxes(), l=boxes.length; i<l; i++) {
			if (boxes[i].hide) boxes[i].hide();
		}
	}
	function hideAnotherBoxes(evt) {
		for (var i=0, boxes=obj.getBoxes(), l=boxes.length; i<l; i++) {
			if (boxes[i]!=evt.target && boxes[i].hide) boxes[i].hide();
		}
	}
}

if (navigator.userAgent.indexOf('Safari')>-1) {
	var safari2 = navigator.userAgent.indexOf('Version/3')==-1; // saf
	var _timer = setInterval(function() {
	if (/loaded|complete/.test(document.readyState)) {
		clearInterval(_timer);
		delete _timer;
		autocomplete_DOMContentLoaded();
	}
	}, 50);
} else {
	if (window.addEventListener) {
		window.addEventListener('DOMContentLoaded', autocomplete_DOMContentLoaded, false);
	} else {
		autocomplete_DOMContentLoaded();
	}
}

try { if (navigator.userAgent.indexOf("MSIE 6") > -1) document.execCommand("BackgroundImageCache", false, true); }
catch(er) {}

// ---- / defer ----