/**********************************************
 * Here are globals:
 **********************************************/

var loaderImagePath = "images/ajax-loader.gif";
var loaderImageHeight = 16;
var loaderImageWidth = 16;

var menu_timeout = 400;
var menu_timer	= 0;
var menu_item = 0;



/**********************************************
 * Here are some helper functions:
 **********************************************/

function print_r( array, return_val ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Michael White (http://getsprink.com)
    // +   improved by: Ben Bryan
    // *     example 1: print_r(1, true);
    // *     returns 1: 1
    
    var output = "", pad_char = " ", pad_val = 4;
 
    var formatArray = function (obj, cur_depth, pad_val, pad_char) {
        if (cur_depth > 0) {
            cur_depth++;
        }
 
        var base_pad = repeat_char(pad_val*cur_depth, pad_char);
        var thick_pad = repeat_char(pad_val*(cur_depth+1), pad_char);
        var str = "";
 
        if (obj instanceof Array || obj instanceof Object) {
            str += "Array\n" + base_pad + "(\n";
            for (var key in obj) {
                if (obj[key] instanceof Array) {
                    str += thick_pad + "["+key+"] => "+formatArray(obj[key], cur_depth+1, pad_val, pad_char);
                } else {
                    str += thick_pad + "["+key+"] => " + obj[key] + "\n";
                }
            }
            str += base_pad + ")\n";
        } else if(obj == null || obj == undefined) {
            str = '';
        } else {
            str = obj.toString();
        }
 
        return str;
    };
 
    var repeat_char = function (len, pad_char) {
        var str = "";
        for(var i=0; i < len; i++) { 
            str += pad_char; 
        };
        return str;
    };
    output = formatArray(array, 0, pad_val, pad_char);
 
    if (return_val !== true) {
        document.write("<pre>" + output + "</pre>");
        return true;
    } else {
        return output;
    }
}


/**
 * Function : dump()
 * Arguments: The data - array,hash(associative array),object
 *    The level - OPTIONAL
 * Returns  : The textual representation of the array.
 * This function was inspired by the print_r function of PHP.
 * This will accept some data as the argument and return a
 * text that will be a more readable version of the
 * array/hash/object that is given.
 * Docs: http://www.openjs.com/scripts/others/dump_function_php_print_r.php
 */
function dump(arr,level) {
	var dumped_text = "";
	if(!level) level = 0;
	
	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";
	
	if(typeof(arr) == 'object') { //Array/Hashes/Objects 
		for(var item in arr) {
			var value = arr[item];
			
			if(typeof(value) == 'object') { //If it is an array,
				dumped_text += level_padding + "'" + item + "' ...\n";
				dumped_text += dump(value,level+1);
			} else {
				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
			}
		}
	} else { //Stings/Chars/Numbers etc.
		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
}

// returns true if given element with given id belongs to the given classname
function elementHasClassName(element, classname) {

if(element==null) {
  return false;
}

if((element.className==null)||(element.className=='')) {
  return false;
}

classes = element.className.split(" ");

for(i = 0; i < classes.length; i++){
  if(classes[i]==classname)
    return true;
}
return false;



}
// self-explanatory:
function getElementsByClassName(classname, node) {
  if(!node) node = document.getElementsByTagName("body")[0];
  
  var a = [];
  var re = new RegExp('\\b' + classname + '\\b');
  var els = node.getElementsByTagName("*");
  for(var i=0,j=els.length; i<j; i++)
  if(re.test(els[i].className))a.push(els[i]);
 
  return a;
}


// Assigns events to all elements that need event-handling in the page
// Those elements are usually anchors: <a>
function assign_events() {

  // assign events to ajax menu items
  var ajaxmenus = getElementsByClassName('ajaxmenu', document);

  for (var i=0;i<ajaxmenus.length;i++) {
  	ajaxmenus[i].onclick = menu_onclick;
	// if menu has children:
	if(ajaxmenus[i].parentNode.childNodes[2] != null) {
      ajaxmenus[i].onmouseover = menu_onmouseover;
      ajaxmenus[i].onmouseout = menu_onmouseout;
	  ajaxmenus[i].parentNode.childNodes[2].onmouseover = menu_cancel_timer;
	  ajaxmenus[i].parentNode.childNodes[2].onmouseout = menu_onmouseout;
	  ajaxmenus[i].parentNode.childNodes[2].style.display = "none";
	} else {
	  if(elementHasClassName(ajaxmenus[i], 'level_1')) {
        ajaxmenus[i].onmouseover = menu_timer_callback;	
	  }
		
	}
   // ajaxmenus[i].onmouseout = menu_onmouseout;
	
  }


  // Now assign events to the language items:
 
 /*var lang = getElementsByClassName('langitem', document);
  for (var i=0;i<lang.length;i++) {
  	lang[i].onclick = link_onclick;
  }
*/
  
  
}


function param_values(theurl) {

//divide the URL in half at the '?'
var params = new Array();
var urlHalves = String(theurl).split('?');

var urlVarValue = '';
if(urlHalves[1]){
  //load all the name/value pairs into an array
  var urlVars = urlHalves[1].split('&');
  //loop over the list, and find the specified url variable
  j=0;
  for(i=0; i<=(urlVars.length); i++){
    if(urlVars[i]){
      //load the name/value pair into an array
      var urlVarPair = urlVars[i].split('=');
      if (urlVarPair[0]) {
        params[j] = urlVarPair[1];
		j++;
      }
    }
  }
}

return params;   
}


function param_names(theurl) {

//divide the URL in half at the '?'
var params = new Array();
var urlHalves = String(theurl).split('?');

var urlVarValue = '';
if(urlHalves[1]){
  //load all the name/value pairs into an array
  var urlVars = urlHalves[1].split('&');
  //loop over the list, and find the specified url variable
  j=0;
  for(i=0; i<=(urlVars.length); i++){
    if(urlVars[i]){
      //load the name/value pair into an array
      var urlVarPair = urlVars[i].split('=');
      if (urlVarPair[0]) {
        //I found a variable that matches, load it's value into the return variable
        urlVarValue = urlVarPair[1];
		
        params[j] = urlVarPair[0];
		j++;
      }
    }
  }
}

return params;   
}

// returns all the parameter names of the given url
function get_param_names(url) 
{
	var params = new Array( );
	var regex = /[\?&]([^=]+)=/g;
	while( ( results = regex.exec( url ) ) != null )
		params.push( results[1] );
	
	return params;
}

// Returns the value of the specified parameter in the given url
function get_param(url, paramname)
{
  paramname = paramname.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+paramname+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( url );
  if( results == null )
    return "";
  else
    return results[1];
}


// shows a loading indicator on the specified element (input: element's id)
function show_indicator(element_id) {
	var targetElement = document.getElementById(element_id);
	var offsetHeight = targetElement.offsetHeight;

    var offsetWidth = targetElement.offsetWidth;

//    var marginTop = (offsetHeight / 2) - loaderImageHeight;
	var marginTop = 200;
	var loaderDiv = '<div style="margin-top: ' + marginTop + 'px; width: ' + loaderImageWidth + 'px; margin-left: auto; margin-right: auto; "><img src="' + loaderImagePath + '" /></div>';
	
	targetElement.innerHTML = loaderDiv + "<div id='hiddenstuff'>" + targetElement.innerHTML + "</div>";
	var hiddenElement = document.getElementById("hiddenstuff");

	hiddenElement.style.visibility = "hidden";

}

/****************************************************
 * Here are the html-javascript interface functions:
 ****************************************************/



function jscript_init() {


  assign_events();


  // do some site-specific javascript stuff...
  jscript_init_extra();


}




function jscript_init_extra() {


}


/**********************************************
 * Here are the AJAX-related functions:
 **********************************************/

function GetXmlHttpObject()
{
var xmlHttp=null;

try
 {
 // Firefox, Opera 8.0+, Safari
 xmlHttp=new XMLHttpRequest();
 }
catch (e)
 {
 // Internet Explorer
 try
  {
  xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
  }
 catch (e)
  {
  xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
 }

return xmlHttp;
}




/**********************************************
 * Here are the event handling functions:
 **********************************************/
 
function is_grandchild(parent, child) {

return false;
//alert("checking: " + child.innerHTML + "\n\n\n\n child of: " + parent.innerHTML);

the_parent = child.parentNode;
while(the_parent) {

	if(the_parent == parent) {
		alert("yeah!");
	  return true;
	}
	the_parent = the_parent.parentNode;
}

return false;
}

function is_grandparent_of(grandparent, grandchild) {

//alert(grandparent.innerHTML + "\n\n\n" + grandchild.innerHTML);

the_grandparent = grandchild.parentNode;
while(the_grandparent) {

	if(the_grandparent == grandparent) {
		//alert("yeah!");
	  return true;
	}
	the_grandparent = the_grandparent.parentNode;
}
return false;

}


// here are some extra, site-specific things to do when clicked on a menu:
function menu_onclick_extra(theMenu) {

}

function menu_timer_callback() {
	if(menu_item) {
		menu_item.style.display = 'none';
//		Effect.Fade(menu_item.id, { duration: 0.2, queue: { position: 'end' } });
      //  alert(menu_item.id);
	}
}

function menu_onmouseout() {

	menu_timer = window.setTimeout(menu_timer_callback, menu_timeout);

}

function menu_cancel_timer() {
	if(menu_timer)
	{
		window.clearTimeout(menu_timer);
		menu_timer = null;
	}
	
}


function menu_onmouseover() {
var id = this.parentNode.childNodes[2].id;

menu_cancel_timer();

if(menu_item) {
	menu_item.style.display = 'none';
//	Effect.Fade(menu_item.id, { duration: 0.4 });	
}

menu_item = document.getElementById(id);
//alert('ok1');

//menu_item.style.visibility = 'visible';
menu_item.style.display = 'block';


//Effect.Appear(menu_item.id);
//alert(menu_item.innerHTML);

}

// what to do when someone clicks on an ajax link
function link_onclick(thelink) {

	//Remove any editors currently visible
	var ed = tinyMCE.get('popupwindow-1-pageeditor');
	if (ed) {
		tinyMCE.execCommand('mceRemoveControl', false, 'popupwindow-1-pageeditor');
	}

	theparams = get_param_names(thelink.href);
	theurl = 'index.php?ajax=true';
	for(i=0; i<theparams.length; i++) {
  		theurl = theurl + '&' + theparams[i] + '=' + get_param(thelink.href, theparams[i]);
	}
	// extract the target container id
	t = get_param(thelink.href, 't');
	
	if(document.getElementById(t) == null) {
		// if no target container is found or specified, just go to the link the usual way (i.e. without ajax)
	  	return true;
	}
	
	// show the ajax loading indicator
	show_indicator(t);
	
	// now update the page
	var myReq = new Ajax.Request(theurl, { method: 'get', onSuccess: update_container} );
	myReq.transport.containerID = t;
	
	// and load any associated javascript:
	var myReq2 = new Ajax.Request(theurl + '&a=javascript', { method: 'get', onSuccess: update_jscript} );
	
	myReq2.transport.containerID = t;
	return false;
	
}



// what to do when someone clicks on a menu
function menu_onclick() {
    //Remove any editors currently visible
    var ed = tinyMCE.get('popupwindow-1-pageeditor');
    if (ed) {
      tinyMCE.execCommand('mceRemoveControl', false, 'popupwindow-1-pageeditor');
    }

    // perform any additional operations 
	menu_onclick_extra(this);



  
    
	
    // first, extract the pagename:
    pn = get_param(this.href, 'pn');
    // now extract the target container id e.g. a div's id
    t = get_param(this.href, 't');
    // and now extract the language parameter
    l = get_param(this.href, 'l');

	


    xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null) {
      alert ("Browser does not support HTTP Request");
      return;
    } 


    // prepare parameters to feed to the xmlHttp object
    ajaxurl = 'index.php?pn=' + pn + '&t=' + t + '&l=' + l + '&ajax=true';
    var params = new Array();
    params['pn'] = pn;
    params['t'] = t;
    params['l'] = l;
	
    if(pn=='_none') {
      return false;
    }

    xmlHttp.previousContent = document.getElementById(t).innerHTML;

    xmlHttp.params = params;
    xmlHttp.open("GET",ajaxurl,true);
    xmlHttp.onreadystatechange=xmlStateChanged; 
    xmlHttp.updateLinks = updateLinks;
    xmlHttp.send(null);

    
    show_indicator(t);

  // update the content of any containers present
  var containers = getElementsByClassName('snippetcontainer', document);

  for (var i=0;i<containers.length;i++) {
// first, retrieve the content of the snippets:
    var myReq = new Ajax.Request('index.php', { method: 'post', 
                                    onSuccess: update_container, 
                                    parameters: {l: l, pn: pn, ajax: 'true', a: 'snippets', snippetcontainer: containers[i].id} 
                                  } );




    myReq.transport.containerID = containers[i].id;

// and then, the jscript associated with each of those snippets:

    var myReq2 = new Ajax.Request('index.php', { method: 'post', 
                                    onSuccess: update_jscript, 
                                    parameters: {l: l, pn: pn, ajax: 'true', a: 'snippets_jscript', snippetcontainer: containers[i].id} 
                                  } );

    myReq2.transport.containerID = containers[i].id;

//        show_indicator(containers[i].id);
  }




  return false;
}



function update_jscript(transport) {
  if(transport==null) {
    return;
  }
  var containerID = transport.transport.containerID;
  var the_jscript = transport.responseText;
//  alert('received jscript: ' + the_jscript);
  eval(the_jscript);
  
}

function update_container(transport) {
  if(transport==null) {
    return;
  }
  var containerID = transport.transport.containerID;

  if(transport.responseText != '') {
     document.getElementById(containerID).innerHTML = transport.responseText;
  }


}

function set_param(params, values, param, value) {

	for(var i=0;i<params.length;i++) {
		if(params[i]==param)
		  values[i] = value;
	}
	return values;
}

function updateLinks() {


  var params = xmlHttp.params;

  // update language menu links:
  var lang = getElementsByClassName('langitem', document);
  
  for (var i=0;i<lang.length;i++) {
	var url_param_names = param_names(lang[i].href);
	var url_param_values = param_values(lang[i].href);
	var new_url = "index.php";
	
	url_param_values = set_param(url_param_names, url_param_values, "pn", params['pn']);
	
	
	for(var j=0;j<url_param_names.length;j++) {
		if(j==0)
		  new_url = new_url + "?" + url_param_names[j] + "=" + url_param_values[j];
		else
  		  new_url = new_url + "&" + url_param_names[j] + "=" + url_param_values[j];

	}
    lang[i].href = new_url;
  }

	 
}


// this is the second phase, where we load the javascript associated with a page
function xmlStateChanged2() {
  if (xmlHttp2.readyState==4 || xmlHttp2.readyState=="complete")
  {
    eval(xmlHttp2.responseText);

  }
}


// requests a javascript using ajax from the specified URL. It then executes it
function requestJavascript(url) {
         // load any javascript code associated with the current page:
         xmlHttp2=GetXmlHttpObject();
         if (xmlHttp2==null) {
           alert ("Browser does not support HTTP Request");
           return;
         } 

         // prepare parameters to feed to the xmlHttp2 object

	 xmlHttp2.open("GET",url,true);
         xmlHttp2.onreadystatechange=xmlStateChanged2; 
         xmlHttp2.send(null);

}

function xmlStateChanged() {
	 
  if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
  { 
  
          // get the params back...
     var params = xmlHttp.params;
	 var targetElement = document.getElementById(params['t']);
	 targetElement.style.height = "";

         var strippedString = xmlHttp.responseText.replace("\n", "");
         strippedString = strippedString.replace(" ", "");
         
         if(strippedString!="") {
	     targetElement.innerHTML = xmlHttp.responseText;
         } else {
             targetElement.innerHTML = xmlHttp.previousContent;
         }
	 // now update any links
	 xmlHttp.updateLinks();

     ajaxurl = 'index.php?pn=' + params['pn'] + '&t=' + params['t'] + '&l=' + params['l'] + '&ajax=true&a=javascript';	
     requestJavascript(ajaxurl);



     new Ajax.Request('index.php', {
       method: 'post',
	   onSuccess: function(transport) {
		   document.title = transport.responseText;
	   },
       parameters: { ajax: 'true', a: 'get_page_title', pn: params['pn'], l: params['l']  }
     });

  } 

}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}
function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

Ajax.InPlaceEditorWithEmptyText = Class.create(Ajax.InPlaceEditor, {

  initialize : function($super, element, url, options) {

    options.element = element;

    if (!options.emptyText)        options.emptyText      = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
    if (!options.emptyClassName)   options.emptyClassName = 'inplaceeditor-empty';

    $super(element, url, options);
	
    this.checkEmpty();
  },

  checkEmpty : function() {

    if (this.element.innerHTML.length == 0 && this.options.emptyText) {

      this.element.appendChild(
          new Element('span', { className : this.options.emptyClassName }).update(this.options.emptyText)
        );
    }

  },

  getText : function($super) {

    if (empty_span = this.element.select('.' + this.options.emptyClassName).first()) {
      empty_span.remove();
    }

    return $super();

  },

  onComplete : function($super, transport) {
    this.checkEmpty();
    return $super(transport);


  }

});


function check_email(str) {

  var at="@"
  var dot="."
  var lat=str.indexOf(at)
  var lstr=str.length
  var ldot=str.indexOf(dot)
  if (str.indexOf(at)==-1){
     return false
  }
  if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
     return false
  }
  if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
      return false
  }
  if (str.indexOf(at,(lat+1))!=-1){
      return false
  }
 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
    return false
 }

 if (str.indexOf(dot,(lat+2))==-1){
    return false
 }
		
 if (str.indexOf(" ")!=-1){
    return false
 }

 return true					
}



