function joojaxInit() {
	var lList,i,fList,j,iList,c;
	
	if(exLnk) {
		var exArray = Json.evaluate(exLnk);
	} else {
		var exArray = new Array();
	}
	
	
    lList =  document.getElementsByTagName("a");
	for(i=0; i < lList.length; i++) {
		var ajaxLink = false;
		if((!lList[i].target || lList[i].target.toUpperCase() != '_BLANK') 
		    && (!lList[i].rel || lList[i].rel != 'noScript') && !in_array(lList[i].className, exArray)) {
			ajaxLink = true;
		}
		if(ajaxLink) {
			var actual = lList[i];
			actual.onclick = function() {
				var rqstParam = reparseHREF(this.href);
				doJoojaxRequest(rqstParam, this.href);
				return false;
			}
		}		
	}
	
	//parse forms to new onsubmit
	fList = document.getElementsByTagName("form");
	for(j=0; j < fList.length; j++) {
		var actForm = fList[j];
		if(!actForm.id) {
			actForm.id = 'form' + j;
			
		}
		
		//set joojax function
		actForm.onsubmit = function() {
			var oldAction = this.action;
			var newAction = reparseFormAction(oldAction);
			this.action = newAction;
			doJoojaxFormRequest(this.id, oldAction);
			return false;
		}
		
		//check for JOOMLA validate
		iList = actForm.getElementsByTagName('input');
		for(c=0; c < iList.length; c++) {
			var btFound = null;
			if((iList[c].name).toLowerCase() == 'send' || (iList[c].name).toLowerCase() == 'submit' 
				|| (iList[c].type).toLowerCase() == 'submit' ) {
				
				var btFound = iList[c];
				if((btFound.onclick && $type(btFound.onclick) == 'function')) {
					var onC = btFound.onclick;
					
					//actually not found a solution for readout a function
					//so i have to delete the whole function
					btFound.onclick = '';
					btFound.type = 'submit';
					
				}
				
			}
		}
	}
}

function reparseHREF(param) {
	var reParse = param;
	var srcHost = host + '/index.php';
	if(reParse.indexOf(srcHost) != -1)  {
		var start = reParse.indexOf(srcHost) + srcHost.length + 1;
		reParse = reParse.substr(start, (reParse.length - start));
	}
	return reParse;
}

function reparseFormAction(param) {
	var reParse = param;
	srcHost = host + '/index.php';
	if(reParse.indexOf(srcHost) != -1)  {
		var start = reParse.indexOf(srcHost) + srcHost.length + 1;
		reParse = reParse.substr(start, (reParse.length - start));
	}
	reParse = host + '/j_index.php?' + reParse;
	return reParse;
}

function doJoojaxRequest(param, oldHref) {
	var success  = function(r) { 
        /* try to parse the entry */
        try {
			joojaxParseResult( r );
			joojaxInit();
			joojaxOuterCall();
        } catch(e) {
			alert(e);
            /* an error was happened, so do simple request by simple method */
			joojaxAlternateRequest( oldHref );
        }
        
    }
    
    var failure  = function(){ 
		joojaxAlternateRequest( oldHref );
    }
	
	var JooJAX = new Ajax(host+'/j_index.php', {
					  method: 'get',
					  data: param,
					  onComplete:success,
					  onFailure:failure
					  }).request();
}

function doJoojaxFormRequest(param, oldAction) {
	var success  = function(r) { 
        /* try to parse the entry */
        try {
			joojaxParseResult( r );
			joojaxInit();
        } catch(e) {
            /* an error was happened, so do simple request by simple method */
			joojaxAlternateFormRequest( param, oldAction );
        }
        
    }
    
    var failure  = function(){ 
		joojaxAlternateFormRequest( param, oldAction );
    }
	
	$(param).send({onComplete:success, onFailure:failure});
}

function joojaxParseResult(result) {
	var p;
	var jObj = Json.evaluate('(' + result + ')');
	for(p=0;p<jObj.length;p++) {	
		try {
			var elem = $( jObj[p].target );
			var dependent = jObj[p].dependent;
			if(dependent === false || jObj[p].content != '') {
				joojaxDependentReset(jObj[p].target);
				elem.innerHTML = joojaxParseContent(jObj[p].content, jObj[p].target);
			} else {
			 	joojaxDependentUnset(jObj[p].target);
			}
		} catch(e) {
			alert(e);
			throw "Error in DrawPage (" + e + ")";
		}
	}
}

function joojaxParseContent(content, tgt) {
	var script, scripts, newScript;
		scripts = [];
		var regexp = /<script[^>]*>([\s\S]*?)<\/script>/gi;
		while ((script = regexp.exec(content))) scripts.push(script[1]);
		newScript = scripts.join('\n');
		
		if(newScript.length > 0) {
			eval(newScript);
		}
	return content;
}

function joojaxAlternateRequest(url) {
	document.location.href = url;
}

function joojaxAlternateFormRequest(id, oldAction ) {
	var form = $(id);
	form.action = oldAction;
	form.submit();
}

function joojaxDependentUnset(tgt) {
	$(tgt).setStyle('display', 'none');
}

function joojaxDependentReset(tgt) {
	$(tgt).setStyle('display', 'block');
}

function joojaxOuterCall() {
	//only for now! has to be replaced with a array of functionsto call
	pageRefresh();
}

function in_array(needle, haystack, strict) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: true
 
    var found = false, key, strict = !!strict;
 
    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = true;
            break;
        }
    }
 
    return found;
}

//init start!!!!!
window.addEvent ('domready', joojaxInit );