﻿var sSchedule_dataSources = function () {
	
	var dataModels = new sSchedule_common_dataModels();
	var common = new Sschedule_commonFunctions();
	
	function readDs(crudServiceBaseUrl, readEntity, successCallback) {
		var read = {
			url: crudServiceBaseUrl + readEntity,
			type: "GET",
			contentType: "application/json",
			dataType: "json",
			complete: function (jqXHR, textStatus) {
				if (successCallback) {
					successCallback();
				}
			}
		};
		return read;
	}

	function createDs(crudServiceBaseUrl, saveEntity, successCallback) {
		var create = {
			url: crudServiceBaseUrl + saveEntity,
			type: "POST",
			contentType: "application/json",
			dataType: "json",
			complete: function (jqXHR, textStatus) {
				if (successCallback) {
					if (jqXHR && jqXHR.responseText) {
						var d = JSON.parse(jqXHR.responseText);
						if (jqXHR.status == 200) {
							successCallback(d);
						} else {
							var response = { status: jqXHR.status, responseText: d };
							successCallback(response);
						}
					} else {
						successCallback(null);
					}
				}
			}
		};
		return create;
	}

	function updateDs(crudServiceBaseUrl, saveEntity, successCallback) {
		var update = {
			url: crudServiceBaseUrl + saveEntity,
			type: "POST",
			contentType: "application/json",
			dataType: "json",
			complete: function (jqXHR, textStatus) {
				if (successCallback) {
					if (jqXHR && jqXHR.responseText) {
						var d = JSON.parse(jqXHR.responseText);
						successCallback(d);
					} else {
						successCallback(null);
					}
				}
			}
		};
		return update;
	}

	function destroyDs(crudServiceBaseUrl, destroyEntity, successCallback) {
		var destroy = {
			url: crudServiceBaseUrl + destroyEntity,
			type: "POST",
			contentType: "application/json",
			dataType: "json",
			complete: function (jqXHR, textStatus) {
				if (successCallback) {
					if (jqXHR && jqXHR.responseText) {
						var d = JSON.parse(jqXHR.responseText);
						successCallback(d);
					} else {
						successCallback(null);
					}
				}
			}
		};
		return destroy;
	}

	function errorDs(errorCallback, closeCallback) {
		var error = function (xhr, status, error) {
			if (!xhr)
				return;
			
			var errorMes = JSON.parse(xhr.xhr.responseText);
			if (errorMes.Key) {
				common.showMessage(errorMes.Name, closeCallback);
				if (errorCallback) errorCallback();
			} else {
				common.showMessage("There was an error occurred!");
			}
		};
		return error;
	}
	
	function completeDs() {
		var complete = function (jqXHR, textStatus) {
			textStatus = "create";
		};
		return complete;
	}

	function getDataSource(dataModel, apiName, readEntity, cuEntity, deleteEntity, params, doBatch, successCallback) {
		var myModel = dataModels.getModel(dataModel);
		var common = new Sschedule_commonFunctions();
		var serviceRoot = common.getServiceRootUrl();
		//var moduleId = $('#ModuleId').val();
		//var sf = $.ServicesFramework();
		var crudServiceBaseUrl = serviceRoot + apiName + "/";

		var myDataSource = new kendo.data.DataSource({
			transport: {
				read: {
					url: crudServiceBaseUrl + readEntity,
					type: "GET",
					contentType: "application/json",
					dataType: "json",
					complete: function (jqXHR, textStatus) {
						textStatus = "read";
					}
				},
				parameterMap: params,
			},
			error: errorDs(),
			schema: {
				type: "json",
				model: myModel
			}
		});

		return myDataSource;
	}

	return { readDs: readDs, createDs: createDs, updateDs: updateDs, destroyDs: destroyDs, errorDs: errorDs, getDataSource: getDataSource };
}
