var initializeMe = (function(){
    var global = this;
    var base = null;
    var safe = false;
    var listenerType = (global.addEventListener && 2)||
                            (global.attachEvent && 3)|| 0;
    function getStackFunc(funcRef, arg1,arg2,arg3,arg4){
        var next = null;
        function l(ev){
            funcRef((ev?ev:global.event), arg1,arg2,arg3,arg4);
            if(next)next = next(ev);
            return (arg1 = arg2 = arg3 = arg4 = funcRef = null);
        };
        l.addItem = function(d){
            if(next){
                next.addItem(d);
            }else{
                next = d;
            }
        };
        return l;
    };
    return (function(funcRef, arg1,arg2,arg3,arg4){
        if(base){
            base.addItem(
                       getStackFunc(funcRef, arg1,arg2,arg3,arg4)
                        );
        }else{
            base = getStackFunc(funcRef, arg1,arg2,arg3,arg4);
        }
        if(!safe){
            switch(listenerType){
                case 2:
                    global.addEventListener("load", base, false);
                    safe = true;
                    break;
                case 3:
                    global.attachEvent("onload", base);
                    safe = true;
                    break;
                default:
                    if(global.onload != base){
                        if(global.onload){
                            base.addItem(getStackFunc(global.onload));
                        }
                        global.onload = base;
                    }
                    break;
            }
        }
    });
})();

/**
 * Adds target="_blank" to selected anchors
 */
function links_manager() {
	if(!document.getElementsByTagName) {
		// no DOM support
		return;
	}
	
	var d = document;
	var footer = d.getElementById('footer');
	var a = footer.getElementsByTagName('a');
	
	for(var i = 0; i < a.length; i++) {
		if(a[i].rel == "external") {
			a[i].target = "_blank";
		}
	}
}

/**
 * Creates "i'm busy" indicator
 */
function build_loader() {
	var progressBar = document.createElement('img');
	progressBar.setAttribute('id', 'progressBar');
	progressBar.setAttribute('src', 'res/images/indicator.gif');
	progressBar.setAttribute('width', 16);
	progressBar.setAttribute('height', 16);
	progressBar.setAttribute('alt', 'Wskaźnik aktywności');
	
	return progressBar;
}

/**
 * Removes indicator from page
 */
function kill_loader() {
	var progressBar = document.getElementById('progressBar');
	
	if(progressBar) {
		progressBar.parentNode.removeChild(progressBar);
	}
}

/**
 * Filters second dropdown using AJAX
 */
function filter_search() {
	if(!document.getElementById) {
		// no DOM support
		return;
	}
	
	var d = document;
	var method = arguments[1];
	var step2 = d.getElementById('step2');
	var uno = d.getElementById('uno');
	var duo = d.getElementById('duo');
	var search_btn = d.getElementById('search');
	
	// show second select box
	duo.disabled = '';
	
	// this is done when AJAX results are ready
	var fnWhenDone = function(oXML) { 
		data = eval("(" + oXML.responseText + ")");
		
		if((data != '') && (data.status != 0)) {
			for(i = 0; i < data.result.length; i++) {
				var option = d.createElement('option');
				option.setAttribute('value', data.result[i]);
				option.appendChild(d.createTextNode(data.result[i]));
				duo.appendChild(option);
			}
		}
		
		// hide indicator
		duo.disabled = '';
		search_btn.disabled = '';
		kill_loader();
		
		// prevent scrolling with arrowkeys in uno
		duo.focus();
	}
	
	uno.onchange = function() {	
		// leave only one option in select element
		found_option = false;
		for(i = 0; i < duo.childNodes.length; i++) {
			if(!found_option) {
				if((duo.childNodes[i].nodeName).toLowerCase() == 'option') {
					// first option was found
					found_option = true;
				}
			}
			else {
				if(duo.childNodes[i].nodeType != 3) {
					// beware: array length changes here
					duo.removeChild(duo.childNodes[i]);
					i--;
				}
			}
		}
		
		if(uno.value > 0) {
			// show indicator
			step2.appendChild(build_loader());
			duo.disabled = 'disabled';
			search_btn.setAttribute('disabled', 'disabled');
			
			var myConn = new XHConn();
			
			if (!myConn) {
				// No XMLHTTP support
				return;
			}
			else {
				myConn.connect("src/filterer.php", method, "s=" + uno.value, fnWhenDone);
			}
		}
	}
	
	// disable MSIE mouse wheel event
	uno.onmousewheel = function() { return false; };
}

/**
 * Does actions for user coming back from details page:
 *  - hides search form
 *  - adds/removes 'Search again' button
 */
function search_back() {
	if(!document.getElementById) {
		// no DOM support
		return;
	}
	
	var d = document;
	
	// 1. hide search form
	var collapsed = d.getElementById('search_again');
	collapsed.style.display = 'none';
	
	var par = d.createElement('div');
	par.setAttribute('id', 'again');
	
	var image_btn = d.createElement('input');
	image_btn.setAttribute('type', 'image');
	image_btn.setAttribute('src', 'res/images/b_again.gif');
	image_btn.setAttribute('name', 'again_btn');
	image_btn.onclick = function() {
		// unhide search form
		collapsed.style.display = '';
		
		// remove button
		par.parentNode.removeChild(par);
		return false;
	}
	
	// show button
	par.appendChild(image_btn);
	collapsed.parentNode.appendChild(par);
}

/**
 * Redirects user to details page and passes js values
 */
function handle_details() {
	if(!document.getElementById) {
		// no DOM support
		return;
	}
	
	var d = document;
	var search_results = d.getElementById('search_results');
	var details_links = search_results.getElementsByTagName('a');
	var rem_sort = d.getElementById('sorting');
	var rem_page = d.getElementById('paging');
	
	for(i = 0; i < details_links.length; i++) {
		if(details_links[i].rel == 'show_details') {
			details_links[i].onclick = function() {
				window.location = this.href + "&s=" + rem_sort.value + "&p=" + rem_page.value;
				return false;
			}
		}
	}
}