From 8dc8e863db1fa48b554cac3719f91740c411ca0b Mon Sep 17 00:00:00 2001 From: John Woodlock Date: Wed, 6 Jun 2012 02:03:11 +1000 Subject: [PATCH] just some docs WIP --- APIFolder/apiLive.htm | 3470 +++++++++++++++++++++++++++++++++++ APIFolder/demo - Copy.htm | 48 + APIFolder/demo.htm | 48 + APIFolder/jquery-1.7.min.js | 4 + 4 files changed, 3570 insertions(+) create mode 100644 APIFolder/apiLive.htm create mode 100644 APIFolder/demo - Copy.htm create mode 100644 APIFolder/demo.htm create mode 100644 APIFolder/jquery-1.7.min.js diff --git a/APIFolder/apiLive.htm b/APIFolder/apiLive.htm new file mode 100644 index 000000000..1a73b7a34 --- /dev/null +++ b/APIFolder/apiLive.htm @@ -0,0 +1,3470 @@ + + + + + + + Mifos X API Documentation + + + +
+
+ + +
+

Core

+ +
+
+

Configuration

+
+
+ + + +
RESOURCES
POST
create/complex update
GET
read
PUT
update
DELETE
delete
CONFIGURATION/v1/configurations/currencyRetrieve Currency ConfigurationUpdate Currency Configuration
+
+
+
+
+

Additional Fields

+
+
+ + + + +
RESOURCES
POST
create/complex update
GET
read
PUT
update
DELETE
delete
ADDITIONAL FIELDS/v1/additionalfieldsList Additional Fields Sets
/v1/additionalfields/{Type}/{Set}/{id}Update Additional FieldsRetrieve Additional Fields
+
+
+
+
+

Report

+
+
+ + + + +
RESOURCES
POST
create/complex update
GET
read
PUT
update
DELETE
delete
REPORT/v1/reportsList Reports
/v1/reports/{reportName}Run a Report
+
+
+
+
+

User Related

+
+
+ + + + + + + + +
RESOURCES
POST
create/complex update
GET
read
PUT
update
DELETE
delete
AUTHENTICATION/v1/authenticationVerify Authentication
USER/v1/usersCreate a UserList Users
/v1/users/{userId}Retrieve a UserUpdate a UserDelete a User
ROLE/v1/rolesCreate a New RoleList Roles
/v1/roles/{roleId}Retrieve a RoleUpdate a Role
PERMISSION/v1/permissionsList Application Permissions
+
+
+
+
+

Convenience

+
+
+ + + + + + + + + +
RESOURCES
GET
read
/v1/clients/templateRetrieve Client Details Template
/v1/loans/templateRetrieve Loan Details Template
/v1/loans/{loanId}/transactions/templateRetrieve Loan Repayment/Loan Waiver Template
/v1/offices/templateRetrieve Office Details Template
/v1/loanproducts/templateRetrieve Loan Product Details Template
/v1/users/templateRetrieve User Details Template
/v1/roles/templateRetrieve Role Details Template
+
+
+
+
+ +
+   +
+
+

Mifos X API Documentation

+

+ The Mifos X API is organized around + REST. +

+

+ The API is designed to have:
+ - predictable, resource-oriented URLs
+ - to use HTTP response codes to indicate API errors
+ - to use built-in HTTP features, like HTTP authentication and + HTTP verbs, which can be understood by off-the-shelf HTTP + clients. +

+

JSON is returned in all responses from the API, including errors. +

+

+ Much of the API presentation and design ideas are owed to the excellent Apigee "Web API Design" eBook/PDF and the very good Stripe API reference. +

+
+ +
+ +   +
+
+

Try The API From Your Browser

+

GET (read) examples can be run directly from this documentation. It is just a matter of clicking a link. + Most browsers display the output on the same page (or another tab if you right click and select that option). + Internet Explorer will probably treat the output as if you wanted to download a file. + In that case just elect to open the output in a text editor.

+

If you want to check out the POST, PUT and DELETE (update) examples a good approach is to take a moment to + install a REST plugin for your browser e.g. RESTClient for FireFox

+ The REST plugins will allow you to +
    +
  • Select the "Verb" (e.g. POST)
  • +
  • Enter the resource name (e.g. https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/offices)
  • +
  • Add a header to indicate you are sending JSON data as part of the request body (e.g. Content-Type: application/json)
  • +
  • Paste the example JSON into a Request Body
  • +
  • Send the Request (and receive a Response)
  • +
+
+ +
+ + +   +
+
+

Generic Options

+

Convenience Templates

+

There are a list of convenience resources (see Convenience menu option). These resources end with "/template" and can be useful when building maintenance user interface screens for client applications. The template data returned may consist of any or all of: +

    +
  • Field Defaults
  • +
  • Allowed Value Lists
  • +
+

+

Also, many "Retrieve a" type resources (Retrieve a Client for example) allow the parameter option "template=true". + This appends any "Allowed Value Lists" which can be useful when building update functionality.

+ +

Restrict Returned Fields

+

Parameter "fields={fieldlist}" can be used on GET requests to restrict the fields returned.

+

Example Request:

+ + https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/offices/1?pretty=true&fields=id,name,parentName + +

+

Pretty JSON Formatting

+

Parameter "pretty=true" can be used to display JSON from GET requests in an easy-to-read format. + This parameter is used in this documentation.

+

Easy-to-read JSON output for POSTs, PUTs and DELETEs will available in the REST plugin you use e.g. RESTClient for FireFox

+
+ +
+ +   +
+
+

Creating and Updating

+

+ When you want to 'Create a ...' you have to at least supply the mandatory fields. + The mandatory fields are listed in this documentation under the relevant 'Create a ...' heading. +

+ +

+ When you want to 'Update a ...' you can update individual fields or a combination of fields (subject to data integrity rules). +

+
+ +
+ + +   +
+
+

Updating Dates and Numbers

+

Dates

+

Dates are returned in GET requests as an array e.g. [ 2007, 4, 11]. However, they are sent as strings in POST and PUT requests. + If there are any dates in your POST or PUT requests, you need to provide the "dateFormat". + This can be any date pattern supported by Joda-Time. + This capability can help you when saving data in your client application as you shouldn't need to do any date format conversion prior to issuing your POST or PUT request. +

+ +JSON examples: +{ + "dateFormat": "dd MMMM yyyy", + "openingDate": "01 July 2007" +} +{ + "dateFormat": "yyyy-MM-dd", + "openingDate": "2007-03-21" +} + +

Numbers

+

+ You must provide a "locale" when updating numbers. + Numbers are not "Ids" or "Types" but are typically money amounts or percentages that relate to loans. + In any case, the API will send back an error message if you forget. +

+ +JSON examples: +{ +"locale": "en_US", +"principal": "240,400.88" +} +{ +"locale": "fr_CH", +"principal": "240 400.88" +} + +
+ +
+ +   +
+
+

Field Descriptions

+

+ Most fields are self-explanatory. Fields that aren't are described under the relevant resource heading e.g. AUTHENTICATION +

+ +
+ +
+ +   +
+
+

Authentication Overview

+

+ Authentication to the API occurs via HTTP Basic Auth. +

+ +

+ All API requests must be made over HTTPS. + Calls made over plain HTTP will fail. You must authenticate for all requests. +

+
+
+ +// A Javascript/Jquery example of how to login to Mifos X and use its api. + +// Typically, the javascript application would +// 1) Display a login page to retrieve the username and password. +// 2) Send the username and password to a function +// such as setBasicAuthKey below which sets the HTTP Basic Auth key. +// 3) The HTTP Basic Auth key is used in all subsequent requests +// (see the function executeAjaxRequest below). + +function setBasicAuthKey(username, password) { +var jqxhr = $.ajax({ + url : "https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/authentication?username=" + username + "&password=" + password, + type : 'POST', + contentType : "application/json; charset=utf-8", + dataType : 'json', + data : "{}", + cache : false, + success : function(data, textStatus, jqXHR) { + basicAuthKey = data.base64EncodedAuthenticationKey; + }, + error : function(jqXHR, textStatus, errorThrown) { + //error processing + } + }); +} + +function executeAjaxRequest(url, verbType, jsonData, basicAuthKey, successFunction, errorFunction) { +var jqxhr = $.ajax({ + url : url, + type : verbType, //POST, GET, PUT or DELETE + contentType : "application/json; charset=utf-8", + dataType : 'json', + data : jsonData, + cache : false, + beforeSend : function(xhr) { + xhr.setRequestHeader("Authorization", "Basic " + basicAuthKey); + }, + success : successFunction, + error : errorFunction + }); +} + +
+
+ +   +
+
+

Errors

+

JPW:Need to update this + Stripe uses conventional HTTP response codes to indicate + success or failure of an API request. In general, + codes in the 2xx range indicate success, codes in the + 4xx range indicate an error that resulted from the + provided information (e.g. a required parameter was + missing, a charge failed, etc.), and codes in the 5xx + range indicate an error with Stripe's servers. +

+ +

+ Not all errors map cleanly onto HTTP response codes, + however. When a request is valid but does not complete + successfully (e.g. a card is declined), we return a 402 + error code. +

+ + +

+ All errors return JSON with a type (one of card_error, invalid_request_error, + or api_error) and message describing the particular problem. +

+ +
Attributes
+
+
type
+
+
The type of error returned (card_error, invalid_request_error, api_error) + Card errors are the most common type of error you should expect to handle. + They result when the user enters a card that can't be charged for some reason. + Invalid request errors arise when your request has invalid parameters. API + errors cover any other type of problem (e.g. a temporary problem with Stripe's servers) + and should turn up only very infrequently.
+ +
message
+
+
A user-friendly message describing the error
+ +
code
+
optional
+
For card errors, additional information + about the user-friendly message to display for this error (e.g. "Your + card was declined.")
+ +
param
+
optional
+
The parameter the error relates to if the + error is parameter-specific. You can use this to display a message near + the correct form field, for example.
+
+
+
+
HTTP Status Code Summary
+
    +
  • 200 OK - Everything worked as expected.
  • +
  • 400 Bad Request - Often missing a required parameter.
  • +
  • 401 Unauthorized - No valid API key provided.
  • +
  • 402 Request Failed - Parameters were valid but request failed.
  • +
  • 404 Not Found - The requested item doesn't exist.
  • +
  • 500, 502, 503, 504 Server errors - something went wrong on Stripe's end.
  • +
+
+ +
+
Errors
+ Invalid Request Errors + Type: invalid_request_error + + API Errors + Type: api_error + + Card Errors + Type: card_error + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDetails
invalid_numberThe card number is invalid
incorrect_numberThe card number is incorrect
invalid_expiry_monthThe card's expiration month is invalid
invalid_expiry_yearThe card's expiration year is invalid
invalid_cvcThe card's security code is invalid
expired_cardThe card has expired
invalid_amountAn invalid amount was entered
incorrect_cvcThe card's security code is incorrect
card_declinedThe card was declined.
missingThere is no card on a customer that is being charged.
duplicate_transactionA transaction with identical amount and credit card information was submitted very recently.
processing_errorAn error occurred while processing the card.
+
+
+ + + + + +   +
+
+

