// custom invocation: 	xmlhttp_request('mp=html&html=myfragment_xmlhttp&my_id='+my_id, "xmlhttp_custom_code(xmlhttp)");
function create_xmlhttp() {

	var xmlhttp=false;
	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
	// JScript gives us Conditional compilation, we can cope with old IE versions.
	// and security blocked creation of the objects.
	 try {
	  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	 } catch (e) {
	  try {
	   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	  } catch (E) {
	   xmlhttp = false;
	  }
	 }
	@end @*/
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
	  xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}

function xmlhttp_async(request_url, request_parameters) {
	var response = xmlhttp_request(request_url, request_parameters, null, null, true);
	var myresponse = _trim(response.responseText).replace(/\r|\n|\r\n|\t/g, ""); // return characters
        myresponse =myresponse.replace(/^\s+|\s+$/g,""); // whitespace
        myresponse = _trim(myresponse);
	return myresponse;
}

function get_xmlhttp_fill(fill_type,fill_location) {
	if(fill_type=='html'){
		return ("xmlhttp_response_html(xmlhttp,'"+fill_location+"')");
	} else if (fill_type=='input') {
		return ("xmlhttp_response_input(xmlhttp,'"+fill_location+"')");
	}
}

function xmlhttp_fill(request_url, request_parameters, element_id) {
	xmlhttp_request (request_url, request_parameters, get_xmlhttp_fill('html',element_id));
}

function xmlhttp_fill_wait(request_url, request_parameters, element_id) {
	xmlhttp_request (request_url, request_parameters, get_xmlhttp_fill('html',element_id), xmlhttp_wait_circle(element_id));
}

function xmlhttp_fill_save(request_url, request_parameters, element_id) {
	xmlhttp_request (request_url, request_parameters, get_xmlhttp_fill('html',element_id), xmlhttp_wait_saving(element_id));
}

function xmlhttp_fill_input(request_url, request_parameters, element_id) {
	xmlhttp_request (request_url, request_parameters, get_xmlhttp_fill('input',element_id), xmlhttp_input_saving(element_id));
}

function xmlhttp_request (request_url, request_parameters, response_handler, waiting_handler, use_synchronous) {
	if (waiting_handler) {
		eval(waiting_handler);
	}
	var xmlhttp = create_xmlhttp();
        request_async = true;
        if(use_synchronous) {
           request_async = false;
        }
	xmlhttp.open ("POST", request_url, request_async);
        if(request_async) {
   	   xmlhttp.onreadystatechange = function() {
		if (xmlhttp.readyState==4) {	
			if (xmlhttp.status == 200) {
				if (response_handler) {
					eval(response_handler);
				}
			} else {
				// fail silently
				// alert ('Request failed');
			}
		}
	   }
        }
	xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
	xmlhttp.setRequestHeader("Content-length", request_parameters.length);
        xmlhttp.setRequestHeader("Connection", "close");
	xmlhttp.send(request_parameters);
        if(!request_async) {
           if(response_handler) {
              return eval(response_handler);
           } else {
              return xmlhttp;
           }
        }
}

function xmlhttp_form_submit(form_id,request_url,request_parameters,response_handler,waiting_handler,encodeuri) {
	var submission_string = request_parameters;

	var form_parameters = getFormValues(document.getElementById(form_id),encodeuri);
	if(submission_string) {
		submission_string = submission_string + "&" + form_parameters;		
	} else {
		submission_string = form_parameters;
	}
	
	xmlhttp_request(request_url,submission_string,response_handler,waiting_handler);
}

function getFormValues(form_element,encodeuri) { 

   var request_string = ""; 
   var element_type = "";

   for(var i = 0;i < form_element.elements.length;i++) { 
		element_type = form_element.elements[i].type;
		if (element_type=="textarea" || element_type=="text" || element_type=="hidden") {
            request_string += getEscapedFormValues(form_element.elements[i].name,form_element.elements[i].value,encodeuri) + "&"; 
		} else if (element_type == "select-one") {
            request_string += getEscapedFormValues(form_element.elements[i].name, form_element.elements[i].options[form_element.elements[i].selectedIndex].value,encodeuri) + "&"; 
       } else if (element_type == "checkbox") {
		   	if(form_element.elements[i].checked==true) {
			   	request_string +=  getEscapedFormValues(form_element.elements[i].name, form_element.elements[i].value,encodeuri) + "&";
			} else {
			   	request_string += form_element.elements[i].name + "=&";
			}
	   }
   } 

	request_string = request_string.substr(0,(request_string.length - 1)); 
	return request_string; 
}

