// general purpose webservice wrapper, JsService below
function Webservice( url, parameters )
{
    this.url = url
    this.parameters = parameters || ''
    this.locked = false
}

// abstract: inherit + implement
Webservice.prototype.prepareResponse = function( requestWithResponse ) 
{
   return requestWithResponse.responseText
}

Webservice.prototype.request = function()
{
   var i, ids = [ 'MSXML4', 'MSXML3', 'MSXML2', 'MSXML', 'Microsoft' ]
   for ( i = 0; i < ids.length; ++i ) {
      try { return new ActiveXObject( ids[i] + '.XMLHTTP' ) } catch( e ) { }
   }
   if( window.XMLHttpRequest ) {
      return new XMLHttpRequest()
   }
   return null
}

Webservice.prototype.prepareRequest = function( method, callback, listener )
{
   var req = this.request()
   if ( !req ) {
      error( "Konnte keine http-Verbindung zum Server herstellen (nur ab Safari 1.2, Firefox, Opera 8, MSIE 5.5)." )
      return
   }
   var listener = listener || null
   var prepareResponse = this.prepareResponse
   var service = this
   req.onreadystatechange = function()
   { 
      if ( req.readyState != 4 ) {
          return
      }
      service.locked = false
      if ( document.getElementById( "wait" ) ) {
          hide( document.getElementById( "wait" ) )
      }
      if ( req.status != 200 ) {
          error( "Konnte keine Daten erhalten. Server meldet: " + req.status )
          return
      }
      if ( callback ) {
         callback.call( listener || this, prepareResponse( req ) )
      }
   }
   return req
}

Webservice.prototype.get = function( method, callback, parameters, listener )
{
   if ( this.locked ) {
      return
   }
   this.locked = true
   if ( document.getElementById( "wait" ) ) {
      show( document.getElementById( "wait" ) )
   }
   var req = this.prepareRequest( method, callback || null, listener || null )
   var url = this.url + method + "?uniq=" + new Date().getTime() + "&"
   req.open( "GET", url + this.parameters + "&" + ( parameters || "" ), true )
   log( '<Request parameters="' + parameters + '">' )
   req.send( null )}

Webservice.prototype.post = function( methodUrl, callback, form, listener )
{
	var req = this.prepareRequest( methodUrl, callback, listener || null )
	var url = methodUrl + "?uniq=" + new Date().getTime() + "&"
	var field, value, parameters = ""
	for( var i = 0; i < form.elements.length; ++i ) {
	   field = form.elements[ i ]
	   if ( field.nodeName.toLowerCase() == "select" ) {
         value = field.options[ field.selectedIndex ].value
	   } else {
         value = field.value
      }
	   parameters += field.name + "=" + escape( value ) + "&"
	}
   log( '<Request> "' + parameters + '" </Request>' )
	req.open( "GET", url + parameters + this.parameters, true )
	req.send( null )}

// JS Webservice
//
// Call "methods" on the server using a post request (carrying XML data) and call
// a js-method when the results have arrived.
function JsService( url, parameters )
{
   this.parent( url, parameters, Webservice.RESPONSE_TYPE_TEXT )
}

JsService.prototype = new Webservice
JsService.prototype.parent = Webservice
JsService.prototype.prepareResponse = function( requestWithResponse )
{
   log( "<Response> " + requestWithResponse.responseText + " </Response>" )
   eval( "var response = " + requestWithResponse.responseText )
   return response
}