Clients

+

Clients are people and businesses that have applied (or may apply) to an MFI for loans.

+ + + + + + + + +
Field Descriptions
externalId
A place to put an external reference for this client e.g. The ID another system uses.
maxJoinedOnOffsetFromToday
Convenience field. Number of days since the Client joined.
+
+
+ +   +
+ +
+ GET https://thedomainname/api/v1/clients +[ { + "officeId" : 1, + "officeName" : "change super user", + "id" : 2, + "firstname" : "Dennis", + "lastname" : "O'Meara", + "displayName" : "Dennis O'Meara", + "externalId" : null, + "joinedDate" : [ 2009, 1, 4 ], + "maxJoinedOnOffsetFromToday" : -1241 +}, { + "officeId" : 1, + "officeName" : "change super user", + "id" : 4, + "firstname" : "Jimmy", + "lastname" : "O'Meara", + "displayName" : "Jimmy O'Meara", + "externalId" : null, + "joinedDate" : [ 2009, 1, 11 ], + "maxJoinedOnOffsetFromToday" : -1234 +}...] + +
+
+ + +   +
+
+

Retrieve Client Details Template

+

This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of: +

    +
  • Field Defaults
  • +
  • Allowed Value Lists
  • +
+

+

Example Request:

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/clients/template?pretty=true +
+
+ GET https://thedomainname/api/v1/clients/template +{ + "joinedDate" : [ 2012, 5, 29 ], + "allowedOffices" : [ { + "id" : 1, + "name" : "Demo MFI Head Office" + }, { + "id" : 2, + "name" : "sub branch 1" + }, { + "id" : 8, + "name" : "moi aussi" + }, { + "id" : 3, + "name" : "sub branch 2" + }, { + "id" : 4, + "name" : "sub branch 3" + } ] +} + +
+
+ + +   +
+ +
+ GET https://thedomainname/api/v1/clients/{clientId} +{ + "officeId" : 1, + "officeName" : "change super user", + "id" : 1, + "firstname" : "Patrick", + "lastname" : "O'Meara", + "displayName" : "Patrick O'Meara", + "externalId" : null, + "joinedDate" : [ 2009, 1, 4 ], + "maxJoinedOnOffsetFromToday" : -1241 +} + +
+
+ +  +
+
+

Create a Client

+

Note: You can enter either:
+ firstname/lastname - for a person OR
+ clientOrBusinessName - for a business or organisation (or person known by one name). +

+ + + +
Mandatory Fields
firstname, lastname, joiningDate, officeId
+
+
+ POST https://thedomainname/api/v1/clients +POST https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/clients +Content-Type: application/json +Request Body: +{ + "officeId": 1, + "firstname": "Petra", + "lastname": "Yton", + "externalId": "786YYH7", + "dateFormat": "dd MMMM yyyy", + "joiningDate": "04 March 2009" +} + + +{ + "entityId":23 +} + +
+
+ +  +
+
+

Update a Client

+
+
+ PUT https://thedomainname/api/v1/clients/{clientId} +PUT https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/clients/23 +Content-Type: application/json +Request Body: +{ + "externalId": "786444UUUYYH7", + "dateFormat": "dd MMMM yyyy", + "joiningDate": "09 June 2006" +} + +{ "entityId": 23} +
+
+ +  +
+
+

Retrieve a Client's Loan Account Summary

+

+ An example of how a loan portfolio summary can be provided. This one contains quite a bit of redundant data (like the counts) and is requested + in a specific use case of the Individual Lending User Interface.
+ However, it is quite reasonable to add resources like this to simplify User Interface development. +

+

Example Requests:

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/clients/1/loans?pretty=true +

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/clients/1/loans?pretty=true&fields=openLoans,%20closedLoans,activeLoanCount +
+
+ GET https://thedomainname/api/v1/clients/{clientId}/loans +{ + "pendingApprovalLoans" : [ ], + "awaitingDisbursalLoans" : [ { + "id" : 17, + "externalId" : null, + "loanProductId" : 1, + "loanProductName" : "Agricultural Loan", + "loanStatusId" : 200, + "pendingApproval" : false, + "waitingForDisbursal" : true, + "open" : false, + "closed" : false, + "lifeCycleStatusText" : "Approved", + "lifeCycleStatusDate" : null + } ], + "openLoans" : [ ], + "closedLoans" : [ { + "id" : 1, + "externalId" : null, + "loanProductId" : 1, + "loanProductName" : "Agricultural Loan", + "loanStatusId" : 600, + "pendingApproval" : false, + "waitingForDisbursal" : false, + "open" : false, + "closed" : true, + "lifeCycleStatusText" : "Closed", + "lifeCycleStatusDate" : null + } ], + "anyLoanCount" : 2, + "pendingApprovalLoanCount" : 0, + "awaitingDisbursalLoanCount" : 1, + "activeLoanCount" : 0, + "closedLoanCount" : 1 +} + +
+
+ + +  +
+ +
+ GET https://thedomainname/api/v1/clients/{clientId}/notes +[ { + "id" : 20, + "clientId" : 2, + "loanId" : null, + "loanTransactionId" : null, + "noteTypeId" : 100, + "note" : "This is an extra note!", + "createdById" : 2, + "createdByUsername" : "super1", + "createdOn" : 1335066625000, + "updatedById" : 2, + "updatedByUsername" : "super1", + "updatedOn" : 1335066625000 +}, { + "id" : 16, + "clientId" : 2, + "loanId" : null, + "loanTransactionId" : null, + "noteTypeId" : 100, + "note" : "loan only 1/2 amount expected\r\nyes", + "createdById" : 2, + "createdByUsername" : "super1", + "createdOn" : 1334726104000, + "updatedById" : 2, + "updatedByUsername" : "super1", + "updatedOn" : 1335137893000 +} ] + +
+
+ +  +
+
+

Add a Client Note

+
+
+ POST https://thedomainname/api/v1/clients/{clientId}/notes + POST https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/clients/1/notes +Content-Type: application/json +Request Body: +{ +"note": "a note about the client" +} + +{ + "entityId": 40 +} + +
+
+ +  +
+ +
+ GET https://thedomainname/api/v1/clients/{clientId}/notes/{noteId} + { + "id" : 20, + "clientId" : 2, + "loanId" : null, + "loanTransactionId" : null, + "noteTypeId" : 100, + "note" : "This is an extra note!", + "createdById" : 2, + "createdByUsername" : "super1", + "createdOn" : 1335066625000, + "updatedById" : 2, + "updatedByUsername" : "super1", + "updatedOn" : 1335066625000 +} + +
+
+ +  +
+
+

Update a Client Note

+
+
+ PUT https://thedomainname/api/v1/clients/{clientId}/notes/{noteId} +PUT https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/clients/2/notes/20 +Content-Type: application/json +Request Body: +{ +"note": "and here the note is updated nicely." +} + +{ + "entityId": 20 +} + +
+
+ + + +   +
+
+

Loans

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Descriptions
digitsAfterDecimal
Override the loan product default value for digitsAfterDecimal.
principal
Loan amount.
externalId
A place to put an external reference for this loan e.g. The ID another system uses.
inArrearsTolerance
numberOfRepayments
Number of installments to repay.
+ Used like: numberOfRepayments Every repaymentEvery repaymentFrequencyType
+ e.g. 10 (repayments) Every 12 Weeks
interestRatePerPeriod
Interest Rate.
+ Used like: interestRatePerPeriod% interestRateFrequencyType - interestType
+ e.g. 12.0000% Per year - Declining Balance
repaymentEvery
Used like: numberOfRepayments Every repaymentEvery repaymentFrequencyType
+ e.g. 10 (repayments) Every 12 Weeks
Each of the items below has an id, code and (english) value.
+ Only the id (integer) is used when updating. All 3 are returned on GET (read) requests.
+ The options are fully listed in Retrieve Loan Product Details Template. +
repaymentFrequencyType
Used like: numberOfRepayments Every repaymentEvery repaymentFrequencyType
+ e.g. 10 (repayments) Every 12 Weeks +
Example Values: Days, Weeks, Months +
interestRateFrequencyType
Used like: interestRatePerPeriod% interestRateFrequencyType - interestType
+ e.g. 12.0000% Per year - Declining Balance +
Example Values: Per month, Per year
amortizationType
+ Example Values: Equal principle payments, Equal installments
interestType
Used like: interestRatePerPeriod% interestRateFrequencyType - interestType
+ e.g. 12.0000% Per year - Declining Balance +
Example Values: Declining Balance, Flat
interestCalculationPeriodType
+ Example Values: Same as repayment period, Daily
+
+
+ + +  +
+
+

Retrieve Loan Details Template

+

This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of: +

    +
  • Field Defaults
  • +
  • Allowed Value Lists
  • +
+

+
Arguments
+
+
clientId
+
Integer mandatory
+
productId
+
Integer optional
+
If entered, productId, productName and selectedProduct fields are returned.
+
+

