// basic functions for loading ajax data
xhr = new Object;
xhr.loadXMLDoc = function(url, postData) 
{
	if (typeof(xhr.req)!="undefined") xhr.abortRequest();
	
    if (window.XMLHttpRequest) {
        xhr.req = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        xhr.req = new ActiveXObject("Microsoft.XMLHTTP");
    }
	
	if (xhr.req) {
		
		var method = (postData) ? "POST" : "GET";
		xhr.req.onreadystatechange = xhr.processReqChange;
		xhr.req.open(method, url, true);
		if (postData) {
			xhr.req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
		}
		xhr.req.send(postData);
		
		eval(xhr.transferIndicatorFunction + "(true)");
	}
}

xhr.processReqChange = function() 
{
    // only if req shows "complete"
    if (xhr.req.readyState == 4) {
		eval(xhr.transferIndicatorFunction + "(false)");
		
		try {
			var connStatus = xhr.req.status;
		} catch(e) {
			var connStatus = 13030;  // Gecko throws exception on disconnection
		}

        // only if "OK"
        if (connStatus == 200) {
            // ...processing statements go here...
			if (xhr.req.responseXML) {
				xhr.response = xhr.req.responseXML.documentElement;
			}
			eval(xhr.loadAction);

        } else {
			if (typeof(xhr.loadErrorAction) == 'undefined') {
				//alert("Wystąpił błąd w transferze danych:\n" + xhr.req.statusText);
			} else {
				eval(xhr.loadErrorAction);
			}
        }
    }
}

xhr.abortRequest = function() {
	xhr.req.onreadystatechange = function() {};
	xhr.req.abort();
	eval(xhr.transferIndicatorFunction + "(false)");
}


xhr.get_xml_value = function(element_name, element_index) {
	if (!xhr.response.getElementsByTagName(element_name)[element_index]) {
		var value = false;
	
	} else if (xhr.response.getElementsByTagName(element_name)[element_index].childNodes.length) {

		var value = xhr.response.getElementsByTagName(element_name)[element_index].firstChild.data;
	} else {

		var value = '';
	}

	return value;
}

/* Search Tips */
search = new Object;
search.init = function() {
	// poczatkowe ustawienia
	search.cache = new Object;
	search.cache[0] = new Object;
	search.cache[1] = new Object;

	search.input = document.getElementById('search-box').name;
	search.input.setAttribute('autocomplete', 'off');
	search.resultBox = search.createResultBox();
	search.current = -1;
	search.noResultsQuery = null;
	
	search.displayedResults = false;
	search.input.onkeyup = search.keystroke;
	search.input.onkeydown = search.keystrokeArrow;
	
	document.documentElement.onkeydown = search.globalEsc;
	document.documentElement.onmousedown = search.globalHide;

	xhr.transferIndicatorFunction = "void";
}

/* search.transferIndicator = function(state) {
	var el = document.getElementById('transfer');
	el.style.visibility = state ? 'visible' : 'hidden';
} */

search.createResultBox = function() {
	var div = document.createElement('div');
	div.id = 'search-tips';
	div.style.display = 'none';
	var ul = document.createElement('ul');
	div.appendChild(ul);
	
	var body = document.getElementsByTagName('body')[0];
	body.insertBefore(div, body.firstChild);
	search.position();
	
	return div;
}

search.position = function() {
	var pos = findElementPos(search.input);
	var height = search.input.offsetHeight;

	var tElem = document.getElementById('search-tips');
	tElem.style.left = pos[0] + 'px';
	tElem.style.top = (pos[1]+height) + 'px';
	
	window.onresize = search.position;
}

search.globalEsc = function(e) {
	if (!e) var e = window.event;
	
	if (e.keyCode == 27) { // esc
		search.lastQuery = search.input.value;
		search.hide();
		setTimeout('search.input.value = search.lastQuery', 50);
	}
}

// nacisniety klawisz specjalny: strzalka w dol lub gore
search.keystrokeArrow = function(e) {
	if (!e) var e = window.event;
	
	var isArrowKey = ((e.keyCode == 40 || e.keyCode == 38) && !e.shiftKey);
	
	if (isArrowKey) {
		// 40=down, 38=up
		if (search.displayedResults) {
			var step = (e.keyCode==40) ? 1 : -1;
			search.moveSelection(step);
			
		} else {	
			search.search();
		}
		
		return false;

	} else if (e.keyCode == 13) { // enter
		if (search.current >= 0) {
			search.searchForHighlighted(false);
			return false;
		}
	}
}

// keystroke
search.keystroke = function(e) {
	if (!e) var e = window.event;
	
	// przegladarki inne niz Safari moga ta funkcje wykonywac po nacisnieciu strzalek
	var isArrowKey = ((e.keyCode == 40 || e.keyCode == 38 || e.keyCode == 39 || e.keyCode == 37) && !e.shiftKey);

	if (e.keyCode!=9 && e.keyCode != 27 && e.keyCode != 13 && !isArrowKey) {	// if not tab, esc, enter
		search.search();
		return true;
	}
}

