//
//
//

function WebserviceLpi_InvokeCallback(funcDataHandler, transport)
{
    var jsonReply = ExtractResponse(transport);
    funcDataHandler(jsonReply.evalJSON());
}


/*****************************************************************************/
/*
 * Login
 */

/// Login a user
function WebserviceLpi_Login(username, password, funcReplyHandler)
{
    var importer = new PostScalarImporter('lpi.asmx', 'Login', 'string', 
        funcReplyHandler);
    
    importer.VirtualGetQueryString = function ()
    {
        return "username=" + username + "&password=" + password;
    }
    
    importer.SendRequest();
}


/*****************************************************************************/
/*
 * Get By Map Image Coordinate
 */

/// Return RBPI for a given map-image coordinate
function WebserviceLpi_SelectRbpi(mapImageX, mapImageY, funcDataHandler)
{
    var importer = new PostScalarImporter('lpi.asmx', 'GetRbpiByMapCoordinate', 'LpiRecord', 
        funcDataHandler);
    
    importer.VirtualGetQueryString = function ()
    {
        return "mapX=" + mapImageX + "&mapY=" + mapImageY;
    }
    
    importer.SendRequest();
}

/// Return RBPI for a given rbpi Guid
function WebserviceLpi_SelectRbpiByGuid(rbpiGuid, funcDataHandler)
{
    var importer = new PostScalarImporter('lpi.asmx', 'GetRbpiById', 'LpiRecord', 
        funcDataHandler);
    
    importer.VirtualGetQueryString = function ()
    {
        return "rbpiIdAsGuid=" + rbpiGuid;
    }
    
    importer.SendRequest();
}


/// Return RBPI for a given map-image coordinate
function WebserviceLpi_SelectLpi(mapImageX, mapImageY, funcDataHandler)
{
    var importer = new PostScalarImporter('lpi.asmx', 'GetLpiByMapCoordinate', 'LpiRecord', 
        funcDataHandler);
    
    importer.VirtualGetQueryString = function ()
    {
        return "mapX=" + mapImageX + "&mapY=" + mapImageY;
    }
    
    importer.SendRequest();
}

/// Return LPI for a given guid
function WebserviceLpi_SelectLpiByGuid(lpiGuid, funcDataHandler)
{
    var importer = new PostScalarImporter('lpi.asmx', 'GetLpiById', 'LpiRecord', 
        funcDataHandler);
    
    importer.VirtualGetQueryString = function ()
    {
        return "lpiIdAsString=" + lpiGuid;
    }
    
    importer.SendRequest();
}
/// Get a gemeente for a given map coordinate
function WebserviceLpi_SelectGemeente(mapImageX, mapImageY, funcDataHandler)
{
    var importer = new PostScalarImporter('lpi.asmx', 'GetGemeenteByMapCoordinate', 'GemeenteRecord', 
        funcDataHandler);
    
    importer.VirtualGetQueryString = function ()
    {
        return "mapX=" + mapImageX + "&mapY=" + mapImageY;
    }
    
    importer.SendRequest();
}

/// Get a plaats for a given map coordinate
function WebserviceLpi_SelectPlaats(mapImageX, mapImageY, funcDataHandler)
{
    var importer = new PostScalarImporter('lpi.asmx', 'GetPlaatsByMapCoordinate', 'PlaatsRecord', 
        funcDataHandler);
    
    importer.VirtualGetQueryString = function ()
    {
        return "mapX=" + mapImageX + "&mapY=" + mapImageY;
    }
    
    importer.SendRequest();
}

/// get a school vor a given map coordinate
function WebserviceLpi_SelectSchoolById(id, funcDataHandler)
{
    new Ajax.Request('lpi.asmx/GetSchoolById',
    {
        method: 'get',
        parameters: { id: id },
        onSuccess: WebserviceLpi_InvokeCallback.curry(funcDataHandler),
        onException: Ajax_onException.bind(null, 'WebserviceLpi_SelectSchoolById'),
        onFailure: Ajax_onFailure.bind(null, 'WebserviceLpi_SelectSchoolById')
    });
}