Example Requests:

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/loans/template?clientId=1&productId=1&pretty=true +

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/loans/template?clientId=1&pretty=true +
+
+ GET https://thedomainname/api/v1/loans/template +{ + "clientId" : 1, + "clientName" : "Patrick O'Meara", + "productId" : 1, + "productName" : "Agricultural Loan", + "selectedProduct" : { + "id" : 1, + "name" : "Agricultural Loan", + "description" : "An agricultural loan given to farmers to help buy crop, stock and machinery. With an arrears tolerance setting of 1,000 CFA, loans are not marked as 'in arrears' or 'in bad standing' if the amount outstanding is less than this. Interest rate is described using monthly percentage rate (MPR) even though the loan typically lasts a year and requires one repayment (typically at time when farmer sells crop)", + "principal" : { + "currencyCode" : "XOF", + "digitsAfterDecimal" : 0, + "amount" : 100000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "100000 CFA" + }, + "inArrearsTolerance" : { + "currencyCode" : "XOF", + "digitsAfterDecimal" : 0, + "amount" : 1000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "1000 CFA" + }, + "numberOfRepayments" : 1, + "repaymentEvery" : 12, + "interestRatePerPeriod" : 1.750000, + "annualInterestRate" : 21.000000, + "repaymentFrequencyType" : { + "id" : 2, + "code" : "repaymentFrequency.periodFrequencyType.months", + "value" : "Months" + }, + "interestRateFrequencyType" : { + "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", + "value" : "Per month" + }, + "amortizationType" : { + "id" : 1, + "code" : "amortizationType.equal.installments", + "value" : "Equal installments" + }, + "interestType" : { + "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" + }, + "interestCalculationPeriodType" : { + "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", + "value" : "Same as repayment period" + }, + "createdOn" : 1334232874000, + "lastModifedOn" : 1334232874000, + "currencyOptions" : [ { + "code" : "KES", + "name" : "Kenyan Shilling", + "decimalPlaces" : 2, + "displaySymbol" : "KSh", + "nameCode" : "currency.KES", + "displayLabel" : "Kenyan Shilling (KSh)" + }, { + "code" : "BND", + "name" : "Brunei Dollar", + "decimalPlaces" : 2, + "displaySymbol" : "BND", + "nameCode" : "currency.BND", + "displayLabel" : "Brunei Dollar (BND)" + }, { + "code" : "LBP", + "name" : "Lebanese Pound", + "decimalPlaces" : 2, + "displaySymbol" : "L£", + "nameCode" : "currency.LBP", + "displayLabel" : "Lebanese Pound (L£)" + }, { + "code" : "GHC", + "name" : "Ghana Cedi", + "decimalPlaces" : 2, + "displaySymbol" : "GHC", + "nameCode" : "currency.GHC", + "displayLabel" : "Ghana Cedi (GHC)" + }, { + "code" : "USD", + "name" : "US Dollar", + "decimalPlaces" : 2, + "displaySymbol" : "$", + "nameCode" : "currency.USD", + "displayLabel" : "US Dollar ($)" + }, { + "code" : "XOF", + "name" : "CFA Franc BCEAO", + "decimalPlaces" : 0, + "displaySymbol" : "CFA", + "nameCode" : "currency.XOF", + "displayLabel" : "CFA Franc BCEAO (CFA)" + } ], + "amortizationTypeOptions" : [ { + "id" : 1, + "code" : "amortizationType.equal.installments", + "value" : "Equal installments" + }, { + "id" : 0, + "code" : "amortizationType.equal.principal", + "value" : "Equal principle payments" + } ], + "interestTypeOptions" : [ { + "id" : 1, + "code" : "interestType.flat", + "value" : "Flat" + }, { + "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" + } ], + "interestCalculationPeriodTypeOptions" : [ { + "id" : 0, + "code" : "interestCalculationPeriodType.daily", + "value" : "Daily" + }, { + "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", + "value" : "Same as repayment period" + } ], + "repaymentFrequencyTypeOptions" : [ { + "id" : 0, + "code" : "repaymentFrequency.periodFrequencyType.days", + "value" : "Days" + }, { + "id" : 1, + "code" : "repaymentFrequency.periodFrequencyType.weeks", + "value" : "Weeks" + }, { + "id" : 2, + "code" : "repaymentFrequency.periodFrequencyType.months", + "value" : "Months" + } ], + "interestRateFrequencyTypeOptions" : [ { + "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", + "value" : "Per month" + }, { + "id" : 3, + "code" : "interestRateFrequency.periodFrequencyType.years", + "value" : "Per year" + } ] + }, + "expectedDisbursementDate" : [ 2012, 6, 1 ], + "repaymentSchedule" : null, + "allowedProducts" : [ { + "id" : 1, + "name" : "Agricultural Loan" + }, { + "id" : 2, + "name" : "Brunei Loan" + }, { + "id" : 3, + "name" : "IL Loan" + }, { + "id" : 4, + "name" : "IBL Mabeshte" + }, { + "id" : 5, + "name" : "Salary Loan" + }, { + "id" : 6, + "name" : "daily-declining-balance" + } ] +} + +
+
+ +  +
+ +
+ GET https://thedomainname/api/v1/loans/{loanId} + { + "open" : false, + "openWithRepaymentMade" : false, + "closed" : true, + "interestRebateOutstanding" : false, + "pendingApproval" : false, + "waitingForDisbursal" : false, + "lifeCycleStatusText" : "Closed", + "lifeCycleStatusDate" : [ 2009, 11, 13 ], + "id" : 1, + "externalId" : null, + "loanProductName" : "Agricultural Loan", + "submittedOnDate" : [ 2009, 1, 5 ], + "approvedOnDate" : [ 2009, 1, 8 ], + "expectedDisbursementDate" : [ 2009, 1, 15 ], + "actualDisbursementDate" : [ 2009, 1, 15 ], + "undoDisbursalAllowed" : false, + "expectedFirstRepaymentOnDate" : null, + "interestCalculatedFromDate" : null, + "closedOnDate" : [ 2009, 11, 13 ], + "expectedMaturityDate" : [ 2009, 11, 15 ], + "principal" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 100000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "100000 CFA" + }, + "interestRatePerYear" : 21.0, + "interestRatePerPeriod" : 1.75, + "interestPeriodFrequencyType" : 2, + "interestPeriodFrequencyText" : "MONTHS", + "interestMethodType" : 0, + "interestMethodText" : "DECLINING_BALANCE", + "amortizationMethodValue" : 1, + "amortizationMethodText" : "EQUAL_INSTALLMENTS", + "numberOfRepayments" : 1, + "repaymentFrequencyNumber" : 10, + "repaymentFrequencyTypeEnumOrdinal" : 2, + "repaymentFrequencyTypeText" : "MONTHS", + "interestRebateOwed" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 0, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0 CFA" + }, + "loanData" : { + "repaymentSchedule" : { + "periods" : [ { + "period" : 1, + "date" : [ 2009, 11, 15 ], + "disbursed" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 0, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0 CFA" + }, + "principal" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 100000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "100000 CFA" + }, + "principalPaid" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 100000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "100000 CFA" + }, + "principalOutstanding" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 0, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0 CFA" + }, + "interest" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 17500, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "17500 CFA" + }, + "interestPaid" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 17500, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "17500 CFA" + }, + "interestOutstanding" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 0, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0 CFA" + }, + "total" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 117500, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "117500 CFA" + }, + "totalPaid" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 117500, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "117500 CFA" + }, + "totalOutstanding" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 0, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0 CFA" + }, + "totalWaived" : null, + "totalArrears" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 0, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0 CFA" + }, + "arrearsFrom" : null, + "arrearsTo" : null, + "paidInFullOn" : [ 2009, 11, 13 ], + "lastAffectingPaymentOn" : [ 2009, 11, 13 ], + "fullyPaid" : true + } ] + }, + "summary" : { + "originalPrincipal" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 100000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "100000 CFA" + }, + "originalInterest" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 17500, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "17500 CFA" + }, + "originalTotal" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 117500, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "117500 CFA" + }, + "principalPaid" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 100000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "100000 CFA" + }, + "principalOutstanding" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 0, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0 CFA" + }, + "interestPaid" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 17500, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "17500 CFA" + }, + "interestOutstanding" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 0, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0 CFA" + }, + "totalPaid" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 117500, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "117500 CFA" + }, + "totalOutstanding" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 0, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0 CFA" + }, + "totalInArrears" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 0, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0 CFA" + }, + "totalWaived" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 0, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0 CFA" + } + }, + "loanRepayments" : [ { + "id" : 2, + "date" : [ 2009, 11, 13 ], + "principal" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 100000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "100000 CFA" + }, + "interest" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 17500, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "17500 CFA" + }, + "total" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 117500, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "117500 CFA" + }, + "totalWaived" : null, + "overpaid" : null, + "transactionOffsetFromToday" : -929 + } ] + }, + "arrearsTolerance" : { + "currencyCode" : "XOF", + "currencyDigitsAfterDecimal" : 0, + "amount" : 1000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "1000 CFA" + }, + "waiveAllowed" : false, + "makeRepaymentAllowed" : false, + "rejectAllowed" : false, + "withdrawnByApplicantAllowed" : false, + "undoApprovalAllowed" : false, + "disbursalAllowed" : false, + "anyActionOnLoanAllowed" : false, + "maxSubmittedOnOffsetFromToday" : -1241, + "maxApprovedOnOffsetFromToday" : -1238, + "maxDisbursedOnOffsetFromToday" : -1231, + "actualLoanTermInDays" : 302, + "actualLoanTermInMonths" : 9, + "loanTermInDays" : 304, + "loanTermInMonths" : 10 +} + +
+
+ +  +
+
+

Create a New Loan/Submit a Loan Application

+
Arguments
+
+
command
+
String Optional, case-insensitive
+
The default action is to Submit a New Loan Application ("Submitted and awaiting approval" status).
+
If "?command=calculateLoanSchedule" is added to the URL then no update is made but the loan schedule (as would have been if the loan + had been submitted) is returned. This gives the ability to try out various loan options and 'preview' the schedule before committing + to it.
+
+
+ + + +
Mandatory Fields
clientId, productId, inArrearsTolerance, submittedOnDate, currencyCode, digitsAfterDecimal, principal, + repaymentFrequencyType, repaymentEvery, numberOfRepayments, interestRatePerPeriod, interestRateFrequencyType, amortizationType, + interestType, interestCalculationPeriodType, expectedDisbursementDate
+
+
+ POST https://thedomainname/api/v1/loans + POST https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/loans +Content-Type: application/json +Request Body: +{ + "clientId": 1, + "productId": 1, + "currencyCode": "USD", + "digitsAfterDecimal": "2", + "locale": "en_GB", + "principal": "100,000.00", + "inArrearsTolerance": "1,000.00", + "repaymentFrequencyType": 2, + "repaymentEvery": "1", + "numberOfRepayments": "12", + "interestRatePerPeriod": "1.75", + "interestRateFrequencyType": 2, + "amortizationType": 1, + "interestCalculationPeriodType": 1, + "interestType": 0, + "dateFormat": "dd MMMM yyyy", + "expectedDisbursementDate": "01 July 2007", + "submittedOnDate": "25 June 2007" +} + + { + "entityId": 42 +} + +
+
+ +   +
+
+

Approve, Undo Approval, Disburse, Undo Disbursal, Reject a Loan or Withdraw a Loan Application

+
Arguments
+
+
command
+
String Mandatory, case-insensitive
+
'approve' : Approve Loan
+
'disburse' : Disburse Loan
+
'reject' : Reject Loan
+
'withdrewbyclient' : Client Withdrew Loan Application
+
'undoapproval' : Undo Loan Approval
+
'undodisbursal' : Undo Loan Disbursal
+
+
+ + + +
Mandatory Fields
eventDate
+
+
+ POST https://thedomainname/api/v1/loans/{loanId} + POST https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/loans/1?command=approve +Content-Type: application/json +Request Body: +{ + "dateFormat": "dd MMMM yyyy", + "eventDate": "07 May 2012", + "note": "and event note is added" +} + { +"entityId": 37 +} + +
+
+   +
+
+

Delete a Loan

+

+ Note: Only loans in "Submitted and awaiting approval" status can be deleted. +

+
+
+ DELETE https://thedomainname/api/v1/loans/{loanId} + DELETE https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/loans/1 +Content-Type: application/json +No Request Body: + + { +"entityId": 1 +} + +
+
+ +   +
+
+

Retrieve Loan Repayment/Loan Waiver Template

+

This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of: +

    +
  • Field Defaults
  • +
  • Allowed Value Lists
  • +
+

+
Arguments
+
+
command
+
String mandatory, case-insensitive
+
'repayment'
+ "date" is set to the date of the first outstanding installment.
+ "total" "amount" is set to the amount outstanding.
+
'waiver'
+ "date" is set to the current date.
+ "total" "amount" is set to the remaining loan principal outstanding.
+
+