search.searchForHighlighted = function(byMouse) {
	var query = search.getHighlightedQuery();
	
	if (query === null) {
		// display more results
		search.scrollOnDisplay = !byMouse;
		
		search.input.form.onsubmit = function() {
			return false;
		}
		
		var ul = search.resultBox.getElementsByTagName('ul')[0];
		search.boxHeight = ul.offsetHeight - 4;
		
		var all = 1;
		
		query = search.trim(search.input.value);
		
		if (typeof search.cache[all] != 'undefined' && typeof search.cache[all][query] != 'undefined') {
			search.prevOnmouseDown = document.documentElement.onmousedown;
			document.documentElement.onmousedown = null;
			
			search.displayResults(search.cache[all][query], query, all);
			
			setTimeout('document.documentElement.onmousedown = search.prevOnmouseDown', 500);
			
		} else {
			search.sendRequest(query, all);
		}

		setTimeout('search.input.form.onsubmit = null', 500);
		return;
	}	
	
	if (query) {
		search.input.value = query;
	}
	
	search.input.onkeyup = null;
	search.input.onkeydown = null;
	search.hide();
	search.input.form.submit();
}

// search
search.search = function() {
	var query = search.trim(search.input.value);
	
	if (query.length > 1) {
		
		var all = 0;
		
		if (typeof search.cache[all] != 'undefined' && typeof search.cache[all][query] != 'undefined') {
			search.displayResults(search.cache[all][query], query, all);

		} else {
			if (search.noResultsQuery === null || query.indexOf(search.noResultsQuery) != 0) {
				search.sendRequest(query, all);
			} 
		}

	} else {
		search.hide();
	}
}

search.hide = function() {
	search.resultBox.style.display = 'none';
	search.displayedResults = false;
}

search.show = function() {
	search.resultBox.style.display = 'block';
	search.displayedResults = true;
}

search.globalHide = function(e) {
	if (!e) var e = window.event;
	var tg = (window.event) ? e.srcElement : e.target;
	
	var hide = true;
	while (tg) {
		if (tg == search.resultBox || tg == search.input) {
			hide = false;
			break;
		}
		tg = tg.parentNode;
	}
	
	if (hide) {
		search.hide();
	}
}

search.displayResults = function(results, query, all) {
	
	var ul = search.resultBox.getElementsByTagName('ul')[0];

	search.resultBox.removeChild(ul);
		
	ul = document.createElement('ul');
	search.resultBox.appendChild(ul);
	
	if (all) {
		ul.style.height = search.boxHeight + 'px';
	}
		
	if (results.length == 0) {
		search.hide();
		return;
	}
	
	var words = (search.prepareForRegex(query)).split(/[ \/-]+/g);
	var re = new RegExp('([ ()[\\]/-]' + words.join('|[ ()[\\]/-]') + ')', 'gi');	
	var more = false;	
	
	for (var i=0; i<results.length; i++) {

		if (!all && i == search.maxResults) {
			more = true;
			break;
		}

		var li = document.createElement('li');
		li.className = ((i/2)==Math.floor(i/2)) ? 'odd' : '';
		li.onmouseover = search.mouseHighlight;
		
		var html = (' ' + results[i]).replace(re, '{%b%}$1{%/b%}').replace(/&/g, '&amp;').replace(/</g, '&lt').replace(/>/g, '&gt;').replace(/\{%(\W)?b%\}/g, '<$1b>').replace(/<b> /g, ' <b>');
		
		li.innerHTML = html;
		li.plainText = results[i];
		ul.appendChild(li);
	}
	
	if (more) {
		li = document.createElement('li');
		li.id = 'search-tips-more';
		li.className = 'more';
		li.className+= ((i/2)==Math.floor(i/2)) ? ' odd' : '';
		li.onmouseover = search.mouseHighlight;
		var txt = (search.input.form.lang.value == 'pl') ? 'więcej...' : 'more...';

		li.appendChild(document.createTextNode(txt));
		ul.appendChild(li);

		search.currentQuery = query;
		search.currentResults = results;
	}
	
	search.resultBox.appendChild(ul);
	search.show();
	search.current = -1;
	
	if (all) {
		search.current = search.maxResults;
		search.highlight();
		if (search.scrollOnDisplay) {
			search.scrollTo(search.current);
			search.scrollOnDisplay = false;
		}
		
	} else {
		// scroll page if necessary
		search.scrollPageToVisible();
	}
}

