/*
	Copyright (c) 2004-2006, The Dojo Foundation
	All Rights Reserved.

	Licensed under the Academic Free License version 2.1 or above OR the
	modified BSD license. For more information on Dojo licensing, see:

		http://dojotoolkit.org/community/licensing.shtml
*/

dojo.provide("dojo.data.CsvStore");
dojo.require("dojo.data.core.RemoteStore");
dojo.require("dojo.lang.assert");
dojo.declare("dojo.data.CsvStore", dojo.data.core.RemoteStore, {_setupQueryRequest:function (result, requestKw) {
	var serverQueryUrl = this._serverQueryUrl ? this._serverQueryUrl : "";
	var queryUrl = result.query ? result.query : "";
	requestKw.url = serverQueryUrl + queryUrl;
	requestKw.method = "get";
}, _resultToQueryData:function (serverResponseData) {
	var csvFileContentString = serverResponseData;
	var arrayOfArrays = this._getArrayOfArraysFromCsvFileContents(csvFileContentString);
	var arrayOfObjects = this._getArrayOfObjectsFromArrayOfArrays(arrayOfArrays);
	var remoteStoreData = this._getRemoteStoreDataFromArrayOfObjects(arrayOfObjects);
	return remoteStoreData;
}, _setupSaveRequest:function (saveKeywordArgs, requestKw) {
}, _getArrayOfArraysFromCsvFileContents:function (csvFileContents) {
	dojo.lang.assertType(csvFileContents, String);
	var lineEndingCharacters = new RegExp("\r\n|\n|\r");
	var leadingWhiteSpaceCharacters = new RegExp("^\\s+", "g");
	var trailingWhiteSpaceCharacters = new RegExp("\\s+$", "g");
	var doubleQuotes = new RegExp("\"\"", "g");
	var arrayOfOutputRecords = [];
	var arrayOfInputLines = csvFileContents.split(lineEndingCharacters);
	for (var i in arrayOfInputLines) {
		var singleLine = arrayOfInputLines[i];
		if (singleLine.length > 0) {
			var listOfFields = singleLine.split(",");
			var j = 0;
			while (j < listOfFields.length) {
				var space_field_space = listOfFields[j];
				var field_space = space_field_space.replace(leadingWhiteSpaceCharacters, "");
				var field = field_space.replace(trailingWhiteSpaceCharacters, "");
				var firstChar = field.charAt(0);
				var lastChar = field.charAt(field.length - 1);
				var secondToLastChar = field.charAt(field.length - 2);
				var thirdToLastChar = field.charAt(field.length - 3);
				if ((firstChar == "\"") && ((lastChar != "\"") || ((lastChar == "\"") && (secondToLastChar == "\"") && (thirdToLastChar != "\"")))) {
					if (j + 1 === listOfFields.length) {
						return null;
					}
					var nextField = listOfFields[j + 1];
					listOfFields[j] = field_space + "," + nextField;
					listOfFields.splice(j + 1, 1);
				} else {
					if ((firstChar == "\"") && (lastChar == "\"")) {
						field = field.slice(1, (field.length - 1));
						field = field.replace(doubleQuotes, "\"");
					}
					listOfFields[j] = field;
					j += 1;
				}
			}
			arrayOfOutputRecords.push(listOfFields);
		}
	}
	return arrayOfOutputRecords;
}, _getArrayOfObjectsFromArrayOfArrays:function (arrayOfArrays) {
	dojo.lang.assertType(arrayOfArrays, Array);
	var arrayOfItems = [];
	if (arrayOfArrays.length > 1) {
		var arrayOfKeys = arrayOfArrays[0];
		for (var i = 1; i < arrayOfArrays.length; ++i) {
			var row = arrayOfArrays[i];
			var item = {};
			for (var j in row) {
				var value = row[j];
				var key = arrayOfKeys[j];
				item[key] = value;
			}
			arrayOfItems.push(item);
		}
	}
	return arrayOfItems;
}, _getRemoteStoreDataFromArrayOfObjects:function (arrayOfObjects) {
	dojo.lang.assertType(arrayOfObjects, Array);
	var output = {};
	for (var i = 0; i < arrayOfObjects.length; ++i) {
		var object = arrayOfObjects[i];
		for (var key in object) {
			var value = object[key];
			object[key] = [value];
		}
		output[i] = object;
	}
	return output;
}, newItem:function (attributes, keywordArgs) {
	dojo.unimplemented("dojo.data.CsvStore.newItem");
}, deleteItem:function (item) {
	dojo.unimplemented("dojo.data.CsvStore.deleteItem");
}, setValues:function (item, attribute, values) {
	dojo.unimplemented("dojo.data.CsvStore.setValues");
}, set:function (item, attribute, value) {
	dojo.unimplemented("dojo.data.CsvStore.set");
}, unsetAttribute:function (item, attribute) {
	dojo.unimplemented("dojo.data.CsvStore.unsetAttribute");
}, save:function (keywordArgs) {
	dojo.unimplemented("dojo.data.CsvStore.save");
}, revert:function () {
	dojo.unimplemented("dojo.data.CsvStore.revert");
}, isDirty:function (item) {
	dojo.unimplemented("dojo.data.CsvStore.isDirty");
}});