Example Request:

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/loans/10/transactions/template?command=repayment&pretty=true +
+
+ GET https://thedomainname/api/v1/loans/{loanId}/transactions/template" + { + "date" : [ 2009, 8, 1 ], + "total" : { + "currencyCode" : "XOF", + "digitsAfterDecimal" : 0, + "amount" : 471, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "471 CFA" + } +} + +
+
+   +
+
+

Make a Repayment / Loan Waiver

+
+
command
+
String Optional, case-insensitive
+
'repayment' : Make Loan Repayment.
+
'waiver' : Loan Waiver.
+
+
+
+ POST https://thedomainname/api/v1/loans/{loanId}/transactions + POST https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/loans/37/transactions?command=repayment +Content-Type: application/json +Request Body: +{ + "locale": "en_GB", + "dateFormat": "dd MMMM yyyy", + "transactionDate": "14 May 2012", + "transactionAmount": "559.88", + "note": "Repayment at branch" +} + + { +"entityId": 37 +} + +
+
+ +   +
+ +
+ GET https://thedomainname/api/v1/loans/{loanId}/transactions/{transactionId} + { + "id" : 10, + "date" : [ 2009, 1, 29 ], + "principal" : null, + "interest" : null, + "total" : { + "currencyCode" : "XOF", + "digitsAfterDecimal" : 0, + "amount" : 300000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "300000 CFA" + }, + "totalWaived" : null, + "overpaid" : null, + "transactionOffsetFromToday" : -1218 +} + +
+
+   +
+
+

Adjust a Repayment or Waiver

+

Note: there is no need to specify command={transactionType} parameter.

+ + + +
Mandatory Fields
transactionDate, transactionAmount
+
+
+ POST https://thedomainname/api/v1/loans/{loanId}/transactions/{transactionId} + POST https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/loans/16/transactions/32 +Content-Type: application/json +Request Body: +{ + "locale": "en_GB", + "dateFormat": "dd MMMM yyyy", + "transactionDate": "25 May 2012", + "transactionAmount": "50,000.00", + "note": "adj note" +} + + { + "entityId": 16 +} + +
+
+ + + +   +
+
+

Offices

+

Offices are used to model an MFIs structure. A hierarchial representation of offices is supported. + There will always be at least one office (which represents the MFI or an MFIs head office). + All subsequent offices added must have a parent office.

+ + + + + + + + +
Field Descriptions
externalId
A place to put an external reference for this office e.g. The ID another system uses for it.
hierarchy
This field is a system generated convenience field. It can't be set.
+ It uses "dot notation" to define where an office stands in the office hierarchy.
+ For example, the system default office (id = 1) has a hierarchy value of '.'
+ An office (id = 12) placed directly underneath this default office has a hierarchy value of '.12.'
+ And if a further office (id = 78) is placed directly under office (id = 12) its hierarchy value is '.12.78.'

+ The hierarchy value is useful when you need to display offices in 'hierarchy' order (perhaps indented in a drop down list box). +
+
+
+ +   +
+ +
+ GET https://thedomainname/api/v1/offices +[ { + "id" : 1, + "name" : "Demo MFI Head Office", + "externalId" : "1", + "openingDate" : [ 2009, 1, 1 ], + "hierarchy" : ".", + "parentName" : null, + "parentId" : null +}, { + "id" : 2, + "name" : "B1", + "externalId" : null, + "openingDate" : [ 2012, 4, 1 ], + "hierarchy" : ".2.", + "parentName" : "Demo MFI Head Office", + "parentId" : 1 +}, { + "id" : 3, + "name" : "B2", + "externalId" : null, + "openingDate" : [ 2012, 4, 4 ], + "hierarchy" : ".3.", + "parentName" : "Demo MFI Head Office", + "parentId" : 1 +} ] + +
+
+ +   +
+
+

Retrieve Office Details Template

+

This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of: +

    +
  • Field Defaults
  • +
  • Allowed Value Lists
  • +
+

+

Example Request:

+ + https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/offices/template?pretty=true + +
+
+ GET https://thedomainname/api/v1/offices/template +{ + "openingDate" : [ 2012, 5, 28 ], + "allowedParents" : [ { + "id" : 1, + "name" : "Demo MFI Head Office" + }, { + "id" : 2, + "name" : "B1" + }, { + "id" : 3, + "name" : "B2" + } ] +} + +
+
+ +   +
+ +
+ GET https://thedomainname/api/v1/offices/1 +{ + "id" : 1, + "name" : "Demo MFI Head Office", + "externalId" : "1", + "openingDate" : [ 2009, 1, 1 ], + "hierarchy" : ".", + "parentName" : null, + "parentId" : null +} + +
+
+ +   +
+
+

Create an Office

+ + + +
Mandatory Fields
name, openingDate, parentId
+
+
+ POST https://thedomainname/api/v1/offices +POST https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/offices +Content-Type: application/json +Request Body: +{ + "name": "Example New Branch", + "dateFormat": "dd MMMM yyyy", + "openingDate": "01 July 2007", + "parentId": 2, + "externalId": "SYS54-88" +} + +{ + "entityId": 9 +} + +
+
+ +   +
+
+

Update Office

+
+
+ PUT https://thedomainname/api/v1/offices/{officeId} +PUT https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/offices/1 +Content-Type: application/json +Request Body: +{ + "name": "Name is updated" +} + +{ + "entityId": 1 +} + +
+
+ + + + + +   +
+
+

Loan Products

+

A Loan product is a template that is used when creating a loan. Much of the template definition can be overridden during loan creation. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Descriptions
digitsAfterDecimal
Override the default value for digitsAfterDecimal associated with the currencyCode selected.
principal
Loan amount.
inArrearsTolerance
numberOfRepayments
Number of installments to repay.
+ Used like: numberOfRepayments Every repaymentEvery repaymentFrequencyType
+ e.g. 10 (repayments) Every 12 Weeks
interestRatePerPeriod
Interest Rate.
+ Used like: interestRatePerPeriod% interestRateFrequencyType - interestType
+ e.g. 12.0000% Per year - Declining Balance
repaymentEvery
Used like: numberOfRepayments Every repaymentEvery repaymentFrequencyType
+ e.g. 10 (repayments) Every 12 Weeks
Each of the items below has an id, code and (english) value.
+ Only the id (integer) is used when updating. All 3 are returned on GET (read) requests.
+ The options are fully listed in Retrieve Loan Product Details Template. +
repaymentFrequencyType
Used like: numberOfRepayments Every repaymentEvery repaymentFrequencyType
+ e.g. 10 (repayments) Every 12 Weeks +
Example Values: Days, Weeks, Months +
interestRateFrequencyType
Used like: interestRatePerPeriod% interestRateFrequencyType - interestType
+ e.g. 12.0000% Per year - Declining Balance +
Example Values: Per month, Per year
amortizationType
+ Example Values: Equal principle payments, Equal installments
interestType
Used like: interestRatePerPeriod% interestRateFrequencyType - interestType
+ e.g. 12.0000% Per year - Declining Balance +
Example Values: Declining Balance, Flat
interestCalculationPeriodType
+ Example Values: Same as repayment period, Daily
+
+
+ +   +
+ +
+ GET https://thedomainname/api/v1/loanproducts + [ { + "id" : 1, + "name" : "Agricultural Loan", + "description" : "An agricultural loan given to farmers to help buy crop, stock and machinery. With an arrears tolerance setting of 1,000 CFA, loans are not marked as 'in arrears' or 'in bad standing' if the amount outstanding is less than this. Interest rate is described using monthly percentage rate (MPR) even though the loan typically lasts a year and requires one repayment (typically at time when farmer sells crop)", + "principal" : { + "currencyCode" : "XOF", + "digitsAfterDecimal" : 0, + "amount" : 100000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "100000 CFA" + }, + "inArrearsTolerance" : { + "currencyCode" : "XOF", + "digitsAfterDecimal" : 0, + "amount" : 1000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "1000 CFA" + }, + "numberOfRepayments" : 1, + "repaymentEvery" : 12, + "interestRatePerPeriod" : 1.750000, + "annualInterestRate" : 21.000000, + "repaymentFrequencyType" : { + "id" : 2, + "code" : "repaymentFrequency.periodFrequencyType.months", + "value" : "Months" + }, + "interestRateFrequencyType" : { + "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", + "value" : "Per month" + }, + "amortizationType" : { + "id" : 1, + "code" : "amortizationType.equal.installments", + "value" : "Equal installments" + }, + "interestType" : { + "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" + }, + "interestCalculationPeriodType" : { + "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", + "value" : "Same as repayment period" + }, + "createdOn" : 1334232874000, + "lastModifedOn" : 1334232874000 +}, { + "id" : 2, + "name" : "Brunei Loan", + "description" : null, + "principal" : { + "currencyCode" : "BND", + "digitsAfterDecimal" : 2, + "amount" : 76000.00, + "defaultName" : "Brunei Dollar", + "nameCode" : "currency.BND", + "displaySymbol" : "BND", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "76000.00 BND" + }, + "inArrearsTolerance" : { + "currencyCode" : "BND", + "digitsAfterDecimal" : 2, + "amount" : 50.00, + "defaultName" : "Brunei Dollar", + "nameCode" : "currency.BND", + "displaySymbol" : "BND", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "50.00 BND" + }, + "numberOfRepayments" : 10, + "repaymentEvery" : 1, + "interestRatePerPeriod" : 6.000000, + "annualInterestRate" : 72.000000, + "repaymentFrequencyType" : { + "id" : 1, + "code" : "repaymentFrequency.periodFrequencyType.weeks", + "value" : "Weeks" + }, + "interestRateFrequencyType" : { + "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", + "value" : "Per month" + }, + "amortizationType" : { + "id" : 1, + "code" : "amortizationType.equal.installments", + "value" : "Equal installments" + }, + "interestType" : { + "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" + }, + "interestCalculationPeriodType" : { + "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", + "value" : "Same as repayment period" + }, + "createdOn" : 1334513601000, + "lastModifedOn" : 1334513601000 +}...] + +
+
+ +   +
+
+

Retrieve Loan Product Details Template

+

This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of: +

    +
  • Field Defaults
  • +
  • Allowed Value Lists
  • +
+

+