search.scrollPageToVisible = function() {
	var pageScroll = (typeof window.pageYOffset == 'number') ? window.pageYOffset : document.documentElement.scrollTop;
	var inputY = findElementPos(search.input)[1];
	var inputHeight = search.input.offsetHeight;
	var boxHeight = search.resultBox.getElementsByTagName('ul')[0].offsetHeight;
	var windowHeight = document.documentElement.clientHeight;
	
	var shift = inputY + inputHeight + boxHeight - windowHeight - pageScroll;
	
	if (shift > 0) {
		var newScroll = document.documentElement.scrollTop + shift;
		
		if (newScroll > inputY) {
			newScroll = inputY;
		}
		window.scrollTo(0, newScroll);
	}
}

search.prepareForRegex = function(str) {
	return str.replace(/[[\]()]/g, ' ').replace(/[[\]{}()*+?.,\\^$|#]/g, "\\$&").replace(/[aą]/gi, '[aą]').replace(/[cć]/gi, '[cć]').replace(/[eę]/gi, '[eę]').replace(/[lł]/gi, '[lł]').replace(/[nń]/gi, '[nń]').replace(/[oó]/gi, '[oó]').replace(/[sś]/gi, '[sś]').replace(/[zźż]/gi, '[zźż]');
}

/* fetch results from server */
search.sendRequest = function(query, all) {
	/* if (document.getElementById('test1')) {
		document.getElementById('test1').firstChild.data = parseInt(document.getElementById('test1').firstChild.data) + 1;
	} */
	all = all ? 1 : 0;
	xhr.loadAction = "search.receiveRequest(xhr.response, " + all + ")";
	var lang = search.input.form.lang.value;
	xhr.loadXMLDoc("/product-search.xml.php?query=" + encodeURIComponent(query) + "&lang=" + lang + "&max=" + search.maxResults + "&all=" + all + "&r=" + new Date().getTime());
}

search.receiveRequest = function(response, all) {
	var names = response.getElementsByTagName('p');
	
	var results = new Array;
	
	for (var i=0; i<names.length; i++) {
		results.push(names[i].firstChild.data);
	}
	
	var q = response.getElementsByTagName('q')[0];
	var query = q.firstChild.data;
	
	all = all ? 1 : 0;
	search.cache[all][search.trim(query)] = results;
	search.noResultsQuery = results.length ? null : query;
	
	if (search.input.value == query) {
		search.displayResults(results, query, all);
	}
}


search.moveSelection = function(step) {
	var count = search.resultBox.getElementsByTagName('li').length;
	if (count == 0) return;
	
	search.current += step;
	
	if (search.current < -1) {
		search.current = count-1;
	} else if (search.current >= count) {
		search.current = -1;
	}
	
	if (search.current >= 0) {
		search.show();
		if (search.prevHighlighted) {
			search.prevHighlighted.className = search.prevHighlighted.className.replace(/ highlight/g, '');
			search.prevHighlighted = null;
		}
		search.scrollTo(search.current);
		search.highlight();
	} else {
		search.hide();
	}
}

search.scrollTo = function(index) {
	var lis = search.resultBox.getElementsByTagName('li');
	var y = 0;
	
	for (var i=0; i<=index; i++) {
		y += lis[i].offsetHeight;
	}
	
	var ul = search.resultBox.getElementsByTagName('ul')[0];
	
	y -= Math.round(ul.offsetHeight / 2) + 20;
	if (y < 0) y = 0;
	ul.scrollTop = y;	
}

search.highlight = function() {
	var lis = search.resultBox.getElementsByTagName('li');
	
	var li = lis[search.current];
	
	if (search.prevHighlighted && search.prevHighlighted != li) {
		search.prevHighlighted.className = search.prevHighlighted.className.replace(/ highlight/g, '');
	}
	
	if (li.className.indexOf(' highlight') < 0) {
		li.className += ' highlight';
	}
	
	search.prevHighlighted = li;
}

search.mouseHighlight = function() {
	var lis = search.resultBox.getElementsByTagName('li');
	
	for (var i=0; i<lis.length; i++) {
		var li = lis[i];
		
		if (li == this) {
			if (li.className.indexOf(' highlight') < 0) {
				li.className += ' highlight';
			}
			search.current = i;
			li.onmousedown = search.mouseSelect;
			search.prevHighlighted = li;
		} else {
			if (li.className.indexOf(' highlight') >= 0) {
				li.className = li.className.replace(/ highlight/, '');
			}
		}
	}
}

search.mouseSelect = function () {
	search.searchForHighlighted(true);
}

search.getHighlightedQuery = function() {
	if (search.current < 0) return null;
	
	var lis = search.resultBox.getElementsByTagName('li');
	if (search.current >= lis.length) return null;

	return (lis[search.current].id == 'search-tips-more') ? null : lis[search.current].plainText;	
}

search.trim = function(str) {
	return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}