function urlencode (str) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: travc
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Lars Fischer
    // +      input by: Ratheous
    // +      reimplemented by: Brett Zamir (http://brett-zamir.me)
    // %          note 1: This reflects PHP 5.3/6.0+ behavior
    // *     example 1: urlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin+van+Zonneveld%21'
    // *     example 2: urlencode('http://kevin.vanzonneveld.net/');
    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
    // *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'
 
    var hexStr = function (dec) {
        return '%' + dec.toString(16).toUpperCase();
    };
 
    var ret = '',
            unreserved = /[\w.-]/; // A-Za-z0-9_.- // Tilde is not here for historical reasons; to preserve it, use rawurlencode instead
    str = (str+'').toString();
 
    for (var i = 0, dl = str.length; i < dl; i++) {
        var ch = str.charAt(i);
        if (unreserved.test(ch)) {
            ret += ch;
        }
        else {
            var code = str.charCodeAt(i);
            // Reserved assumed to be in UTF-8, as in PHP
            if (code === 32) {
                ret += '+'; // %20 in rawurlencode
            }
            else if (code < 128) { // 1 byte
                ret += hexStr(code);
            }
            else if (code >= 128 && code < 2048) { // 2 bytes
                ret += hexStr((code >> 6) | 0xC0);
                ret += hexStr((code & 0x3F) | 0x80);
            }
            else if (code >= 2048 && code < 65536) { // 3 bytes
                ret += hexStr((code >> 12) | 0xE0);
                ret += hexStr(((code >> 6) & 0x3F) | 0x80);
                ret += hexStr((code & 0x3F) | 0x80);
            }
            else if (code >= 65536) { // 4 bytes
                ret += hexStr((code >> 18) | 0xF0);
                ret += hexStr(((code >> 12) & 0x3F) | 0x80);
                ret += hexStr(((code >> 6) & 0x3F) | 0x80);
                ret += hexStr((code & 0x3F) | 0x80);
            }
        }
    }
    return ret;
}