Example Request:

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/loanproducts/template?pretty=true +
+
+ GET https://thedomainname/api/v1/loanproducts/template +{ + "principal" : { + "currencyCode" : "KES", + "digitsAfterDecimal" : 2, + "amount" : 0.00, + "defaultName" : "Kenyan Shilling", + "nameCode" : "currency.KES", + "displaySymbol" : "KSh", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0.00 KSh" + }, + "inArrearsTolerance" : { + "currencyCode" : "KES", + "digitsAfterDecimal" : 2, + "amount" : 0.00, + "defaultName" : "Kenyan Shilling", + "nameCode" : "currency.KES", + "displaySymbol" : "KSh", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0.00 KSh" + }, + "interestRatePerPeriod" : 0, + "annualInterestRate" : 0, + "repaymentFrequencyType" : { + "id" : 2, + "code" : "repaymentFrequency.periodFrequencyType.months", + "value" : "Months" + }, + "interestRateFrequencyType" : { + "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", + "value" : "Per month" + }, + "amortizationType" : { + "id" : 1, + "code" : "amortizationType.equal.installments", + "value" : "Equal installments" + }, + "interestType" : { + "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" + }, + "interestCalculationPeriodType" : { + "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", + "value" : "Same as repayment period" + }, + "currencyOptions" : [ { + "code" : "KES", + "name" : "Kenyan Shilling", + "decimalPlaces" : 2, + "displaySymbol" : "KSh", + "nameCode" : "currency.KES", + "displayLabel" : "Kenyan Shilling (KSh)" + }, { + "code" : "BND", + "name" : "Brunei Dollar", + "decimalPlaces" : 2, + "displaySymbol" : "BND", + "nameCode" : "currency.BND", + "displayLabel" : "Brunei Dollar (BND)" + }, { + "code" : "LBP", + "name" : "Lebanese Pound", + "decimalPlaces" : 2, + "displaySymbol" : "L£", + "nameCode" : "currency.LBP", + "displayLabel" : "Lebanese Pound (L£)" + }, { + "code" : "GHC", + "name" : "Ghana Cedi", + "decimalPlaces" : 2, + "displaySymbol" : "GHC", + "nameCode" : "currency.GHC", + "displayLabel" : "Ghana Cedi (GHC)" + }, { + "code" : "USD", + "name" : "US Dollar", + "decimalPlaces" : 2, + "displaySymbol" : "$", + "nameCode" : "currency.USD", + "displayLabel" : "US Dollar ($)" + }, { + "code" : "XOF", + "name" : "CFA Franc BCEAO", + "decimalPlaces" : 0, + "displaySymbol" : "CFA", + "nameCode" : "currency.XOF", + "displayLabel" : "CFA Franc BCEAO (CFA)" + } ], + "amortizationTypeOptions" : [ { + "id" : 1, + "code" : "amortizationType.equal.installments", + "value" : "Equal installments" + }, { + "id" : 0, + "code" : "amortizationType.equal.principal", + "value" : "Equal principle payments" + } ], + "interestTypeOptions" : [ { + "id" : 1, + "code" : "interestType.flat", + "value" : "Flat" + }, { + "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" + } ], + "interestCalculationPeriodTypeOptions" : [ { + "id" : 0, + "code" : "interestCalculationPeriodType.daily", + "value" : "Daily" + }, { + "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", + "value" : "Same as repayment period" + } ], + "repaymentFrequencyTypeOptions" : [ { + "id" : 0, + "code" : "repaymentFrequency.periodFrequencyType.days", + "value" : "Days" + }, { + "id" : 1, + "code" : "repaymentFrequency.periodFrequencyType.weeks", + "value" : "Weeks" + }, { + "id" : 2, + "code" : "repaymentFrequency.periodFrequencyType.months", + "value" : "Months" + } ], + "interestRateFrequencyTypeOptions" : [ { + "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", + "value" : "Per month" + }, { + "id" : 3, + "code" : "interestRateFrequency.periodFrequencyType.years", + "value" : "Per year" + } ] +} + +
+
+ +   +
+ +
+ GET https://thedomainname/api/v1/loanproducts/{productId} +{ + "id" : 1, + "name" : "Agricultural Loan", + "description" : "An agricultural loan given to farmers to help buy crop, stock and machinery. With an arrears tolerance setting of 1,000 CFA, loans are not marked as 'in arrears' or 'in bad standing' if the amount outstanding is less than this. Interest rate is described using monthly percentage rate (MPR) even though the loan typically lasts a year and requires one repayment (typically at time when farmer sells crop)", + "principal" : { + "currencyCode" : "XOF", + "digitsAfterDecimal" : 0, + "amount" : 100000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "100000 CFA" + }, + "inArrearsTolerance" : { + "currencyCode" : "XOF", + "digitsAfterDecimal" : 0, + "amount" : 1000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "1000 CFA" + }, + "numberOfRepayments" : 1, + "repaymentEvery" : 12, + "interestRatePerPeriod" : 1.750000, + "annualInterestRate" : 21.000000, + "repaymentFrequencyType" : { + "id" : 2, + "code" : "repaymentFrequency.periodFrequencyType.months", + "value" : "Months" + }, + "interestRateFrequencyType" : { + "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", + "value" : "Per month" + }, + "amortizationType" : { + "id" : 1, + "code" : "amortizationType.equal.installments", + "value" : "Equal installments" + }, + "interestType" : { + "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" + }, + "interestCalculationPeriodType" : { + "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", + "value" : "Same as repayment period" + }, + "createdOn" : 1334232874000, + "lastModifedOn" : 1334232874000 +} + +
+
+ +   +
+
+

Create a Loan Product

+ + + +
Mandatory Fields
name, currencyCode, digitsAfterDecimal, principal, inArrearsTolerance, repaymentFrequencyType, repaymentEvery, + numberOfRepayments, interestRatePerPeriod, interestRateFrequencyType, amortizationType, + interestType, interestCalculationPeriodType
+
+
+ POST https://thedomainname/api/v1/loanproducts +POST https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/loanproducts +Content-Type: application/json +Request Body: +{ + "name": "A new loan product for me", + "description": "A description not exceeding 500 characters.", + "currencyCode": "USD", + "digitsAfterDecimal": "2", + "locale": "en_GB", + "principal": "100,000.00", + "inArrearsTolerance": "1,000.00", + "repaymentFrequencyType": 2, + "repaymentEvery": "1", + "numberOfRepayments": "12", + "interestRatePerPeriod": "1.75", + "interestRateFrequencyType": 2, + "amortizationType": 1, + "interestType": 0, + "interestCalculationPeriodType": 1 +} + +{ + "entityId": 9 +} + +
+
+ +   +
+
+

Update a Loan Product

+
+
+ POST https://thedomainname/api/v1/loanproducts/{loanId} +POST https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/loanproducts/1 +Content-Type: application/json +Request Body: +{ + "locale": "en_GB", + "principal": "100,000.00", + "inArrearsTolerance": "5,000.00" +} + +{ + "entityId": 1 +} + +
+
+ + + +   +
+
+

Configuration

+

Application related configuration. For example, selecting the currencies permitted for use within the MFI.

+
+
+ +   +
+
+

Retrieve Currency Configuration

+

Returns the list of currencies permitted for use AND the list of currencies not selected (but available for selection).

+

Example Requests:

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/configurations/currency?pretty=true +

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/configurations/currency?pretty=true&fields=selectedCurrencyOptions +
+
+ GET https://thedomainname/api/v1/configurations/currency +{ + "selectedCurrencyOptions" : [ { + "code" : "XOF", + "name" : "CFA Franc BCEAO", + "decimalPlaces" : 0, + "displaySymbol" : "CFA", + "nameCode" : "currency.XOF", + "displayLabel" : "CFA Franc BCEAO (CFA)" + }, { + "code" : "ETB", + "name" : "Ethiopian Birr", + "decimalPlaces" : 2, + "displaySymbol" : null, + "nameCode" : "currency.ETB", + "displayLabel" : "Ethiopian Birr [ETB]" + } ], + "currencyOptions" : [ { + "code" : "AED", + "name" : "UAE Dirham", + "decimalPlaces" : 2, + "displaySymbol" : null, + "nameCode" : "currency.AED", + "displayLabel" : "UAE Dirham [AED]" + }, { + "code" : "AFN", + "name" : "Afghanistan Afghani", + "decimalPlaces" : 2, + "displaySymbol" : null, + "nameCode" : "currency.AFN", + "displayLabel" : "Afghanistan Afghani [AFN]" + }, ... + ] +} + +
+
+ +   +
+
+

Update Currency Configuration

+

Updates the list of currencies permitted for use.

+
+
+ PUT https://thedomainname/api/v1/configurations/currency + PUT https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/configurations/currency +Content-Type: application/json +Request Body:{ +"currencies": ["KES", "BND", "LBP", "GHC", "USD", "XOF", "AED", "AMD"] +} + + { + "currencies": [ + "KES", + "BND", + "LBP", + "GHC", + "USD", + "XOF", + "AED", + "AMD" + ] +} + +
+
+ + +   +
+
+

Additional Fields

+

+ In Mifos X, any number of "Sets" of "Additional Fields" can be configured for a Mifos X database table ("Type"). +

+

For example, portfolio_client is the database table that holds client data. Typically, MFI's want more client related fields than is provided by Mifos X out-of-the-box. + The MFI might add a Set called "Additional Info" containing some fields that are typically input when creating a client. + They might then add another Set called "Highly Improbable Info" containing some fields that are only input in exceptional + circumstances. +

+

+ The additional fields resource allows you to retrieve and update any Additional Fields data that has been configured in Mifos X. +

+

+ The Mifos X Individual Lending client application uses a JQuery plugin called stretchydata which, itself, uses this + additional fields resource to provide a pretty flexible additional fields User Interface (UI). +

+
+
+ + +   +
+
+

List Additional Fields Sets

+

+ Lists the Sets of additional fields have been defined in Mifos X. +

+ +
Arguments
+
+
type
+
optional
+
The Additional Fields Type (Mifos X database table) to restrict the output to
+
+

Example Requests:

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/additionalfields?type=portfolio_client&pretty=true +

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/additionalfields?pretty=true +
+
+ GET https://thedomainname/api/v1/additionalfields + [ { + "id" : 1, + "name" : "Additional Information", + "type" : "portfolio_client" +}, { + "id" : 8, + "name" : "Additional Information", + "type" : "portfolio_loan" +}, { + "id" : 9, + "name" : "Highly Improbable Info", + "type" : "portfolio_client" +} ] + +
+
+ + +   +
+
+

Retrieve Additional Fields

+

+ Returns the Set of Additional Fields data for the ID provided. The ID is the id field of the Type table e.g. portfolio_client might have an id value of 4. The output is a JSON formatted "Generic Resultset". The Generic Resultset contains Column Heading as well as Data information. The Column Heading information may include allowed values (columnValues array). +

+

Example Request: + https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/additionalfields/portfolio_client/Additional Information/2?pretty=true +

