/*
	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.cal.textDirectory");
dojo.require("dojo.string");

dojo.cal.textDirectory.Property = function(/*String*/line){
// summary: parses a single line from an iCalendar text/directory file
// and creates an object with four named values; name, group, params
// and value. name, group and value are strings containing the original
// tokens unaltered and values is an array containing name/value pairs
// or a single name token packed into arrays.

	// split into name/value pair
	var left = dojo.string.trim(line.substring(0, line.indexOf(':')));
	var right = dojo.string.trim(line.substr(line.indexOf(':') + 1));

	// separate name and paramters
	var parameters = dojo.string.splitEscaped(left,';');
	this.name = parameters[0];
	parameters.splice(0, 1);

	// parse paramters
	this.params = [];
	var arr;
	for(var i = 0; i < parameters.length; i++){
		arr = parameters[i].split("=");
		var key = dojo.string.trim(arr[0].toUpperCase());

		if(arr.length == 1){ this.params.push([key]); continue; }

		var values = dojo.string.splitEscaped(arr[1],',');
		for(var j = 0; j < values.length; j++){
			if(dojo.string.trim(values[j]) != ''){
				this.params.push([key, dojo.string.trim(values[j])]);
			}
		}
	}

	// separate group
	if(this.name.indexOf('.') > 0){
		arr = this.name.split('.');
		this.group = arr[0];
		this.name = arr[1];
	}

	// don't do any parsing, leave to implementation
	this.value = right;
}


dojo.cal.textDirectory.tokenise = function(/*String*/text){
// summary: parses text into an array of properties.

	// normlize to one property per line and parse
	var nText = dojo.string.normalizeNewlines(text,"\n").
		replace(/\n[ \t]/g, '').
		replace(/\x00/g, '');

	var lines = nText.split("\n");
	var properties = [];

	for(var i = 0; i < lines.length; i++){
		if(dojo.string.trim(lines[i]) == ''){ continue; }
		var prop = new dojo.cal.textDirectory.Property(lines[i]);
		properties.push(prop);
	}
	return properties; // Array
}
