{"version":3,"file":"kendo.data.odata.min.js","names":["factory","define","amd","$","undefined$1","kendo","window","extend","NEWLINE","DOUBLELINE","isFunction","odataFilters","eq","neq","gt","gte","lt","lte","contains","doesnotcontain","endswith","startswith","isnull","isnotnull","isnullorempty","isnotnullorempty","isempty","isnotempty","odataFiltersVersionFour","mappers","pageSize","noop","page","filter","params","useVersionFour","toOdataFilter","$filter","sort","orderby","expr","map","value","order","field","replace","dir","join","$orderby","skip","$skip","take","$top","defaultDataType","read","dataType","useOdataFour","idx","length","type","format","operator","ignoreCase","result","logic","filters","timezone","apply","push","stripMetadata","obj","name","indexOf","hex16","Math","floor","random","toString","substr","createBoundary","prefix","createDelimeter","boundary","close","createCommand","transport","item","httpVerb","command","transportUrl","options","url","commandPrefix","getOperationHeader","changeset","changeId","header","processCollection","colection","skipContent","requestBody","getBoundary","collection","content","i","stringify","getOperations","data","schemas","odata","d","results","total","transports","cache","jsonp","update","contentType","create","destroy","parameterMap","option","this","$inlinecount","$format","Error","Array","isArray","batch","$count","x","substring","submit","e","colections","batchURL","headers","updated","destroyed","created","createBatchRequest","collections","ajax","success","response","current","responses","responseText","changeBody","status","code","marker","jsonModel","responseMarkers","match","markerIndex","models","passed","lastIndexOf","pop","parseFloat","JSON","parse","parseBatchResponse","index","error","jQuery"],"sources":["kendo.data.odata.js"],"mappings":"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","sourcesContent":["(function (factory) {\n typeof define === 'function' && define.amd ? define(['kendo.core'], factory) :\n factory();\n})((function () {\n var __meta__ = {\n id: \"data.odata\",\n name: \"OData\",\n category: \"framework\",\n depends: [ \"core\" ],\n hidden: true\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n extend = $.extend,\n NEWLINE = \"\\r\\n\",\n DOUBLELINE = \"\\r\\n\\r\\n\",\n isFunction = kendo.isFunction,\n odataFilters = {\n eq: \"eq\",\n neq: \"ne\",\n gt: \"gt\",\n gte: \"ge\",\n lt: \"lt\",\n lte: \"le\",\n contains: \"substringof\",\n doesnotcontain: \"substringof\",\n endswith: \"endswith\",\n startswith: \"startswith\",\n isnull: \"eq\",\n isnotnull: \"ne\",\n isnullorempty: \"eq\",\n isnotnullorempty: \"ne\",\n isempty: \"eq\",\n isnotempty: \"ne\"\n },\n odataFiltersVersionFour = extend({}, odataFilters, {\n contains: \"contains\"\n }),\n mappers = {\n pageSize: $.noop,\n page: $.noop,\n filter: function(params, filter, useVersionFour) {\n if (filter) {\n filter = toOdataFilter(filter, useVersionFour);\n if (filter) {\n params.$filter = filter;\n }\n }\n },\n sort: function(params, orderby) {\n var expr = $.map(orderby, function(value) {\n var order = value.field.replace(/\\./g, \"/\");\n\n if (value.dir === \"desc\") {\n order += \" desc\";\n }\n\n return order;\n }).join(\",\");\n\n if (expr) {\n params.$orderby = expr;\n }\n },\n skip: function(params, skip) {\n if (skip) {\n params.$skip = skip;\n }\n },\n take: function(params, take) {\n if (take) {\n params.$top = take;\n }\n }\n },\n defaultDataType = {\n read: {\n dataType: \"jsonp\"\n }\n };\n\n function toOdataFilter(filter, useOdataFour) {\n var result = [],\n logic = filter.logic || \"and\",\n idx,\n length,\n field,\n type,\n format,\n operator,\n value,\n ignoreCase,\n filters = filter.filters;\n\n for (idx = 0, length = filters.length; idx < length; idx++) {\n filter = filters[idx];\n field = filter.field;\n value = filter.value;\n operator = filter.operator;\n\n if (filter.filters) {\n filter = toOdataFilter(filter, useOdataFour);\n } else {\n ignoreCase = filter.ignoreCase;\n field = field.replace(/\\./g, \"/\");\n filter = odataFilters[operator];\n if (useOdataFour) {\n filter = odataFiltersVersionFour[operator];\n }\n\n if (operator === \"isnullorempty\") {\n filter = kendo.format(\"{0} {1} null or {0} {1} ''\", field, filter);\n } else if (operator === \"isnotnullorempty\") {\n filter = kendo.format(\"{0} {1} null and {0} {1} ''\", field, filter);\n } else if (operator === \"isnull\" || operator === \"isnotnull\") {\n filter = kendo.format(\"{0} {1} null\", field, filter);\n } else if (operator === \"isempty\" || operator === \"isnotempty\") {\n filter = kendo.format(\"{0} {1} ''\", field, filter);\n } else if (filter && value !== undefined$1) {\n type = kendo.type(value);\n if (type === \"string\") {\n format = \"'{1}'\";\n value = value.replace(/'/g, \"''\");\n\n if (ignoreCase === true) {\n field = \"tolower(\" + field + \")\";\n }\n\n } else if (type === \"date\") {\n if (useOdataFour) {\n format = \"{1:yyyy-MM-ddTHH:mm:ss+00:00}\";\n value = kendo.timezone.apply(value, 'Etc/UTC');\n } else {\n format = \"datetime'{1:yyyy-MM-ddTHH:mm:ss}'\";\n }\n } else {\n format = \"{1}\";\n }\n\n if (filter.length > 3) {\n if (filter !== \"substringof\") {\n format = \"{0}({2},\" + format + \")\";\n } else {\n format = \"{0}(\" + format + \",{2})\";\n if (operator === \"doesnotcontain\") {\n if (useOdataFour) {\n format = \"{0}({2},'{1}') eq -1\";\n filter = \"indexof\";\n } else {\n format += \" eq false\";\n }\n }\n }\n } else {\n format = \"{2} {0} \" + format;\n }\n\n filter = kendo.format(format, filter, value, field);\n }\n }\n\n result.push(filter);\n }\n\n filter = result.join(\" \" + logic + \" \");\n\n if (result.length > 1) {\n filter = \"(\" + filter + \")\";\n }\n\n return filter;\n }\n\n function stripMetadata(obj) {\n for (var name in obj) {\n if (name.indexOf(\"@odata\") === 0) {\n delete obj[name];\n }\n }\n }\n\n function hex16() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substr(1);\n }\n\n function createBoundary(prefix) {\n return prefix + hex16() + '-' + hex16() + '-' + hex16();\n }\n\n function createDelimeter(boundary, close) {\n var result = NEWLINE + \"--\" + boundary;\n\n if (close) {\n result += \"--\";\n }\n\n return result;\n }\n\n function createCommand(transport, item, httpVerb, command) {\n var transportUrl = transport.options[command].url;\n var commandPrefix = kendo.format(\"{0} \", httpVerb);\n\n if (isFunction(transportUrl)) {\n return commandPrefix + transportUrl(item);\n } else {\n return commandPrefix + transportUrl;\n }\n }\n\n function getOperationHeader(changeset, changeId) {\n var header = \"\";\n\n header += createDelimeter(changeset, false);\n header += NEWLINE + 'Content-Type: application/http';\n header += NEWLINE + 'Content-Transfer-Encoding: binary';\n header += NEWLINE + 'Content-ID: ' + changeId;\n\n return header;\n }\n\n function getOperationContent(item) {\n var content = \"\";\n\n content += NEWLINE + \"Content-Type: application/json;odata=minimalmetadata\";\n content += NEWLINE + \"Prefer: return=representation\";\n content += DOUBLELINE + kendo.stringify(item);\n\n return content;\n }\n\n function getOperations(collection, changeset, changeId, command, transport, skipContent) {\n var requestBody = \"\";\n\n for (var i = 0; i < collection.length; i++) {\n requestBody += getOperationHeader(changeset, changeId);\n requestBody += DOUBLELINE + createCommand(transport, collection[i], transport.options[command].type, command) + ' HTTP/1.1';\n if (!skipContent) {\n requestBody += getOperationContent(collection[i]);\n }\n requestBody += NEWLINE;\n changeId++;\n }\n\n return requestBody;\n }\n\n function processCollection(colection, boundary, changeset, changeId, transport, command, skipContent) {\n var requestBody = \"\";\n\n requestBody += getBoundary(boundary, changeset);\n requestBody += getOperations(colection, changeset, changeId, command, transport, skipContent);\n requestBody += createDelimeter(changeset, true);\n requestBody += NEWLINE;\n\n return requestBody;\n }\n\n function getBoundary(boundary,changeset) {\n var requestBody = \"\";\n\n requestBody += \"--\" + boundary + NEWLINE;\n requestBody += \"Content-Type: multipart/mixed; boundary=\" + changeset + NEWLINE;\n\n return requestBody;\n }\n\n function createBatchRequest(transport, colections) {\n \t\tvar options = extend({}, transport.options.batch);\n var boundary = createBoundary(\"sf_batch_\");\n var requestBody = \"\";\n var changeId = 0;\n var batchURL = transport.options.batch.url;\n var changeset = createBoundary(\"sf_changeset_\");\n\n options.type = transport.options.batch.type;\n options.url = isFunction(batchURL) ? batchURL() : batchURL;\n \t\toptions.headers = extend(options.headers || {}, {\n \t\t\t\"Content-Type\": \"multipart/mixed; boundary=\" + boundary\n \t\t});\n\n if (colections.updated.length) {\n requestBody += processCollection(colections.updated, boundary, changeset, changeId, transport, \"update\", false);\n changeId += colections.updated.length;\n changeset = createBoundary(\"sf_changeset_\");\n }\n\n if (colections.destroyed.length) {\n requestBody += processCollection(colections.destroyed, boundary, changeset, changeId, transport, \"destroy\", true);\n changeId += colections.destroyed.length;\n changeset = createBoundary(\"sf_changeset_\");\n }\n\n if (colections.created.length) {\n requestBody += processCollection(colections.created, boundary, changeset, changeId, transport, \"create\", false);\n }\n\n requestBody += createDelimeter(boundary, true);\n\n options.data = requestBody;\n\n return options;\n }\n\n function parseBatchResponse(responseText) {\n var responseMarkers = responseText.match(/--changesetresponse_[a-z0-9-]+$/gm);\n var markerIndex = 0;\n var collections = [];\n var changeBody;\n var status;\n var code;\n var marker;\n var jsonModel;\n\n collections.push({ models: [], passed: true });\n\n for (var i = 0; i < responseMarkers.length; i++) {\n marker = responseMarkers[i];\n if (marker.lastIndexOf('--', marker.length - 1)) {\n if (i < responseMarkers.length - 1) {\n collections.push({ models: [], passed: true });\n }\n continue;\n }\n\n if (!markerIndex) {\n markerIndex = responseText.indexOf(marker);\n } else {\n markerIndex = responseText.indexOf(marker, markerIndex + marker.length);\n }\n\n changeBody = responseText.substring(markerIndex, responseText.indexOf(\"--\", markerIndex + 1));\n status = changeBody.match(/^HTTP\\/1\\.\\d (\\d{3}) (.*)$/gm).pop();\n code = kendo.parseFloat(status.match(/\\d{3}/g).pop());\n\n if (code >= 200 && code <= 299) {\n jsonModel = changeBody.match(/\\{.*\\}/gm);\n if (jsonModel) {\n collections[collections.length - 1].models.push(JSON.parse(jsonModel[0]));\n }\n } else {\n collections[collections.length - 1].passed = false;\n }\n\n }\n\n return collections;\n }\n\n extend(true, kendo.data, {\n schemas: {\n odata: {\n type: \"json\",\n data: function(data) {\n return data.d.results || [data.d];\n },\n total: \"d.__count\"\n }\n },\n transports: {\n odata: {\n read: {\n cache: true, // to prevent jQuery from adding cache buster\n dataType: \"jsonp\",\n jsonp: \"$callback\"\n },\n update: {\n cache: true,\n dataType: \"json\",\n contentType: \"application/json\", // to inform the server the the request body is JSON encoded\n type: \"PUT\" // can be PUT or MERGE\n },\n create: {\n cache: true,\n dataType: \"json\",\n contentType: \"application/json\",\n type: \"POST\" // must be POST to create new entity\n },\n destroy: {\n cache: true,\n dataType: \"json\",\n type: \"DELETE\"\n },\n parameterMap: function(options, type, useVersionFour) {\n var params,\n value,\n option,\n dataType;\n\n options = options || {};\n type = type || \"read\";\n dataType = (this.options || defaultDataType)[type];\n dataType = dataType ? dataType.dataType : \"json\";\n\n if (type === \"read\") {\n params = {\n $inlinecount: \"allpages\"\n };\n\n if (dataType != \"json\") {\n params.$format = \"json\";\n }\n\n for (option in options) {\n if (mappers[option]) {\n mappers[option](params, options[option], useVersionFour);\n } else {\n params[option] = options[option];\n }\n }\n } else {\n if (dataType !== \"json\") {\n throw new Error(\"Only json dataType can be used for \" + type + \" operation.\");\n }\n\n if (type !== \"destroy\") {\n for (option in options) {\n value = options[option];\n if (typeof value === \"number\") {\n options[option] = value + \"\";\n }\n }\n\n params = kendo.stringify(options);\n }\n }\n\n return params;\n }\n }\n }\n });\n\n extend(true, kendo.data, {\n schemas: {\n \"odata-v4\": {\n type: \"json\",\n data: function(data) {\n if (Array.isArray(data)) {\n for (var i = 0; i < data.length; i++) {\n stripMetadata(data[i]);\n }\n return data;\n } else {\n data = $.extend({}, data);\n stripMetadata(data);\n\n if (data.value) {\n return data.value;\n }\n return [data];\n }\n },\n total: function(data) {\n return data[\"@odata.count\"];\n }\n }\n },\n transports: {\n \"odata-v4\": {\n batch: {\n type: \"POST\"\n },\n read: {\n cache: true, // to prevent jQuery from adding cache buster\n dataType: \"json\"\n },\n update: {\n cache: true,\n dataType: \"json\",\n contentType: \"application/json;IEEE754Compatible=true\", // to inform the server the the request body is JSON encoded\n type: \"PUT\" // can be PUT or MERGE\n },\n create: {\n cache: true,\n dataType: \"json\",\n contentType: \"application/json;IEEE754Compatible=true\",\n type: \"POST\" // must be POST to create new entity\n },\n destroy: {\n cache: true,\n dataType: \"json\",\n type: \"DELETE\"\n },\n parameterMap: function(options, type) {\n var result = kendo.data.transports.odata.parameterMap(options, type, true);\n if (type == \"read\") {\n result.$count = true;\n delete result.$inlinecount;\n }\n\n \t\t\t\t\tif (result && result.$filter) {\n \t\t\t\t\t\t// Remove the single quotation marks around the GUID (OData v4).\n \t\t\t\t\t\tresult.$filter = result.$filter.replace(/('[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')/ig, function(x) {\n \t\t\t\t\t\t\treturn x.substring(1, x.length - 1);\n \t\t\t\t\t\t});\n \t\t\t\t\t}\n\n return result;\n },\n submit: function(e) {\n var that = this;\n var options = createBatchRequest(that, e.data);\n var collections = e.data;\n\n if (!collections.updated.length && !collections.destroyed.length && !collections.created.length) {\n return;\n }\n\n $.ajax(extend(true, {}, {\n success: function(response) {\n var responses = parseBatchResponse(response);\n var index = 0;\n var current;\n\n if (collections.updated.length) {\n current = responses[index];\n if (current.passed) {\n // Pass either the obtained models or an empty array if only status codes are returned.\n e.success(current.models.length ? current.models : [], \"update\");\n }\n index++;\n }\n if (collections.destroyed.length) {\n current = responses[index];\n if (current.passed) {\n // For delete operations OData returns only status codes.\n // Passing empty array to datasource will force it to correctly remove the deleted items from the pristine collection.\n e.success([], \"destroy\");\n }\n index++;\n }\n if (collections.created.length) {\n current = responses[index];\n if (current.passed) {\n e.success(current.models, \"create\");\n }\n }\n },\n error: function(response, status, error) {\n e.error(response, status, error);\n }\n }, options));\n }\n }\n }\n });\n\n })(window.kendo.jQuery);\n\n}));\n"]}