+
+
+ GET https://thedomainname/api/v1/additionalfields/{type}/{set}/{id} + { + "columnHeaders" : [ { + "columnName" : "Ethnic Group", + "columnType" : "String", + "columnLength" : 50, + "columnDisplayType" : "List", + "columnValues" : [ "Bedouin", "Berber", "Italian", "Miknasa", "Mrazig", "Other", "Unknown" ] + }, { + "columnName" : "Ethnic Group Other", + "columnType" : "String", + "columnLength" : 50, + "columnDisplayType" : null, + "columnValues" : [ ] + }, { + "columnName" : "Household Location", + "columnType" : "String", + "columnLength" : 50, + "columnDisplayType" : "List", + "columnValues" : [ "East Sikkim", "North Sikkim", "South Sikkim", "West Sikkim", "Other" ] + }, { + "columnName" : "Household Location Other", + "columnType" : "String", + "columnLength" : 50, + "columnDisplayType" : null, + "columnValues" : [ ] + }, { + "columnName" : "Religion", + "columnType" : "String", + "columnLength" : 50, + "columnDisplayType" : "List", + "columnValues" : [ "Protestant", "Catholic", "Muslim", "Animist", "Atheist", "Other", "Unknown" ] + }, { + "columnName" : "Religion Other", + "columnType" : "String", + "columnLength" : 50, + "columnDisplayType" : null, + "columnValues" : [ ] + }, { + "columnName" : "Knowledge of Person", + "columnType" : "String", + "columnLength" : 50, + "columnDisplayType" : "List", + "columnValues" : [ "Staff member", "Spouse of staff member", "Son/daughter of staff member", "Friend of staff member", "Not known by any staff member", "Other" ] + }, { + "columnName" : "Gender", + "columnType" : "String", + "columnLength" : 10, + "columnDisplayType" : "List", + "columnValues" : [ "Female", "Male" ] + }, { + "columnName" : "Whois", + "columnType" : "Text", + "columnLength" : null, + "columnDisplayType" : null, + "columnValues" : [ ] + } ], + "data" : [ { + "row" : [ "Bedouin", null, "East Sikkim", null, "Animist", "Agnostic", "Friend of staff member", "Female", "A person of honesty & clear thought" ] + } ] +} + +
+
+   +
+
+

Update Additional Fields

+

+ Updates (or creates) the Set of Additional Fields data for the ID provided. The ID is the id field of the Type table e.g. portfolio_client might have an id value of 4. +

+
+
+ POST https://thedomainname/api/v1/additionalfields/{type}/{set}/{id} + POST https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/additionalfields/portfolio_client/Additional Information/2 +Content-Type: application/json +Request Body: +{ + "Ethnic_Group":"Berber", + "Ethnic_Group_Other":"", + "Household_Location":"East Sikkim", + "Household_Location_Other":"", + "Religion":"Animist", + "Religion_Other":"jjjjjjj", + "Knowledge_of_Person":"Son/daughter of staff member", + "Gender":"Female", + "Whois":"its\r\nme of\r\ncourse\r\nyes\r\nend and the end of it all" +} + + { + "entityId": 2 +} + +
+
+ + +   +
+
+

Reports

+

+ The reports resource allows you to run and receive output from pre-defined Mifos X reports. + The default output is a JSON formatted "Generic Resultset". + The Generic Resultset contains Column Heading as well as Data information. + However, you can export to CSV format by simply adding "&exportCSV=true" to the end of your URL. +

+

+ If Pentaho reports have been pre-defined, they can also be run through this resource. Pentaho reports can return HTML, PDF or CSV formats. +

+

+ The Mifos X Individual Lending client application uses a JQuery plugin called stretchyreporting which, itself, uses this reports resource to provide a pretty flexible reporting User Interface (UI). +

+
+
+ + + +   +
+
+

List Reports

+

+ Lists all reports and their parameters. If a report has more than one parameter it will be listed the same number of times as it has parameters. +

+ +
Arguments
+
+
exportCSV
+
optional, The only valid value is 'true'. If any other value is provided the argument will be ignored
+
Output will be delivered as a CSV file instead of JSON.
+
+

Example Requests:

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/reports?pretty=true +

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/reports?pretty=true&exportCSV=true +
+
+ GET https://thedomainname/api/v1/reports + { + "columnHeaders" : [ { + "columnName" : "report_id", + "columnType" : "INT", + "columnLength" : null, + "columnDisplayType" : null, + "columnValues" : [ ] + }, { + "columnName" : "report_name", + "columnType" : "VARCHAR", + "columnLength" : null, + "columnDisplayType" : null, + "columnValues" : [ ] + }, { + "columnName" : "report_type", + "columnType" : "VARCHAR", + "columnLength" : null, + "columnDisplayType" : null, + "columnValues" : [ ] + }, { + "columnName" : "report_subtype", + "columnType" : "VARCHAR", + "columnLength" : null, + "columnDisplayType" : null, + "columnValues" : [ ] + }, { + "columnName" : "report_category", + "columnType" : "VARCHAR", + "columnLength" : null, + "columnDisplayType" : null, + "columnValues" : [ ] + }, { + "columnName" : "parameter_id", + "columnType" : "INT", + "columnLength" : null, + "columnDisplayType" : null, + "columnValues" : [ ] + }, { + "columnName" : "report_parameter_name", + "columnType" : "VARCHAR", + "columnLength" : null, + "columnDisplayType" : null, + "columnValues" : [ ] + }, { + "columnName" : "parameter_name", + "columnType" : "VARCHAR", + "columnLength" : null, + "columnDisplayType" : null, + "columnValues" : [ ] + } ], + "data" : [ { + "row" : [ "29", "Client Listing", "Table", null, null, "5", null, "selectOfficeId" ] + }, { + "row" : [ "42", "Client Listing - Additional and Unlikely", "Table", null, null, "5", null, "selectOfficeId" ] + }, { + "row" : [ "30", "Client Loans Listing", "Table", null, null, "5", null, "selectOfficeId" ] + }, { + "row" : [ "43", "Client Loans Listing - Additional", "Table", null, null, "5", null, "selectOfficeId" ] + }, { + "row" : [ "41", "Clients by Surname (a bit silly)", "Chart", "Pie", null, "5", null, "selectOfficeId" ] + }, { + "row" : [ "39", "Loan Disbursals in Previous Year", "Chart", "Bar", null, "5", null, "selectOfficeId" ] + }, { + "row" : [ "39", "Loan Disbursals in Previous Year", "Chart", "Bar", null, "7", null, "currencyIdSelectOne" ] + }, { + "row" : [ "40", "Loan Repayments in Previous Year", "Chart", "Bar", null, "5", null, "selectOfficeId" ] + }, { + "row" : [ "40", "Loan Repayments in Previous Year", "Chart", "Bar", null, "7", null, "currencyIdSelectOne" ] + }, { + "row" : [ "34", "Loans - Active Loans Portfolio Status", "Table", null, null, "5", null, "selectOfficeId" ] + }, { + "row" : [ "34", "Loans - Active Loans Portfolio Status", "Table", null, null, "6", null, "currencyIdSelectAll" ] + }, { + "row" : [ "31", "Loans Awaiting Disbursal", "Table", null, null, "5", null, "selectOfficeId" ] + }, { + "row" : [ "35", "Portfolio at Risk", "Table", null, null, "5", null, "selectOfficeId" ] + }, { + "row" : [ "35", "Portfolio at Risk", "Table", null, null, "6", null, "currencyIdSelectAll" ] + }, { + "row" : [ "32", "Upcoming Repayments", "Table", null, null, "5", null, "selectOfficeId" ] + }, { + "row" : [ "32", "Upcoming Repayments", "Table", null, null, "6", null, "currencyIdSelectAll" ] + }, { + "row" : [ "38", "Upcoming Repayments Summary By Month, Currency and Loan Risk", "Table", null, null, "5", null, "selectOfficeId" ] + }, { + "row" : [ "38", "Upcoming Repayments Summary By Month, Currency and Loan Risk", "Table", null, null, "6", null, "currencyIdSelectAll" ] + } ] +} + +
+
+ +   +
+
+

Running a Report

+

+ Runs a report and returns the report output. +

+

+ Note: Pentaho details yet to be provided +

+
Arguments
+
+
R_'parameter names' ...
+
optional, No defaults
+
The number and names of the parameters depend on the specific report and how it has been configured. R_officeId is an example parameter name.
+
Note: the prefix R_ stands for Reporting
+
parameterType
+
optional, The only valid value is 'true'. If any other value is provided the argument will be ignored
+
Determines whether the request looks in the list of reports or the list of parameters for its data.
+
exportCSV
+
optional, The only valid value is 'true'. If any other value is provided the argument will be ignored
+
Output will be delivered as a CSV file instead of JSON. Doesn't apply to Pentaho reports .
+
+

Example Requests:

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/reports/Client%20Listing?R_officeId=1&pretty=true +

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/reports/Client%20Listing?R_officeId=1&pretty=true&exportCSV=true +

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/reports/selectOfficeId?R_officeId=1&pretty=true& parameterType=true +

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/reports/selectOfficeId?R_officeId=1&pretty=true& parameterType=true&exportCSV=true +
+
+ GET https://thedomainname/api/v1/reports/{reportName} + { + "columnHeaders" : [ { + "columnName" : "Office/Branch", + "columnType" : "VARCHAR", + "columnLength" : null, + "columnDisplayType" : null, + "columnValues" : [ ] + }, { + "columnName" : "Name", + "columnType" : "VARCHAR", + "columnLength" : null, + "columnDisplayType" : null, + "columnValues" : [ ] + }, { + "columnName" : "Joining Date", + "columnType" : "DATE", + "columnLength" : null, + "columnDisplayType" : null, + "columnValues" : [ ] + } ], + "data" : [ { + "row" : [ "Demo MFI Head Office", "O'Meara, Patrick", "2009-01-04" ] + }, { + "row" : [ "Demo MFI Head Office", "O'Meara, Dennis", "2009-01-04" ] + }, { + "row" : [ "Demo MFI Head Office", "Smith, John", "2009-01-11" ] + }, { + "row" : [ "Demo MFI Head Office", "O'Meara, Jimmy", "2009-01-11" ] + }, { + "row" : [ "Demo MFI Head Office", "Sunnyville vegetable growers Ltd", "2009-01-24" ] + }, { + "row" : [ "Demo MFI Head Office", "Traoré, Kalilou", "2009-02-04" ] + }, { + "row" : [ "Demo MFI Head Office", "Koné, Sidi", "2009-02-11" ] + }, { + "row" : [ "Demo MFI Head Office", "Yattabaré, Moustapha", "2009-02-18" ] + }, { + "row" : [ "Demo MFI Head Office", "Mali fruit sales ltd.", "2009-02-18" ] + }, { + "row" : [ "Demo MFI Head Office", "Djenne co-op group", "2009-02-25" ] + }, { + "row" : [ "Demo MFI Head Office", "test, test", "2012-04-19" ] + }, { + "row" : [ "Demo MFI Head Office", "Ziffle, Fred", "2012-04-21" ] + }, { + "row" : [ "Demo MFI Head Office", "omara, safik", "2012-04-24" ] + }, { + "row" : [ "Demo MFI Head Office", "HF Test", "2012-04-24" ] + }, { + "row" : [ "Demo MFI Head Office", "HF Test 2", "2012-04-24" ] + }, { + "row" : [ "Demo MFI Head Office", "Kumar, Shiva", "2011-10-01" ] + }, { + "row" : [ "Demo MFI Head Office", "Yton, Petra", "2006-06-09" ] + }, { + "row" : [ "Demo MFI Head Office", "Yton, Petra", "2006-06-09" ] + }, { + "row" : [ "sub branch 1", "Lee, Jacques", "2012-04-03" ] + }, { + "row" : [ "sub branch 1", "Asare-Frimpong, Patrick", "2012-04-18" ] + }, { + "row" : [ "sub branch 2", "t, test", "2012-04-18" ] + }, { + "row" : [ "Majmoua", "client, firstMajmoua", "2011-12-01" ] + }, { + "row" : [ "Intrasoft Technologies", "Said, Zayyad", "2012-04-02" ] + }, { + "row" : [ "Hugo technologies", "typical individual lending client", "2010-06-02" ] + } ] +} + +
+
+ + +   +
+
+

