function JSLRequest () {
    var reqobj;
    var callback;
    var formcallback;
    
    this.start = function (hostfunc, callback_func, params) {
    		
				try{
					reqobj = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(Error){
					try{
						reqobj = new ActiveXObject("MSXML2.XMLHTTP");
					}
					catch(Error){
					 try{
						reqobj = new XMLHttpRequest();
					 }
					 catch(Error){
						//hier auf die alternative verweisen
						alert("Ticketer needs a newer browser");
						//window.location="index.php?ajax=no";
					 }
					}
				}
    		
    		
        callback = callback_func;
        reqobj.onreadystatechange = this.handler;
        
        if(params == ''){//nothing to send along.
        	reqobj.open ("GET", hostfunc, true);
        	reqobj.send (null);
        }
        else{//got some params to send along.
        	reqobj.open("POST", hostfunc, true);
        	reqobj.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
        	reqobj.send (getParamStr(params));
        }
    }

    this.handler = function () {
        if (reqobj.readyState == 4) {
            if (reqobj.status == 200) {
                callback(reqobj);
            }
            else {
                callback(reqobj);
            }
        }
    }
    
    
    
    
    this.formstart = function(hostfunc, callback_func, form){
    	try{
					reqobj = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(Error){
					try{
						reqobj = new ActiveXObject("MSXML2.XMLHTTP");
					}
					catch(Error){
					 try{
						reqobj = new XMLHttpRequest();
					 }
					 catch(Error){
						//hier auf die alternative verweisen
						alert("Ticketer needs a newer browser");
						//window.location="index.php?ajax=no";
					 }
					}
				}
    	
    	var str = getFormValues(form);
    	
    	callback = callback_func;
    	
      reqobj.onreadystatechange = this.handler;
      
      reqobj.open ("POST", hostfunc, true);
      //reqobj.setRequestHeader("Content-Type","multipart/form-data; charset=utf-8");
      reqobj.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
      reqobj.send (str);
    	
    	

		}


		getFormValues = function(fobj){
			 var str = "";
			 var valueArr = null;
			 var val = "";
			 var cmd = "";
			 for(var i = 0;i < fobj.elements.length;i++){
					 //alert(fobj.elements[i].type);
					 switch(fobj.elements[i].type){
					 		case "password":
					 					str += fobj.elements[i].name + "=" + encodeURIComponent(fobj.elements[i].value) + "&";
					 					break;
					 		
					 		case "hidden":	
					 					str += fobj.elements[i].name + "=" + encodeURIComponent(fobj.elements[i].value) + "&";
					 					break;
					 					
							case "text":
										str += fobj.elements[i].name + "=" + encodeURIComponent(fobj.elements[i].value) + "&";
										 break;
										 
							case "select-one":
										str += fobj.elements[i].name + "=" + fobj.elements[i].options[fobj.elements[i].selectedIndex].value + "&";
										break;
										
							case "textarea":
							 			str += fobj.elements[i].name + "=" + encodeURIComponent(fobj.elements[i].value) + "&";
										break;
							
							case "button":
							 			str += fobj.elements[i].name + "=" + encodeURIComponent(fobj.elements[i].value) + "&";
										break;
					 }
			 }
			 str = str.substr(0,(str.length - 1));
			//alert(encodeURI(str));
			return str;
			// return encodeURI(str);
		}
		
		
		getParamStr = function(paramArr){
    	if(paramArr == ''){
    		return '';
    	}
    	else{
    		var returnstr = '';
    		for(var i = 0; i < paramArr.length; i++){
    			if (i % 2 > 0){//ungerade, param wert
    				returnstr += encodeURIComponent(paramArr[i]);
    			}
    			else{//i gerade, param name
    				if(i == 0){
    					returnstr += paramArr[i] + '=';
    				}
    				else{
    			 		returnstr += '&' + paramArr[i] + '=';
    				}
    			}
    		}
    		return returnstr;
    	}		
    	return '';
    }		
}






/*
//array function to check for a certain value in an array. call: array.contains(value)
Array.prototype.contains = function(value) {	for (var i = 0; i < this.length; i++) {		if (this[i] == value) return true;	}	return false;}
*/

//functions:




//prevents a certain event from calling its default browser event
function prevent(e){
	if(typeof e.preventDefault != 'undefined'){
		e.preventDefault();
	}
	else{//iex
		event.returnValue = false;
	}
}	
				
				
				
// the following is written by Dean Edwards, 2005
// with input from Tino Zijdel, Matthias Miller, Diego Perini
// thank you guys!!!
// http://dean.edwards.name/weblog/2005/10/add-event/

function addEvent(element, type, handler) {
	if (element.addEventListener) {
		element.addEventListener(type, handler, false);
	} else {
		// assign each event handler a unique ID
		if (!handler.$$guid) handler.$$guid = addEvent.guid++;
		// create a hash table of event types for the element
		if (!element.events) element.events = {};
		// create a hash table of event handlers for each element/event pair
		var handlers = element.events[type];
		if (!handlers) {
			handlers = element.events[type] = {};
			// store the existing event handler (if there is one)
			if (element["on" + type]) {
				handlers[0] = element["on" + type];
			}
		}
		// store the event handler in the hash table
		handlers[handler.$$guid] = handler;
		// assign a global event handler to do all the work
		element["on" + type] = handleEvent;
	}
};
// a counter used to create unique IDs
addEvent.guid = 1;

function removeEvent(element, type, handler) {
	if (element.removeEventListener) {
		element.removeEventListener(type, handler, false);
	} else {
		// delete the event handler from the hash table
		if (element.events && element.events[type]) {
			delete element.events[type][handler.$$guid];
		}
	}
};

function handleEvent(event) {
	var returnValue = true;
	// grab the event object (IE uses a global event object)
	event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
	// get a reference to the hash table of event handlers
	var handlers = this.events[event.type];
	// execute each event handler
	for (var i in handlers) {
		this.$$handleEvent = handlers[i];
		if (this.$$handleEvent(event) === false) {
			returnValue = false;
		}
	}
	return returnValue;
};

function fixEvent(event) {
	// add W3C standard event methods
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
};
fixEvent.preventDefault = function() {
	this.returnValue = false;
};
fixEvent.stopPropagation = function() {
	this.cancelBubble = true;
};
