/**
 * Replique client-library.
 * Regelt AJAX- en gerelateerde functionaliteit.
 * 
 */
 
var request;
var response;
var callback;
if (typeof(basepath) == "undefined") {
        var     basepath = '/';
}
var baseurl = basepath+"rde/server/";
var clientTarget;
function createRequest() {
        try {
        request = new XMLHttpRequest();
  	} catch (trymicrosoft) {
    	try {
      		request = new ActiveXObject("Msxml2.XMLHTTP");
    	} catch (othermicrosoft) {
      		try {
        		request = new ActiveXObject("Microsoft.XMLHTTP");
      		} catch (failed) {
        		request = false;
      		}
    	}
	}
}

function handleResponse(){
     if (request.readyState == 4) {
         if(typeof(request.status)=='undefined'){
            alert('geen status');
         }else{
           if (request.status == 200) {
             response = request.responseText;
             eval(callback+'()');
           } else
             if (request.status==400 && 'function' == typeof window[callback+'_error']) {
                response = request.responseText;
                alert(eval(callback+'_error()'));   
             }else{
                alert("Er is een fout opgetreden met code " + request.status);
             }
         }
     }
}
function setCallback(funcName){
	callback = funcName;
}
function callServer(func,param1,param2,param3){
	createRequest();
	var url= baseurl + func + "/" + escape(param1) + "/" + escape(param2) + "/" + escape(param3);
    request.open("GET", url, true);
    request.onreadystatechange = function(){ handleResponse()};
    request.send(null);
}

function postServer(func,params){

	createRequest();
	var url= baseurl + func;
    request.open("POST", url, true);
    request.onreadystatechange = handleResponse;
    var paramstring = '';
    
    for(i=0;i<params.length;i++){
		paramstring+= '&param['+i+']='+urlEncode(params[i]);	
    }
    var p = 'sid='+sid+paramstring;
    request.setRequestHeader('Content-Type', 'text/xml'); // required for Safari
    request.setRequestHeader('Content-Length',p.length);
    request.send(p);
}

function previewMessage(text) {
	text = document.getElementById('message').value;
	setCallback('updateText');
	var params = new Array();
	params[0] = text;
	if(document.getElementById('usehtml') == null) {
	   params[1] = 'false';
    } else {
	   params[1] = document.getElementById('usehtml').checked ? 'true' : 'false';
	}
	postServer('parsesml',params);
	document.getElementById('message').focus();
}

function updateText(){
    document.getElementById('msgPreview').innerHTML = response;
}

function updateText_error(){
	return response;
}


function getQuoteMessage(topicid,postid){
	setCallback('placeQuote');
	var params = new Array();
	params[0] = topicid.toString();
	params[1] = postid.toString();
	params[2] = path;
	
	postServer('quote',params);
	document.getElementById('message').focus();
}

function placeQuote(){
        clientTarget = document.getElementById('message');
        putStr('');
        putStr(stripslashes(response));
}

function urlEncode(plaintext){
	var SAFECHARS = "0123456789" +					
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'()";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";

	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
		    encoded += "+";				
		} else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		} else {
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
			    // cannot be converted, so use a space
			    encoded += "+";
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} 
	return encoded;
}

function urlDecode(encoded){
   // Replace + with ' '
   // Replace %xx with equivalent character
   var HEXCHARS = "0123456789ABCDEFabcdef"; 

   var plaintext = "";
   var i = 0;
   while (i < encoded.length) {
       var ch = encoded.charAt(i);
	   if (ch == "+") {
	       plaintext += " ";
		   i++;
	   } else if (ch == "%") {
			if (i < (encoded.length-2) 
					&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1 
					&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
				plaintext += unescape( encoded.substr(i,3) );
				i += 3;
			} else {
				//alert( 'Bad escape combination near ...' + encoded.substr(i) );
				//plaintext += "%[ERROR]";
				plaintext += "?";
				i++;
			}
		} else {
		   plaintext += ch;
		   i++;
		}
	} 
   return plaintext;
}

function addslashes(str) {
	str = str.replace(/\'/g,'\\\'');
	str = str.replace(/\"/g,'\\"');
	str = str.replace(/\\/g,'\\\\');
	str = str.replace(/\0/g,'\\0');
	return str;
}
function stripslashes(str) {
	str = str.replace(/\\'/g,'\'');
	str = str.replace(/\\"/g,'"');
	str = str.replace(/\\\\/g,'\\');
	str = str.replace(/\\0/g,'\0');
	return str;
}
// placeholder functie
function det_replace(type,text){
        return text;
}
function putExt(type, text){
        if (clientTarget !== null){
                if (typeof clientTarget.cursorPos != 'undefined')       {
                        var cursorPos = clientTarget.cursorPos;
                        if (type != 'plain') {text = cursorPos.text;}
                        cursorPos.text = det_replace(type, text);
                } else if (typeof clientTarget.selectionStart != 'undefined')   {
                        // remember scrollposition
                        var scrollTop = clientTarget.scrollTop;

                        var sStart = clientTarget.selectionStart;
                        var sEnd = clientTarget.selectionEnd;
                        if (type != 'plain') {text = clientTarget.value.substring(sStart, sEnd);}
                        text = det_replace(type, text);
                        clientTarget.value = clientTarget.value.substr(0, sStart) + text + clientTarget.value.substr(sEnd);
                        var nStart = sStart == sEnd ? sStart + text.length : sStart;
                        var nEnd = sStart + text.length;
                        clientTarget.setSelectionRange(nStart, nEnd);

                        // reset scrollposition
                        clientTarget.scrollTop = scrollTop;
                } else {
                        if (type != 'plain') {text = '';}
                        clientTarget.value += det_replace(type, text);
                }

                clientTarget.focus();
                if (typeof clientTarget.cursorPos != 'undefined') {clientTarget.onselect();}
        }
}
function putStr(text){
	putExt('plain', text);
}