Authentication

+

An API capability that allows client applications to verify authentication details.

+ + + + + +
Field Descriptions
base64EncodedAuthenticationKey
HTTP Basic Auth key. + See Authentication Overview for an example of its use.
+
+
+ +   +
+
+

Verify authentication

+

Authenticates the credentials provided and returns the set of permissions allowed.

+
+
+ POST https://thedomainname/api/v1/authentication?username={username}&password={password} +POST https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/authentication?username=super1&password=demo +Content-Type: application/json +No Request Body + +{ + "username": "super1", + "userId": 2, + "base64EncodedAuthenticationKey": "c3VwZXIxOmRlbW8=", + "authenticated": true, + "permissions": [ + "USER_ADMINISTRATION_SUPER_USER_ROLE", + "REPORTING_SUPER_USER_ROLE", + "PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE", + "ORGANISATION_ADMINISTRATION_SUPER_USER_ROLE" + ] +} + +
+
+ + +   +
+
+

Users

+

An API capability to support user administration.

+
+
+ +   +
+ +
+ GET https://thedomainname/api/v1/users +[ { + "id" : 6, + "officeId" : 1, + "officeName" : "change super user", + "username" : "committee1", + "firstname" : "Committee", + "lastname" : "Member", + "email" : "fake@email.com" +}, { + "id" : 5, + "officeId" : 1, + "officeName" : "change super user", + "username" : "dataentry1", + "firstname" : "Data Entry", + "lastname" : "User", + "email" : "fake@email.com" +}...] + +
+
+ +   +
+
+

Retrieve User Details Template

+

This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of: +

    +
  • Field Defaults
  • +
  • Allowed Value Lists
  • +
+

+

Example Request:

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/users/template?pretty=true +
+
+ GET https://thedomainname/api/v1/users/template +{ + "allowedOffices" : [ { + "id" : 1, + "name" : "Demo MFI Head Office" + }, { + "id" : 2, + "name" : "sub branch 1" + }, { + "id" : 8, + "name" : "moi aussi" + }, { + "id" : 3, + "name" : "sub branch 2" + }, { + "id" : 4, + "name" : "sub branch 3" + }], + "availableRoles" : [ { + "id" : 1, + "name" : "Super user", + "description" : "This role provides all application permissions.", + "availablePermissions" : [ ], + "selectedPermissions" : [ ] + }, { + "id" : 2, + "name" : "Field officer", + "description" : "A field officer role allows the user to add client and loans and view reports but nothing else.", + "availablePermissions" : [ ], + "selectedPermissions" : [ ] + }, { + "id" : 3, + "name" : "Data Entry (Portfolio only)", + "description" : "This role allows a user full permissions around client and loan functionality but nothing else.", + "availablePermissions" : [ ], + "selectedPermissions" : [ ] + }, { + "id" : 4, + "name" : "Credit Committe Member", + "description" : "This role allows a user to approve reject or withdraw loans (with reporting).", + "availablePermissions" : [ ], + "selectedPermissions" : [ ] + }, { + "id" : 5, + "name" : "Manager", + "description" : "This role allows a manager to do anything related to portfolio management and also view all reports.", + "availablePermissions" : [ ], + "selectedPermissions" : [ ] + } ] +} + +
+
+ +   +
+ +
+ GET https://thedomainname/api/v1/users/1 +{ + "id" : 1, + "officeId" : 1, + "officeName" : "Demo MFI Head Office", + "username" : "mifos", + "firstname" : "App", + "lastname" : "Administrator", + "email" : "demomfi@mifos.org", + "selectedRoles" : [ { + "id" : 1, + "name" : "Super user", + "description" : "This role provides all application permissions.", + "availablePermissions" : [ ], + "selectedPermissions" : [ { + "id" : 1, + "name" : "User administration ALL", + "description" : "An application user will have permission to execute all tasks related to user administration.", + "code" : "USER_ADMINISTRATION_SUPER_USER_ROLE" + }, { + "id" : 4, + "name" : "Reporting ALL", + "description" : "An application user will have permission to execute and view all reports.", + "code" : "REPORTING_SUPER_USER_ROLE" + }, { + "id" : 3, + "name" : "Portfolio management ALL", + "description" : "An application user will have permission to execute all tasks related to portfolio management.", + "code" : "PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE" + }, { + "id" : 2, + "name" : "Organisation adminsitration ALL", + "description" : "An application user will have permission to execute all tasks related to organisation administration.", + "code" : "ORGANISATION_ADMINISTRATION_SUPER_USER_ROLE" + } ] + } ] +} + +
+
+ + +   +
+
+

Create a User

+

Adds new application user.

+

Note: Password information is not required (or processed). Password details are auto-generated and then sent to the email account given + (which is why it can take a few seconds to complete). +

+ + + +
Mandatory Fields
username, firstname, lastname, email, officeId, roles
+
+
+ POST https://thedomainname/api/v1/users +POST https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/users +Content-Type: application/json +Request body: +{ + "username": "Another New User zll", + "firstname": "Test", + "lastname": "User", + "email": "whatever@mifos.org", + "officeId": 1, + "roles": [2,3] +} + + +{ + "entityId": 11 +} + +
+
+ +   +
+
+

Update a User

+

Note: When updating a password you must provide the repeatPassword parameter also.

+
+
+ PUT https://thedomainname/api/v1/users/{userId) +PUT https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/users/3 +Content-Type: application/json +Request body: +{ + "firstname": "Test", + "roles": [2], + "password": "window75", + "repeatPassword": "window75" +} + + + +{ + "entityId": 3 +} + +
+
+ +   +
+
+

Delete a User

+

Removes the user and the associated roles and permissions.

+
+
+ DELETE https://thedomainname/api/v1/users/{userId} +DELETE https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/users/20 +Content-Type: application/json +No Request Body + +{ + "entityId": 20 +} + +
+
+ + + + +   +
+
+

Roles

+

An API capability to support management of application roles for user administration.

+
+
+ +   +
+ +
+ GET https://thedomainname/api/v1/roles +[ { + "id" : 1, + "name" : "Super user", + "description" : "This role provides all application permissions." +}, { + "id" : 2, + "name" : "Field officer", + "description" : "A field officer role allows the user to add client and loans and view reports but nothing else." +}, { + "id" : 3, + "name" : "Data Entry (Portfolio only)", + "description" : "This role allows a user full permissions around client and loan functionality but nothing else." +}, { + "id" : 4, + "name" : "Credit Committe Member", + "description" : "This role allows a user to approve reject or withdraw loans (with reporting)." +}, { + "id" : 5, + "name" : "Manager", + "description" : "This role allows a manager to do anything related to portfolio management and also view all reports." +} ] + +
+
+ +   +
+
+

Retrieve Role Details Template

+

This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of: +

    +
  • Field Defaults
  • +
  • Allowed Value Lists
  • +
+

+

Example Request:

+ https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/roles/template?pretty=true +
+
+ GET https://thedomainname/api/v1/roles/template +{ + "availablePermissions" : [ { + "id" : 1, + "name" : "User administration ALL", + "description" : "An application user will have permission to execute all tasks related to user administration.", + "code" : "USER_ADMINISTRATION_SUPER_USER_ROLE" + }, { + "id" : 2, + "name" : "Organisation adminsitration ALL", + "description" : "An application user will have permission to execute all tasks related to organisation administration.", + "code" : "ORGANISATION_ADMINISTRATION_SUPER_USER_ROLE" + }, { + "id" : 3, + "name" : "Portfolio management ALL", + "description" : "An application user will have permission to execute all tasks related to portfolio management.", + "code" : "PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE" + }, { + "id" : 4, + "name" : "Reporting ALL", + "description" : "An application user will have permission to execute and view all reports.", + "code" : "REPORTING_SUPER_USER_ROLE" + }...] +} + +
+
+ +   +
+ +
+ GET https://thedomainname/api/v1/roles/{roleId} +{ + "id" : 1, + "name" : "Super user", + "description" : "This role provides all application permissions.", + "selectedPermissions" : [ { + "id" : 1, + "name" : "User administration ALL", + "description" : "An application user will have permission to execute all tasks related to user administration.", + "code" : "USER_ADMINISTRATION_SUPER_USER_ROLE" + }, { + "id" : 4, + "name" : "Reporting ALL", + "description" : "An application user will have permission to execute and view all reports.", + "code" : "REPORTING_SUPER_USER_ROLE" + }, { + "id" : 3, + "name" : "Portfolio management ALL", + "description" : "An application user will have permission to execute all tasks related to portfolio management.", + "code" : "PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE" + }, { + "id" : 2, + "name" : "Organisation adminsitration ALL", + "description" : "An application user will have permission to execute all tasks related to organisation administration.", + "code" : "ORGANISATION_ADMINISTRATION_SUPER_USER_ROLE" + } ] +} + +
+
+ +   +
+
+

Create a New Role

+ + + +
Mandatory Fields
name, description, permissions
+
+
+ POST https://thedomainname/api/v1/roles +POST https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/roles +Content-Type: application/json +Request body: +{ + "name": "Another Role Name", + "description": "A description outlining the purpose of this role in relation to the application.", + "permissions": [1, 2, 3] +} + +{ + "entityId": 8 +} + +
+
+ +   +
+
+

Update a Role

+
+
+ PUT https://thedomainname/api/v1/roles/{roleId} +PUT https://ec2-176-34-174-133.eu-west-1.compute.amazonaws.com:8443/mifosng-provider/api/v1/roles/8 +Content-Type: application/json +Request body: +{ + "name": "Updated Role Name", + "permissions": [1] +} + +{ + "entityId": 8 +} + +
+
+ + + +   +
+
+

Permissions

+

An API capability to support management of application permissions for user administration.