function WebserviceLpi_UpdateSchool(schoolRecord, funcDataHandler)
{
    new Ajax.Request('lpi.asmx/UpdateSchool',
    {
        method: 'post',
        parameters: { schoolAsJson: Object.toJSON(schoolRecord) },
        onSuccess: WebserviceLpi_InvokeCallback.curry(funcDataHandler),
        onException: Ajax_onException.bind(null, 'WebserviceLpi_UpdateSchool'),
        onFailure: Ajax_onFailure.bind(null, 'WebserviceLpi_UpdateSchool')
    });
}

function WebserviceLpi_DeleteSchool(schoolId)
{
    new Ajax.Request('lpi.asmx/DeleteSchool',
    {
        method: 'post',
        parameters: { schoolId: schoolId },
        onException: Ajax_onException.bind(null, 'WebserviceLpi_DeleteSchool'),
        onFailure: Ajax_onFailure.bind(null, 'WebserviceLpi_DeleteSchool')
    });

}

/*****************************************************************************/
/*
 * Updates
 */

/// Update an LPI Record
function WebserviceLpi_UpdateLpi(lpiRecord)
{
    var exporter = new SoapScalarExporter('lpi.asmx', 'UpdateLpi', 'http://www.otib.nl/RegioInBeeld/', 'lpiRecord',
        function () { return lpiRecord; });
    exporter.SendRequest();
}

function WebserviceLpi_UpdateGemeente(gemeenteRecord)
{
	var gemeenteRecord2 = cloneObject(gemeenteRecord);
	gemeenteRecord2.Gemeente = encode64(gemeenteRecord2.Gemeente);

    var exporter = new SoapScalarExporter('lpi.asmx', 'UpdateGemeente', 'http://www.otib.nl/RegioInBeeld/', 'gemeenteRecord',
        function () { return gemeenteRecord2; });
    exporter.SendRequest();
}

function WebserviceLpi_UpdatePlaats(plaatsRecord)
{
	var plaatsRecord2 = cloneObject(plaatsRecord);
	plaatsRecord2.Plaats = encode64(plaatsRecord2.Plaats);
	
    var exporter = new SoapScalarExporter('lpi.asmx', 'UpdatePlaats', 'http://www.otib.nl/RegioInBeeld/', 'plaatsRecord',
        function () { return plaatsRecord2; });
    exporter.SendRequest();
}
/*****************************************************************************/
/*
 * List RBPIs and LPIs
 */

/// Return a list of RBPI's
function WebserviceLpi_ListRbpis(funcDataHandler, funcDataFinishedHandler)
{
    var importer = new PostArrayImporter('lpi.asmx', 'ListRbpis', 'IdNameRecord', 
        funcDataHandler);

    importer.OnAfterLoad = funcDataFinishedHandler;
    
    importer.SendRequest();
}

/// Return a list of LPI's
function WebserviceLpi_ListLpis(funcDataHandler, funcDataFinishedHandler)
{
    var importer = new PostArrayImporter('lpi.asmx', 'ListLpis', 'GroupIdNameRecord', 
        funcDataHandler);

    importer.OnAfterLoad = funcDataFinishedHandler;
    
    importer.SendRequest();
}




/*****************************************************************************/
/*
 * List LPI's, RBPI's, gemeentes, plaatsen for a given LPI or RBPI
 */

/// List LPI's for a given RBPI
function WebserviceLpi_ListLpisForRbpi(rbpiId, funcDataHandler, funcDataFinishedHandler)
{
    var importer = new PostArrayImporter('lpi.asmx', 'ListLpisForRbpi', 'string', 
        funcDataHandler);
    
    importer.VirtualGetQueryString = function ()
    {
        return "rbpiId=" + rbpiId;
    };
    importer.OnAfterLoad = funcDataFinishedHandler;
    
    importer.SendRequest();
}

/// List plaatsen for a given RBPI
function WebserviceLpi_ListPlaatsenForRbpi(rbpiId, funcDataHandler, funcDataFinishedHandler)
{
    var importer = new PostArrayImporter('lpi.asmx', 'ListPlaatsenForRbpi', 'string', 
        funcDataHandler);
    
    importer.VirtualGetQueryString = function ()
    {
        return "rbpiId=" + rbpiId;
    }
    importer.OnAfterLoad = funcDataFinishedHandler;
    
    importer.SendRequest();
}