// Processes the responseText. 
// and returns a reponse structure containing two fields:
//                                                             err    (true or false)
//                                                             errmsg (the description of the error if present)
//                                                             text   (the remaining processed text)

function process_responseText(responseText) {
        var validatedText = responseText;
        var err=false;
        var errMsg = '';

        if(responseText.indexOf('#errmsg:')==0) {
          var endIndex = responseText.indexOf('#', 1);
          if(endIndex>0) {
            err=true;
            errMsg = responseText.substr(8, endIndex-8);
            validatedText = responseText.substr(endIndex+1);
          }

        }

        var theResponse = new Array();
        
        theResponse['err'] = err;
        theResponse['errmsg'] = errMsg;
		  theResponse['text'] = validatedText;
		  return theResponse;
 
}


// validates an input text which supports empty strings
function validate_input_with_empty(transport, element) {

  // if transport var hasn't been set, this means the cancel button has been pressed, so dont do anything...
  if(transport==null) {
    this.checkEmpty();
    return;
  }
  
  theResponse = process_responseText(transport.responseText);
  
  element.innerHTML = theResponse['text'];
  this.checkEmpty();
  
  if(theResponse['err']) {
          alert(theResponse['errmsg']);
  }

}


// validates an input text
function validate_input(transport, element) {

  // if transport var hasn't been set, this means the cancel button has been pressed, so dont do anything...
  if(transport==null) {
    this.checkEmpty();
    return;
  }
  
  theResponse = process_responseText(transport.responseText);
  
  element.innerHTML = theResponse['text'];
  
  if(theResponse['err']) {
          alert(theResponse['errmsg']);
  }

}