+
+
+ +   +
+ +
+ GET https://thedomainname/api/v1/permissions +[ { + "id" : 1, + "name" : "User administration ALL", + "description" : "An application user will have permission to execute all tasks related to user administration.", + "code" : "USER_ADMINISTRATION_SUPER_USER_ROLE" +}, { + "id" : 2, + "name" : "Organisation adminsitration ALL", + "description" : "An application user will have permission to execute all tasks related to organisation administration.", + "code" : "ORGANISATION_ADMINISTRATION_SUPER_USER_ROLE" +}, { + "id" : 3, + "name" : "Portfolio management ALL", + "description" : "An application user will have permission to execute all tasks related to portfolio management.", + "code" : "PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE" +}, { + "id" : 4, + "name" : "Reporting ALL", + "description" : "An application user will have permission to execute and view all reports.", + "code" : "REPORTING_SUPER_USER_ROLE" +}, ... ] + +
+
+ +
+ + +   +


+
+

Full API Matrix

API Endpoint:

https://thedomainname/api
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RESOURCES
POST
create/complex update
GET
read
PUT
update
DELETE
delete
CLIENT/v1/clientsCreate a ClientList Clients
/v1/clients/{clientId}Retrieve a ClientUpdate a Client
/v1/clients/{clientId}/loansRetrieve a Client's Loan Account Summary
/v1/clients/{clientId}/notesAdd a Client NoteRetrieve a Client's Notes
/v1/clients/{clientId}/notes/{noteId}Retrieve a Client NoteUpdate a Client Note
LOAN/v1/loansCreate a New Loan/Submit a Loan Application
/v1/loans/{loanId}Approve, Undo Approval, Disburse, Undo Disbursal, Reject a Loan or Withdraw a Loan ApplicationRetrieve a LoanDelete a Loan
/v1/loans/{loanId}/transactionsMake a Repayment / Loan Waiver
/v1/loans/{loanId}/transactions/{transactionId}Adjust a Repayment or WaiverRetrieve a Repayment or Waiver Details
OFFICE/v1/officesCreate an OfficeList Offices
/v1/offices/{officeId}Retrieve an OfficeUpdate an Office
LOAN PRODUCT/v1/loanproductsCreate a Loan ProductList Loan Products
/v1/loanproducts/{productId}Retrieve a Loan ProductUpdate a Loan Product
CONFIGURATION/v1/configurations/currencyRetrieve Currency ConfigurationUpdate Currency Configuration
ADDITIONAL FIELDS/v1/additionalfieldsList Additional Fields Sets
/v1/additionalfields/{Type}/{Set}/{id}Update Additional FieldsRetrieve Additional Fields
REPORT/v1/reportsList Reports
/v1/reports/{reportName}Run a Report
AUTHENTICATION/v1/authenticationVerify Authentication
USER/v1/usersCreate a UserList Users
/v1/users/{userId}Retrieve a UserUpdate a UserDelete a User
ROLE/v1/rolesCreate a New RoleList Roles
/v1/roles/{roleId}Retrieve a RoleUpdate a Role
PERMISSION/v1/permissionsList Application Permissions
+
+ + + + + + + + + +
CONVENIENCE RESOURCES
GET
read
/v1/clients/templateRetrieve Client Details Template
/v1/loans/templateRetrieve Loan Details Template
/v1/loans/{loanId}/transactions/templateRetrieve Loan Repayment/Loan Waiver Template
/v1/offices/templateRetrieve Office Details Template
/v1/loanproducts/templateRetrieve Loan Product Details Template
/v1/users/templateRetrieve User Details Template
/v1/roles/templateRetrieve Role Details Template
+
+
+ + + \ No newline at end of file diff --git a/APIFolder/demo - Copy.htm b/APIFolder/demo - Copy.htm new file mode 100644 index 000000000..243c19952 --- /dev/null +++ b/APIFolder/demo - Copy.htm @@ -0,0 +1,48 @@ + + + + + + Demo use of Mifos X platform + + + + + + +
+ + + + +
User Name:
Password:
+ +
+ + + + \ No newline at end of file diff --git a/APIFolder/demo.htm b/APIFolder/demo.htm new file mode 100644 index 000000000..243c19952 --- /dev/null +++ b/APIFolder/demo.htm @@ -0,0 +1,48 @@ + + + + + + Demo use of Mifos X platform + + + + + + +
+ + + + +
User Name:
Password:
+ +
+ + + + \ No newline at end of file diff --git a/APIFolder/jquery-1.7.min.js b/APIFolder/jquery-1.7.min.js new file mode 100644 index 000000000..3ca5e0f5d --- /dev/null +++ b/APIFolder/jquery-1.7.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7 jquery.com | jquery.org/license */ +(function(a,b){function cA(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cx(a){if(!cm[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cn||(cn=c.createElement("iframe"),cn.frameBorder=cn.width=cn.height=0),b.appendChild(cn);if(!co||!cn.createElement)co=(cn.contentWindow||cn.contentDocument).document,co.write((c.compatMode==="CSS1Compat"?"":"")+""),co.close();d=co.createElement(a),co.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cn)}cm[a]=e}return cm[a]}function cw(a,b){var c={};f.each(cs.concat.apply([],cs.slice(0,b)),function(){c[this]=a});return c}function cv(){ct=b}function cu(){setTimeout(cv,0);return ct=f.now()}function cl(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ck(){try{return new a.XMLHttpRequest}catch(b){}}function ce(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bB(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function br(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bi,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bq(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bp(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bp)}function bp(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bo(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bn(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bm(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(){return!0}function M(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.add(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return a!=null&&m.test(a)&&!isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,unknownElems:!!a.getElementsByTagName("nav").length,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",enctype:!!c.createElement("form").enctype,submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.lastChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-999px",top:"-999px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;f(function(){var a,b,d,e,g,h,i=1,j="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",l="visibility:hidden;border:0;",n="style='"+j+"border:5px solid #000;padding:0;'",p="
"+""+"
";m=c.getElementsByTagName("body")[0];!m||(a=c.createElement("div"),a.style.cssText=l+"width:0;height:0;position:static;top:0;margin-top:"+i+"px",m.insertBefore(a,m.firstChild),o=c.createElement("div"),o.style.cssText=j+l,o.innerHTML=p,a.appendChild(o),b=o.firstChild,d=b.firstChild,g=b.nextSibling.firstChild.firstChild,h={doesNotAddBorder:d.offsetTop!==5,doesAddBorderForTableAndCells:g.offsetTop===5},d.style.position="fixed",d.style.top="20px",h.fixedPosition=d.offsetTop===20||d.offsetTop===15,d.style.position=d.style.top="",b.style.overflow="hidden",b.style.position="relative",h.subtractsBorderForOverflowNotVisible=d.offsetTop===-5,h.doesNotIncludeMarginInBodyOffset=m.offsetTop!==i,m.removeChild(a),o=a=null,f.extend(k,h))}),o.innerHTML="",n.removeChild(o),o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[f.expando]:a[f.expando]&&f.expando,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[f.expando]=n=++f.uuid:n=f.expando),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[f.expando]:f.expando;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)?b=b:b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" "));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];if(!arguments.length){if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}return b}e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!a||j===3||j===8||j===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g},removeAttr:function(a,b){var c,d,e,g,h=0;if(a.nodeType===1){d=(b||"").split(p),g=d.length;for(;h=0}})});var z=/\.(.*)$/,A=/^(?:textarea|input|select)$/i,B=/\./g,C=/ /g,D=/[^\w\s.|`]/g,E=/^([^\.]*)?(?:\.(.+))?$/,F=/\bhover(\.\S+)?/,G=/^key/,H=/^(?:mouse|contextmenu)|click/,I=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,J=function(a){var b=I.exec(a);b&& +(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},K=function(a,b){return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||a.id===b[2])&&(!b[3]||b[3].test(a.className))},L=function(a){return f.event.special.hover?a:a.replace(F,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=L(c).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"",(g||!e)&&c.preventDefault();if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,n=null;for(m=e.parentNode;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l=0:t===b&&(t=o[s]=r.quick?K(m,r.quick):f(m).is(s)),t&&q.push(r);q.length&&j.push({elem:m,matches:q})}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),G.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),H.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var Y="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",Z=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,_=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,ba=/<([\w:]+)/,bb=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bk=X(c);bj.optgroup=bj.option,bj.tbody=bj.tfoot=bj.colgroup=bj.caption=bj.thead,bj.th=bj.td,f.support.htmlSerialize||(bj._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after" +,arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Z,""):null;if(typeof a=="string"&&!bd.test(a)&&(f.support.leadingWhitespace||!$.test(a))&&!bj[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(_,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bn(a,d),e=bo(a),g=bo(d);for(h=0;e[h];++h)g[h]&&bn(e[h],g[h])}if(b){bm(a,d);if(c){e=bo(a),g=bo(d);for(h=0;e[h];++h)bm(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!bc.test(k))k=b.createTextNode(k);else{k=k.replace(_,"<$1>");var l=(ba.exec(k)||["",""])[1].toLowerCase(),m=bj[l]||bj._default,n=m[0],o=b.createElement("div");b===c?bk.appendChild(o):X(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=bb.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&$.test(k)&&o.insertBefore(b.createTextNode($.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bt.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bs,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bs.test(g)?g.replace(bs,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bB(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bC=function(a,c){var d,e,g;c=c.replace(bu,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bD=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bv.test(f)&&bw.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bB=bC||bD,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bF=/%20/g,bG=/\[\]$/,bH=/\r?\n/g,bI=/#.*$/,bJ=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bK=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bL=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bM=/^(?:GET|HEAD)$/,bN=/^\/\//,bO=/\?/,bP=/)<[^<]*)*<\/script>/gi,bQ=/^(?:select|textarea)/i,bR=/\s+/,bS=/([?&])_=[^&]*/,bT=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bU=f.fn.load,bV={},bW={},bX,bY,bZ=["*/"]+["*"];try{bX=e.href}catch(b$){bX=c.createElement("a"),bX.href="",bX=bX.href}bY=bT.exec(bX.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bU)return bU.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bP,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bQ.test(this.nodeName)||bK.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bH,"\r\n")}}):{name:b.name,value:c.replace(bH,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?cb(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),cb(a,b);return a},ajaxSettings:{url:bX,isLocal:bL.test(bY[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bZ},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:b_(bV),ajaxTransport:b_(bW),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cd(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=ce(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bJ.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bI,"").replace(bN,bY[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bR),d.crossDomain==null&&(r=bT.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bY[1]&&r[2]==bY[2]&&(r[3]||(r[1]==="http:"?80:443))==(bY[3]||(bY[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),ca(bV,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bM.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bO.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bS,"$1_="+x);d.url=y+(y===d.url?(bO.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bZ+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=ca(bW,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)cc(g,a[g],c,e);return d.join("&").replace(bF,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cf=f.now(),cg=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cf++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cg.test(b.url)||e&&cg.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cg,l),b.url===j&&(e&&(k=k.replace(cg,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ch=a.ActiveXObject?function(){for(var a in cj)cj[a](0,1)}:!1,ci=0,cj;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ck()||cl()}:ck,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ch&&delete cj[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++ci,ch&&(cj||(cj={},f(a).unload(ch)),cj[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cm={},cn,co,cp=/^(?:toggle|show|hide)$/,cq=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cr,cs=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],ct;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cw("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cz.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cz.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cA(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cA(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file