/**
 * @author Andrius Steponavicius <andrius.steponavicius@gmail.com>
 */

DataSelection = function (data) {
	this.data = data;
	this.name = data.name;
	//this.parent = window.frameElement;
	this.parent = window.top;
	if (! isset(this.parent)) {
		this.parent = {};
	}
	
	// Checking whether id is required (IdPicker or IdMultiPicker)
	this.idRequired = document.getElementById(this.name + '.pickerIdRequired');
	if (this.idRequired) {
		this.idRequired = this.idRequired.value == '1';
	}
	
	// Checking whether multiple value allowed (MultiPicker or IdMultiPicker)
	this.isMultiple = document.getElementById(this.name + '.pickerMultiValue');
	if (this.isMultiple) {
		this.isMultiple = this.isMultiple.value == '1';
	}
	
	// Settings assigned arguments
	if (! isset(this.parent.selection)) {
		this.parent.selection = {};
		if (isset(window.top.dialogArguments) && ! empty(window.top.dialogArguments.value)) {
			var l = window.top.dialogArguments.value.split(';');
			for (var i = 0, n = l.length; i < n; i++) {
				var t = l[i].split(':', 2)
					, id = decodeURIComponent(t[0])
					, label = decodeURIComponent(t[t.length - 1])
					, index = this.idRequired ? id : label;
				this.parent.selection[index] = {'id': id, 'value': label};
			}
		}
	}
	
	// Initializing selection
	this.selection = document.getElementsByName(this.name + '_selection[]');
	if (this.selection) {
		var c = 0, n = this.selection.length;
		for (var i = 0; i < n; i++) {
			var item = this.selection[i], x = item.value.split(':', 2);
			item.checked = this.idRequired ? x[0] in this.parent.selection : x[1] in this.parent.selection;
			if (item.checked) {
				c++;
			}
		}
		// Initializing "all" selection
		this.selectionAll = document.getElementById(this.name + '.selection.all');
		if (this.selectionAll) {
			this.selectionAll.checked = n && c;
			this.selectionAll.indeterminate = this.selectionAll.checked ? (c !== n) : false;
		}
	}

	// Initializing form handler
	var formHandler = document.getElementById(this.name + ".formHandler");
	if (formHandler !== null) {
		this.formHandler = document.getElementById(formHandler.value);
	} else {
		this.formHandler = null;
	}
	if (this.formHandler) {
		this.formHandler.value = this.formHandlerValue();
	}
}

DataSelection.prototype.selectValue = function (item) {
	var value = item.value;

	var val = value.split(':', 2)
		, id = decodeURIComponent(val[0])
		, label = decodeURIComponent(val[1]);
		
	if (item.checked) {
		var value = {'id': id, 'value': label}, fields = item.fields;
		if (fields) {
			fields = fields.split(';');
			for (var i = 0, n = fields.length; i < n; i++) {
				var field = fields[i].split(':', 2);
				value[decodeURIComponent(field[0])] = decodeURIComponent(field[1]);
			}
		}
	}
	
	var index = this.idRequired ? id : label;
	if (! this.isMultiple) {
		this.parent.selection = {};
		this.parent.selection[index] = value;
		return;
	} else {
		if (item.checked) {
			this.parent.selection[index] = value;
		} else {
			delete this.parent.selection[index];
		}
	}
}

/**
 */
DataSelection.prototype.click = function () {
	this.selectValue(event.srcElement);

	if (this.selection && this.selectionAll) {
		var c = 0, n = this.selection.length;
		for (var i = 0; i < n; i++) {
			if (this.selection[i].checked) {
				c++;
			}
		}
		this.selectionAll.checked = n && c;
		this.selectionAll.indeterminate = this.selectionAll.checked ? (c !== n) : false;
	}

	if (this.formHandler) {
		this.formHandler.value = this.formHandlerValue();
	}
}

/**
 * @param object item
 */
DataSelection.prototype.clickAll = function () {
	if (! this.selection || ! this.selectionAll) {
		return;
	}
	
	for (var i = 0, n = this.selection.length; i < n; i++) {
		this.selection[i].checked = this.selectionAll.checked;
		this.selectValue(this.selection[i]);
	}

	if (this.formHandler) {
		this.formHandler.value = this.formHandlerValue();
	}
}

/**
 * Returning string formated data:
 * 1:label1;2:label2;...
 */
DataSelection.prototype.formHandlerValue = function () {
	var values = this.parent.selection, results = [];
	for (var i in values) {
		if (values[i] !== '') {
			results.push(encodeURIComponent(values[i]['id']) + ':' + encodeURIComponent(values[i]['value']));
		}
	}
	return results.join(';');
}

/**
 * Returning string formated data:
 * id,value[,field1[,...]];1,label1[,data1[,...]];2,label2[,data2[,...]];...
 */
DataSelection.prototype.idMultiPickerValue = function () {
	var values = this.parent.selection, results = [''], first;
	for (first in values) {
		break;
	}
	if (! first) {
		return 'id,value';
	}
	for (var field in values[first]) {
		results[0] += field + ',';
	}
	results[0] = results[0].substr(0, results[0].length - 1);
	for (var i in values) {
		if (values[i] !== '') {
			var x = [];
			for (var field in values[first]) {
				x.push(encodeURIComponent(values[i][field]));
			}
			results.push(x.join(','));
		}
	}
	return results.join(';');
}

/**
 */
DataSelection.prototype.returnValue = function () {
	window.top.returnValue = this.idMultiPickerValue();
	window.top.close();
}
