var QQ = {};

function addEvent(obj, eventType, fn){
	if (obj.addEventListener)
		obj.addEventListener(eventType, fn, false);
	else if (obj.attachEvent){
		obj["e"+eventType+fn] = fn;
		obj[eventType+fn] = function() {obj["e"+eventType+fn](window.event);}
		obj.attachEvent("on"+eventType, obj[eventType+fn]);
	}else{ 
   obj["on"+eventType] = fn;
   return true; 
 } 
}

function ajaxRequest(path,method,data,responseFunction,asynchronous,progressCallback){
	if (asynchronous == undefined)	asynchronous = true;
	
	// keep req global or pass it to response function
	req = getRequestObject();	
	
	if (progressCallback !== undefined)	req.onprogress = progressCallback;
	
	if (method == "get") req.open("get", path+data, asynchronous);
	else req.open("post", path, asynchronous);	
	
	//if (responseFunction != undefined) req.onreadystatechange = responseFunction;
	req.onreadystatechange = function(){
		if (req.readyState == 4 && responseFunction !== undefined) responseFunction();
	}
	
	if (method == "get") req.send(null);
	else{
		req.setRequestHeader("Pragma", "no-cache");
		req.setRequestHeader("Cache-Control", "must-revalidate");
		req.setRequestHeader("If-Modified-Since", document.lastModified);			
		req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
		req.setRequestHeader("Content-length", data.length);
		req.send(data);	
	}
}

// pass a function that can be used at all nodes directly at node with id elementName, fn can use "node" as parameter
function doWithAllNodesIn(elementName,fn){
	
	var sourceNode = getFirstChild(obj(elementName));		
	while (sourceNode != null){
		var node = sourceNode;
		sourceNode = sourceNode.nextSibling;
		/*while (sourceNode.nodeType != 1){
			sourceNode = sourceNode.nextSibling;
			if (sourceNode == null) break;
		}*/
		eval(fn);
	}
}

// pass a function that can be used at all nodes with elementName as name, fn can use "node" as parameter
function doWithAllNodes(elementName,fn,tag){

  var nodes = objs(elementName,tag);
  var nodesLength = nodes.length;
	for(var i = 0;i < nodesLength;i++){
		var node = nodes[i];
		eval(fn);
	}

}

function evalJSON(jsonString){
	return eval("("+jsonString+")");
}

function focusOn(id){
	obj(id).focus();
}

// check if the first node is an element node
function getFirstChild(element){
	var x;
	try {x = element.firstChild;}catch(e){}
	if (x != null){
		while (x.nodeType != 1){
			x = x.nextSibling;
			if (x == null) break;
		}
		return x;
	}else{
		return null;
	}
}

/**
 * get the XMLHTTPRequest object
 */
function getRequestObject(){
	var req = null;
	try {
		req = new XMLHttpRequest();
	}catch (ms){
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (nonms) {
			try {
				req = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (failed) {
				req = null;
			}
		}  
	}
	return req;	
}


/**
 * get the value and text of a <select> with specified selectID
 * @param {Object} selectID
 */
function getSelectedOption(selectID){
	var optionsLength = obj(selectID).options.length;
	var value;
	var text;
	for (var i = 0; i < optionsLength; i++){
		if (obj(selectID).options[i].selected){
			value = obj(selectID).options[i].value;
		  text = obj(selectID).options[i].text;
		}
	}
	return {value:value,text:text}
}

function obj(id){
	return document.getElementById(id);
}

function objs(elementName,tag){
	if (tag == undefined) tag = "name";
  var objs = new Array();
	var providedTags = new Array("span","div","a","p","img","input","form");
	for (var tagIndex in providedTags){
		var tags = document.getElementsByTagName(providedTags[tagIndex]);
		var tagsLength = tags.length;
		for (var i=0; i < tagsLength; i++){
      try {
			  if (tag != "class" && tags[i].getAttribute(tag) == elementName) objs.push(tags[i]);
				else if (tags[i].className == elementName) objs.push(tags[i]);
			}catch(e){}			
		}
	}
	return objs;
}

/*
 * popUp
 */
function popUp(page,title,parameters,setFocus){	
	var win = window.open(link, title, parameters);
	
	if (setFocus === undefined)
		win.focus();
}

/**
 * remove an event
 * @param {Object} obj
 * @param {Object} eventType
 * @param {Object} fn
 */
function removeEvent(obj, eventType, fn){
	if (obj.removeEventListener)
		obj.removeEventListener(eventType, fn, false);
	else if (obj.detachEvent)
	{
		obj.detachEvent( "on"+eventType, obj[eventType+fn] );
		obj[eventType+fn] = null;
		obj["e"+eventType+fn] = null;
	}
}

/**
 * select an option value from a select
 */
function selectOption(opt,obj){
	var ol = obj.options.length;
	for (var i = 0; i < ol; ++i){
		if (obj.options[i].value == opt){obj.options[i].selected = true; break;}
	}
}


/*
 * toggle an element
 * elementID can be the id or the element itself
 */
function toggle(elementID){
	
	if (obj(elementID) != null){
		if (id = obj(elementID)){
			show = (id.style.display == 'none');
			id.style.display = (show ? '' : 'none');
		}
	}else{
		if (id = elementID){
			show = (id.style.display == 'none');
			id.style.display = (show ? '' : 'none');
		}
	}	
}

/*
 * toggle an element, force on or off
 * elementID can be the id or the element itself
 */
function toggleOn(elementID,on){

	if (obj(elementID) != null){
		if (id = obj(elementID)){
			if (on){
				try{id.style.display = '';}catch(e){}
			}else{
				try{id.style.display = 'none';}catch(e){}
			}
		}
	}else{
		if (id = elementID){
			if (on){
				try{id.style.display = '';}catch(e){}
			}else{
				try{id.style.display = 'none';}catch(e){}
			}
		}
	}
}

/**
 * tooltip
 * @param {Object} text
 * @param {Object} className
 * @param {Object} event
 * @param {Object} show
 */
function tooltip(show,text,event,className,offsetX,offsetY){
	
	if (show){
		var tooltip = document.createElement("div");
		tooltip.id = "QQ_Tooltip";
		tooltip.innerHTML = text;
		
		if (className != undefined) tooltip.className = className;
		if (offsetX === undefined) offsetX = 20;		
		if (offsetY === undefined) offsetY = -5;
				
				
		tooltip.style.position = "absolute";
		tooltip.style.left = (event.clientX + offsetX) + getScrollPosition('x') + "px";
		tooltip.style.top = (event.clientY + offsetY) + getScrollPosition('y') + "px";

		document.body.appendChild(tooltip);
	}else{
		try{document.body.removeChild(obj("QQ_Tooltip"));}catch(e){}
	}
}