function getEscapedFormValues(myname,myvalue,encodeuri) {
	if(encodeuri!=null) {
		var mysplit = encodeuri.split(",");
		for(var i=0;i<mysplit.length;i++) {
			if(mysplit[i]==myname){
				return myname+"="+encodeURIComponent(myvalue);
			}
		}
	}
	return myname+"="+escape(myvalue);
}

function xmlhttp_fill_html(xmlhttp,element_id) {
	xmlhttp_response_html(xmlhttp,element_id);
}

function xmlhttp_response_html(xmlhttp,element_id) {
	var inner_html = xmlhttp.responseText;
	document.getElementById(element_id).innerHTML = inner_html;
	ajax_execute_javascript(inner_html);
}

function xmlhttp_response_input(xmlhttp,element_id) {
	document.getElementById(element_id+"__xmlhttpsavingdiv").style.display = 'none';
}

function xmlhttp_input_saving(element_id) {
	/* does our saving element already exist?  if so, just show it */
    if(document.getElementById(element_id+"__xmlhttpsavingdiv")) {
		document.getElementById(element_id+"__xmlhttpsavingdiv").style.display = '';
	} else {
		/* create our new saving div element */
		var inner_div = document.createElement("div");
		/* give our element an id */
		inner_div.setAttribute("id", element_id+"__xmlhttpsavingdiv");
		/* create our content for that div */
		var inner_div_content = document.createTextNode("Saving ...");
		/* create attributes for inner div */
		var inner_style = "position:absolute";
		inner_div.style.cssText = inner_style;
		inner_div.setAttribute("style", inner_style);
		inner_div.className = 'xmlhttp_status';		
		/* add the content to the div */
		inner_div.appendChild(inner_div_content);	

		/* create our outer div */
		var outer_div = document.createElement("div");		
		/* give our outer div element an id */
		outer_div.setAttribute("id", element_id+"__xmlhttpsavingouterdiv");
		
		var outer_style = "position:relative;display:inline";
		outer_div.style.cssText = outer_style;
		outer_div.setAttribute("style", outer_style);

		/* append our inner div to our outer div */
		outer_div.appendChild(inner_div);	
		
		var current_element = document.getElementById(element_id);
		var parent_element = current_element.parentNode;
		/* this inserts our saving div after the current element */
		parent_element.insertBefore(outer_div, current_element);
	}
}

function xmlhttp_wait_saving(element_id) {
	document.getElementById(element_id).innerHTML = '<div style="padding:2px 2px; background-color:#0000FF; color:#FFFFFF; font-weight: bold; display:inline">Saving...</div>';
}

function xmlhttp_wait_circle(element_id) {
	document.getElementById(element_id).innerHTML = '<table cellpadding="5" cellspacing="0" border="0"><tr><td><img src="/editor/images/waitcircle.gif" width="16" height="16" valign="bottom"></td><td><b>Please wait, updating ...</b></td></tr></table>';
}

function ajax_execute_javascript (inner_html) {
	var script_tags = '(?:<script.*?>)((\n|.)*?)(?:</script>)';
	var script_regex = new RegExp(script_tags, 'img');
	var scripts = inner_html.match(script_regex);
	var execute_scripts = '';
  
	if (scripts) {
		for(var i = 0; i < scripts.length; i++) {
			execute_scripts += scripts[i].match(new RegExp(script_tags, 'im'))[1];
		}
		eval(execute_scripts);
	}
}

function _trim(chkString) {
	var startString = 0;
	var endString = 0;
	var startFound = false;
	for (i = 0; i < chkString.length; i++) {
		if (chkString.charAt(i) == ' ' || chkString.charAt(i) == '\n') {
			if (startFound == false) {
				startString = i + 1;
			}
		} else {
			startFound = true;
			endString = i;
		}
	}
	return chkString.substring (startString, endString+1);	
}