/// List gemeentes for a given RBPI
function WebserviceLpi_ListGemeentesForRbpi(rbpiId, funcDataHandler, funcDataFinishedHandler)
{
    var importer = new PostArrayImporter('lpi.asmx', 'ListGemeentesForRbpi', 'string', 
        funcDataHandler);
    
    importer.VirtualGetQueryString = function ()
    {
        return "rbpiId=" + rbpiId;
    }
    importer.OnAfterLoad = funcDataFinishedHandler;
    
    importer.SendRequest();
}

/// List plaatsen for a given RBPI
function WebserviceLpi_ListPlaatsenForLpi(lpiId, funcDataHandler, funcDataFinishedHandler)
{
    var importer = new PostArrayImporter('lpi.asmx', 'ListPlaatsenForLpi', 'string', 
        funcDataHandler);
    
    importer.VirtualGetQueryString = function ()
    {
        return "lpiId=" + lpiId;
    }
    importer.OnAfterLoad = funcDataFinishedHandler;
    
    importer.SendRequest();
}

/// List gemeentes for a given RBPI
function WebserviceLpi_ListGemeentesForLpi(lpiId, funcDataHandler, funcDataFinishedHandler)
{
    var importer = new PostArrayImporter('lpi.asmx', 'ListGemeentesForLpi', 'string', 
        funcDataHandler);
    
    importer.VirtualGetQueryString = function ()
    {
        return "lpiId=" + lpiId;
    }
    importer.OnAfterLoad = funcDataFinishedHandler;
    
    importer.SendRequest();
}

/// List gemeentes for a given RBPI
function WebserviceLpi_ListScholenForLpi(lpiId, funcDataHandler)
{
    new Ajax.Request("lpi.asmx/ListScholenForLpi",
        {
            method: 'get',
            parameters: { lpiId: lpiId },
            onSuccess: WebserviceLpi_InvokeCallback.curry(funcDataHandler),
            onException: Ajax_onException.bind(null, 'WebserviceLpi_ListScholenForLpi'),
            onFailure: Ajax_onFailure.bind(null, 'WebserviceLpi_ListScholenForLpi')
        });
}



/// List plaatsen for a given gemeente
function WebserviceLpi_ListPlaatsenForGemeente(gemeenteNaam, funcDataHandler, funcDataFinishedHandler)
{
    var importer = new PostArrayImporter('lpi.asmx', 'ListPlaatsenForGemeente', 'string', 
        funcDataHandler);
    
    importer.VirtualGetQueryString = function ()
    {
        return "gemeente=" + gemeenteNaam;
    }
    importer.OnAfterLoad = funcDataFinishedHandler;
    
    importer.SendRequest();
}



// This code was written by Tyler Akins and has been placed in the
// public domain.  It would be nice if you left this header intact.
// Base64 code from Tyler Akins -- http://rumkin.com

var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

function encode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   do {
      chr1 = input.charCodeAt(i++);
      chr2 = input.charCodeAt(i++);
      chr3 = input.charCodeAt(i++);

      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;

      if (isNaN(chr2)) {
         enc3 = enc4 = 64;
      } else if (isNaN(chr3)) {
         enc4 = 64;
      }

      output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + 
         keyStr.charAt(enc3) + keyStr.charAt(enc4);
   } while (i < input.length);
   
   return output;
}

function decode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
   input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

   do {
      enc1 = keyStr.indexOf(input.charAt(i++));
      enc2 = keyStr.indexOf(input.charAt(i++));
      enc3 = keyStr.indexOf(input.charAt(i++));
      enc4 = keyStr.indexOf(input.charAt(i++));

      chr1 = (enc1 << 2) | (enc2 >> 4);
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
      chr3 = ((enc3 & 3) << 6) | enc4;

      output = output + String.fromCharCode(chr1);

      if (enc3 != 64) {
         output = output + String.fromCharCode(chr2);
      }
      if (enc4 != 64) {
         output = output + String.fromCharCode(chr3);
      }
   } while (i < input.length);

   return output;
}

function cloneObject(src) {
	var o = new Object();
    for (i in src) {
        o[i] = src[i];
    }
    return o;
}
