/*global document, $, jQuery, mxo_project_settings, console, mxo, tr, init_service_proxy, refresh_markers */

var mxo_project_history, mxo_project_generate, mxo_project_handler, mxo_project_criteria, mxo_project_form, mxo_project_update, mxo_project_service_proxy, mxo_project_service_request;
// TODO : LOADER

mxo_project_generate = (function () {
	var build_input = (function () {
		return {
			select: function (options) {
				var div_element, label_element, select_element, option_element;
				// div
				div_element = document.createElement('span');

				// label
				label_element = document.createElement('label');
				div_element.appendChild(label_element);
				mxo_project_generate.build_input_add_class(label_element, options.label_class);
				mxo_project_generate.build_input_add_attr(label_element, options.id, 'for');
				label_element.innerHTML = options.label;
				//console.log(label_element.text);
				// select
				select_element = document.createElement('select');
				div_element.appendChild(select_element);
				mxo_project_generate.build_input_add_class(select_element, options.type_class);
				select_element.setAttribute('id', options.id);
				select_element.setAttribute('name', options.id);
				// options
				mxo.object.map(options.data, function (data_key, data) {
					option_element = document.createElement('option');
					option_element.setAttribute('value', data_key);
					select_element.appendChild(option_element);
					option_element.text = data;
				});

				// Set disabled to IPS Top valued
				if (mxo_project_settings.IPS_filter.IPS_filter_column === options.id) {
					$(select_element).find("option:last").attr('selected', 'selected');
					select_element.setAttribute('disabled', 'disabled');
				} else {
					// handler
					select_element.onchange = mxo_project_handler.change;
				}

				if (options.draw === false) {
					div_element.style.display = 'none';
					select_element.setAttribute('disabled', 'disabled');
				}
				return div_element;
			},
			text: function (options) {
				var div_element, label_element, text_element, span_element, img_element;

				//label
				label_element = document.createElement('label');
				mxo_project_generate.build_input_add_class(label_element, options.label_class);
				mxo_project_generate.build_input_add_attr(label_element, options.id, 'for');
				$(label_element).text(options.label);
				//input
				text_element = document.createElement('input');
				text_element.setAttribute('type', 'text');
				text_element.setAttribute('id', options.id);
				text_element.setAttribute('name', options.id);
				text_element.setAttribute('value', options.label + '...');
				text_element.setAttribute('maxlength', '100');
				mxo_project_generate.build_input_add_class(text_element, options.type_class);
				//span
				span_element = document.createElement('span');
				mxo_project_generate.build_input_add_class(span_element, options.span_class);
				img_element = document.createElement('input');
				img_element.setAttribute('type', 'image');
				img_element.setAttribute('alt', options.label);
				img_element.setAttribute('src', options.image_src);
				span_element.appendChild(img_element);

				// handler
				text_element.onkeyup = mxo_project_handler.change;
				mxo_project_settings.form.text_defaults[options.id] = options.label + '...';
				text_element.onclick = mxo_project_handler.click;
				img_element.onclick = mxo_project_handler.click;

				// div
				div_element = document.createElement('div');
				mxo_project_generate.build_input_add_attr(div_element, options.div_id, 'id');
				div_element.appendChild(label_element);
				div_element.appendChild(text_element);
				return div_element;
			}
		};
	}());

	function build_form(call_me_when_finished) {
		var new_input, form_element = document.getElementById(mxo_project_settings.form.id), fieldset;
		jQuery('#' + mxo_project_settings.form.id).submit(function (event) {
			event.preventDefault();
			return false;
		});
		//$(form_element).attr('onsubmit', 'return false;');
		// Add some extra settings variables
		mxo_project_settings.form.text_defaults = {};
		mxo_project_settings.limit.begin = 0;

		fieldset = jQuery('#' + mxo_project_settings.form.id + ' fieldset');

		// Loop fields
		mxo.object.map(mxo_project_settings.form.fields, function (name, options) {
			try {
				new_input = build_input[options.type](options);
			} catch (error) {
				console.log('Generate Field Error' + error.message);
			}
			fieldset.append(new_input);
		});

		call_me_when_finished();
	}
	
	function build_input_add_class(object, classname) {
		if ((typeof classname) === 'string') {
			mxo.array.map(classname.split(" "), function (currentclass) {
				$(object).addClass(currentclass);
			});
		}
	}
	
	function build_input_add_attr(object, attr_value, attr_name) {
		if (attr_value !== null && attr_value !== '') {
			return object.setAttribute(attr_name, attr_value);
		} else {
			return object;
		}
	}

	return {
		build_form: build_form,
		build_input_add_class: build_input_add_class,
		build_input_add_attr: build_input_add_attr
	};
}());

mxo_project_handler = (function () {
	function change() {
		var selected, label_name, id, value_id, value_name;
		switch (this.tagName) {
		case 'SELECT':
			selected = this.childNodes[this.selectedIndex];
			value_id = selected.getAttribute('value');
			value_name = selected.innerHTML;
			label_name = $(this.parentNode).find('label').html();
			id = this.getAttribute('id');
			break;
		case 'INPUT':
			// Text input
			if (this.getAttribute('type') === 'text') {
				value_name = this.value;
				value_id = '1';
				id = this.getAttribute('id');
				label_name = $(this.parentNode).find('label').html();
			} else if (this.getAttribute('type') === 'image') { // Image input
				//console.log('image');
				id = 'niks';
			}
			break;
		}
		mxo_project_criteria.add(id, label_name, value_name, value_id);
		mxo_project_form.submit();
	}

	function click() {
		// Remove criteria
		if ($(this).hasClass('delete_criteria') && $(this).attr('alt') !== '') {
			mxo_project_criteria.del($(this).attr('alt'));
			mxo_project_form.clear_field_by_id($(this).attr('alt'));
			mxo_project_form.submit();
		}
		// write history before go to detail

		if ($(this).hasClass('pm_before_detail')) {
			mxo_project_history.set_history(mxo_project_form.build_data(true), $(this).attr('href'));
			mxo_project_service_request.service_proxy_loading_handler();
			return false;
		}

		// click on input image next to textfield
		if (this.tagName === 'INPUT' && this.type === 'image') {
			$(this.previousSibling).change();
		}

		// compare and change to 'this' is stardard value
		if (this.tagName === 'INPUT' && this.type === 'text' && mxo_project_settings.form.text_defaults[this.id] !== undefined && mxo_project_settings.form.text_defaults[this.id] !== '' && this.value === mxo_project_settings.form.text_defaults[this.id]) {
			this.value = '';
		}
		return false;
	}

	return {
		change: change,
		click: click
	};
}());

mxo_project_history = (function () {
	var service_proxy_history;

	function service_proxy_history_init() {
		if (typeof service_proxy_history === 'undefined') {
			service_proxy_history = init_service_proxy({
				"handlers": {
					"loading": [{
						"loading": function () {},
						"done": function () {},
						"progress": function (param) {}
					}],
					"error": [{
						 "error": function (data) {}
					}]
				},
				"default namespace": "../documents/services"
			});
		}
	}

	function get_history_handler(json_data) {
		var label_name, value;
		if (json_data !== null) {
			mxo.object.map(mxo_project_settings.form.fields, function (name, options) {
				if (mxo_project_settings.IPS_filter.IPS_filter_column !== options.id &&
					json_data[options.id] !== undefined &&
					json_data[options.id][0] !== undefined &&
					json_data[options.id][0] === "yes" &&
					json_data[options.id][1] !== undefined &&
					json_data[options.id][1].id !== undefined) {
						switch (options.type) {
							case "select":
								label_name = $("#" + options.id).find('option[value="' + json_data[options.id][1].id + '"]').html();
								value = json_data[options.id][1].id;
								break;
							case "text":
								label_name = json_data[options.id][1].id;
								value =  "1";
								break;
							default:
								label_name = options.id;
								value = '';
						}
						mxo_project_criteria.add(
							options.id,
							options.label,
							label_name,
							value);
						mxo_project_form.set_field_by_id(options.id, json_data[options.id][1].id);
				}
			});
			if (json_data.limit !== undefined &&
					json_data.limit[0] !== undefined &&
					json_data.limit[0] === "yes" &&
					json_data.limit[1] !== undefined &&
					json_data.limit[1].begin !== undefined) {
				mxo_project_settings.limit.begin = parseInt(json_data.limit[1].begin, 10);
			}
		}
		mxo_project_service_request.enable();
		mxo_project_form.submit(true);
	}

	function get_history(nr) {
		service_proxy_history_init();
		service_proxy_history.execute("GetFilterHistory", {"history_number": nr}, function (response_data) {
			get_history_handler(response_data);
		});
	}

	function set_history(data, url) {
		service_proxy_history_init();
		service_proxy_history.execute("SetFilterHistory", data, function (response_data) {
			if (typeof response_data.history_number !== 'undefined'
				&& parseInt(response_data.history_number, 10) > 0) {
					set_history_handler(parseInt(response_data.history_number, 10), url);
			}
		});
	}

	function set_history_handler(nr, url) {
		if (nr > 0) {
			window.location.hash = nr;
			if (typeof url === 'string') {
				window.location = url + '#' + nr;
			}
		}
	}

	function set_custom_history(id, value) {
		var data = mxo_project_form.create_empty_dataset();

		if (data.limit[0] === "yes") {
			data.limit[1].begin = 0;
		}

		data[id] = [ 'yes', {
			'id': value
		}];

		service_proxy_history_init();
		service_proxy_history.execute("SetFilterHistory", data, function (response_data) {
			if (typeof response_data.history_number !== 'undefined'
				&& parseInt(response_data.history_number, 10) > 0) {
					set_custom_history_handler(parseInt(response_data.history_number, 10));
			}
		});
	}

	function set_custom_history_handler(nr) {
		if (nr > 0) {
			setTimeout("window.location = '" + mxo_project_settings.projects.projects_url + "#" + nr + "';", 100);
		}
	}

	return {
		get_history: get_history,
		set_history: set_history,
		set_custom_history: set_custom_history
	}
}());

mxo_project_criteria = (function () {
	function add(id, label_name, value, value_id) {
		// Enter the {id = ''} argument to add a criterium without delete link
		var tr_element = document.createElement('tr'),
			td_element_large = document.createElement('td'),
			td_element_small = document.createElement('td'),
			a_element = document.createElement('a'),
		old_element = get(id);

		// Textfield extra escape values
		if (mxo_project_settings.form.text_defaults[id] !== undefined) {
			if (value === mxo_project_settings.form.text_defaults[id] || value === '') {
				value_id = "-1";
			}
		}

		// Edit old criteria
		if (value_id !== "-1" && mxo_project_settings.form.text_defaults[id] !== undefined && old_element !== null) {
			var span = $(old_element).find("td span").html();
			$(old_element).find("td span").parent("td").html('<span>' + span + '</span>' + value);
			mxo_project_criteria.check();
		} else if (value_id !== "-1") { // Insert new criteria
			// Delete to be sure
		del(id);
			// Set title element
			//mxo_project_generate.build_input_add_class(td_element_large, 'large');
			td_element_large.innerHTML = '<span>' + label_name + '</span>' + value + '';
			// Set remove element
			//mxo_project_generate.build_input_add_class(td_element_small, 'small');
			if (id !== '') {
				a_element.setAttribute('href', '#');
				mxo_project_generate.build_input_add_class(a_element, 'delete_criteria');
				a_element.setAttribute('alt', id);
				a_element.innerHTML = tr('P_DELETE');
				a_element.onclick = mxo_project_handler.click;
				td_element_small.appendChild(a_element);
			}
			// Set top element
			mxo_project_generate.build_input_add_attr(tr_element, id, 'alt');
			mxo_project_generate.build_input_add_class(td_element_large, 'large');
			tr_element.appendChild(td_element_large);
			tr_element.appendChild(td_element_small);
			// Add new criteria
			$(tr_element).hide().appendTo($("#" + mxo_project_settings.form.id_criteria + " table"));
			check();
			$(tr_element).slideDown('slow', function () {
				//$(this).css('display','');
				check();
			});
		} else if (value_id === "-1") {// Delete existing criteria
			del(id);
		}
	}

	function del(id) {
		var criteria = get(id);
		if (criteria === null) {
			return;
		}
		$(criteria).slideUp('slow', function () {
			$(this).remove();
			check();
		});
	}

	function get(id) {
		var rows = $("#" + mxo_project_settings.form.id_criteria + " table tr[alt='" + id + "']");
		if (id === '') {
			rows = $("#" + mxo_project_settings.form.id_criteria + " table tr:not([alt])");
		}
		if (rows.length > 0) {
			return rows[0];
		} else {
			return null;
		}
	}
	
	function check() {
		var no_criteria_row = get(''),
			rows = $("#" + mxo_project_settings.form.id_criteria + " table tr[alt]");
		if (rows.length === 0 && no_criteria_row === null) {
			add('', tr('P_NO_CRITERIA'), '', '');
		} else if (rows.length > 0 && no_criteria_row !== null) {
			del('');
		}
	}

	return {
		add: add,
		del: del,
		get: get,
		check: check
	};
}());

mxo_project_form = (function () {
	var collect_field_data =  (function () {
		return {
			select: function (id) {
				var select_element = document.getElementById(id),
					option_element = select_element.childNodes[select_element.selectedIndex],
					value_id = option_element.getAttribute('value');
				return value_id;
			},
			text: function (id) {
				var select_element = document.getElementById(id),
					value = select_element.value;
				return value;
			}
		};
	}());

	function collect_all_data() {
		// Loop fields
		var fields = {};
		mxo.object.map(mxo_project_settings.form.fields, function (name, options) {
			try {
				fields[options.id] = collect_field_data[options.type](options.id);
			} catch (error) {
				//console.log('Collect field data error' + error.message);
			}
		});
		return fields;
	}

	function clear_field_by_id(id) {
		mxo.object.map(mxo_project_settings.form.fields, function (name, options) {
			if (options.id === id) {
				set_field_by_id(id, '');
			}
		});
	}

	function set_field_by_id(id, value) {
		mxo.object.map(mxo_project_settings.form.fields, function (name, options) {
			if (options.id === id) {
				set_field_by_id_type[options.type](id, value);
			}
		});
	}

	var set_field_by_id_type = (function () {
		return {
			select: function (id, value) {
				value = (value === '')?'-1':value;
				$("#" + id).find("option[value='" + value + "']").attr('selected', 'selected');
			},
			text: function (id, value) {
				mxo.object.map(mxo_project_settings.form.fields, function (name, options) {
					if (options.id === id) {
						value = (value === '')? options.label + '...' : value;
						$("#" + id).val(value);
					}
				});
			}
		};
	}());
	function create_empty_dataset() {
		var request_data = {};
		// Set all options
		mxo.object.map(mxo_project_settings.form.fields, function (name, options) {
			request_data[options.id] = ['no',
			[]];
		});

		// Adds limit values
		if (mxo_project_settings.limit !== undefined && mxo_project_settings.limit.active !== undefined && mxo_project_settings.limit.active === true && mxo_project_settings.limit.limit !== undefined) {
			request_data.limit = [ 'yes', {
				'begin': mxo_project_settings.limit.begin,
				'limit': mxo_project_settings.limit.limit
			}];
		} else {
			request_data.limit = [ 'no', {
				'begin': 0,
				'limit': 0
			}];
		}
		return request_data;
	}

	function build_data(called_by_navigation_page_change) {
		var data = collect_all_data(),
			request_data;
		// Set navigation page to 1 when changing the form data
		if (called_by_navigation_page_change === undefined || called_by_navigation_page_change === false) {
			mxo_project_settings.limit.begin = 0;
		}

		request_data = create_empty_dataset();

		// Change value of all empty text fields to "-1"
		mxo.object.map(mxo_project_settings.form.fields, function (name, options) {
			if (options.type === 'text') {
				if (data[options.id] === '' || data[options.id] === (options.label + '...')) {
					data[options.id] = "-1";
				}
			}
		});
		// Convert raw data to service execute readable data
		mxo.object.map(data, function (id, value) {
			if (value !== '-1') {
				request_data[id] = [ 'yes', {
					'id': value
				}];
			}
		});
		return request_data;
	}

	function submit(called_by_navigation_page_change) {
		var request_data = build_data(called_by_navigation_page_change);
		mxo_project_service_request.send(request_data);
	}

	function change_combos(data_all_combos) {
		mxo.object.map(mxo_project_settings.form.fields, function (name, options) {
			if (options.type === 'select' && data_all_combos['combos_' + options.id] !== undefined) {
				change_combo_field(options.id, options.data, data_all_combos['combos_' + options.id]);
			}
		});
	}

	function change_combo_field(id, all_combo_data, new_combo_data) {
		var select_element = document.getElementById(id),
			selected_id = (select_element.childNodes[select_element.selectedIndex]).getAttribute('value'),
			new_option,
			new_combos_with_value = {},
			sort_type = 'asc';

		// FIND SORT TYPE
		mxo.object.map(mxo_project_settings.form.fields, function (field_key, field) {
			if (field.id === id && field.sort !== undefined) {
				if (field.sort === 'desc') {
					sort_type = 'desc';	
				}
			}
		});

		//GENERATE NEW COMBO ARRAY
		mxo.array.map(new_combo_data, function (option_id) {
			if (all_combo_data[option_id] !== undefined && all_combo_data[option_id] !== null) {
				new_combos_with_value[option_id] = all_combo_data[option_id];
			}
		});

		// SORT NEW COMBO ARRAY
		var keys = [];
		mxo.object.map(new_combos_with_value, function (key) {
			keys.push(key);
		});
		keys.sort(function (a, b) {
			if(sort_type === 'desc') {
				if (new_combos_with_value[a] < new_combos_with_value[b]) {
					return 1;
				}
			} else {
				if (new_combos_with_value[a] > new_combos_with_value[b]) {
					return 1;
				}
			}
			return -1;
		});

		//DELETE OLD COMBODATA
		$(select_element).find('option:not([value="-1"])').remove();

		//WRITE NEW COMBODATA
		mxo.array.map(keys, function (the_key) {
			new_option = document.createElement('option');
			new_option.setAttribute('value', the_key);
			new_option.innerHTML = all_combo_data[the_key];
			select_element.appendChild(new_option);
		});

		// SELECT OLD OPTION
		set_field_by_id(id, selected_id);
		//$("#" + id + " option[value='" + selected_id + "']").attr("selected", "selected");
	}

	return {
		clear_field_by_id: clear_field_by_id,
		set_field_by_id: set_field_by_id,
		create_empty_dataset: create_empty_dataset,
		build_data: build_data,
		submit: submit,
		change_combos: change_combos
	};
}());

mxo_project_update = (function () {

	function set_total_projects(num) {
			var message = tr('P_NO_RESULTS'),
				container_element = document.getElementById(mxo_project_settings.form.id_count),
				paragraph_element = document.createElement('p');
			$(paragraph_element).html(message);

			if (!(isNaN(Number(num)) || num === 0)) {
				$(paragraph_element).find('strong').html("" + num);
			}
			$(container_element).find('p').replaceWith(paragraph_element);
	}
	function set_projects(new_projects) {
		var ul_e, li_e, a_e, h3_e, h4_e, p_e, paid_access;

		// Form a project list
		ul_e = document.createElement('ul');
		if (new_projects.length > 0) {
			mxo.array.map(new_projects, function (data) {
				li_e = document.createElement('li');

				// Write title
				h3_e = document.createElement('h3');
				a_e = document.createElement('a');
				a_e.setAttribute('href', mxo_project_settings.projects.project_url + '/' + data.id + '/' + data.urltitle);
				a_e.innerHTML = data.title;
				mxo_project_generate.build_input_add_class(a_e, 'pm_before_detail');
				a_e.onclick = mxo_project_handler.click;
				h3_e.appendChild(a_e);
				li_e.appendChild(h3_e);

				// write information
				data.pub_year = (data.pub_year === undefined || data.pub_year === "")?'':' - ' + data.pub_year;
				data.authors = (data.authors === undefined || data.authors === "")?'':' - ' + data.authors;
				data.key_subject = (data.key_subject === undefined || data.key_subject === "")?'':' - ' + data.key_subject;
				data.key_location = (data.key_location === undefined || data.key_location === "")?'':' - ' + data.key_location;
				h4_e = document.createElement('h4');
				h4_e.innerHTML = '<span class="type">' + data.type + ':</span>' + data.pub_year + data.authors + data.key_subject + data.key_location;
				li_e.appendChild(h4_e);

				// Description
				p_e = document.createElement('p');
				p_e.innerHTML = data.description;
				li_e.appendChild(p_e);

				// More link
				p_e = document.createElement('p');
				paid_access = (data.link_orderform === undefined || data.link_orderform === '')?'Open access':'Restricted access';
				data.link_orderform_img = (data.link_orderform === undefined || data.link_orderform === '')?'': ' <img alt="(Online restricted access)" src="' + mxo_project_settings.projects.site_web_path + '/templates/site/documentation_center/img/key.jpg" />';
				data.link_orderform = (data.link_orderform === undefined || data.link_orderform === '')?'': ' <a class="more source" onclick="' + print_record_event(data.type, 'Order form') + '" href="' + data.link_orderform + '">Order photocopy</a>';
				data.link_document = (data.link_document === undefined || data.link_document === '')?'': '<a class="more source" onclick="' + print_record_event(data.type, paid_access) + '" target="_blank" href="' + data.link_document + '">Go to the source' + data.link_orderform_img + '</a>';
				data.link_library = (data.link_library === undefined || data.link_library === '')?'': '<a class="more source" onclick="' + print_record_event(data.type, 'Library') + '" target="_blank" href="' + data.link_library + '">Find in library</a>';
				p_e.innerHTML = data.link_orderform + data.link_document + data.link_library + '<a class="more pm_before_detail" onclick="mxo_project_history.set_history(mxo_project_form.build_data(true), $(this).attr(\'href\')); mxo_project_service_request.service_proxy_loading_handler(); return false;" href="' + mxo_project_settings.projects.project_url + '/' + data.id + '/' + data.urltitle + '">More information</a>';
				li_e.appendChild(p_e);

				// ADD TO UL
				ul_e.appendChild(li_e);
			});


		} else {
			li_e = document.createElement('li');
			h3_e = document.createElement('h3');
			p_e = document.createElement('p');
			h3_e.innerHTML = tr('P_NO_RESULTS');
			p_e.innerHTML = tr('P_NO_PROJECTS');
			li_e.appendChild(h3_e);
			li_e.appendChild(p_e);
			ul_e.appendChild(li_e);
		}
		$("#" + mxo_project_settings.projects.id).find('ul').replaceWith(ul_e);
	}
	function set_project_navigation_page(page_num) {
			$("html:not(:animated),body:not(:animated)").animate({scrollTop: ($("#" + mxo_project_settings.projects.id).offset().top - 20)}, 1000 );
			page_num = (page_num > 0) ? page_num : 1;
			mxo_project_settings.limit.begin = ((page_num - 1) * mxo_project_settings.limit.limit);
			mxo_project_form.submit(true);
	}
	function set_project_navigation(total_projects) {
			var total_pages, this_page, index, pagina_navigatie = '',
				page;

			total_pages = Math.ceil(total_projects / mxo_project_settings.limit.limit);
			this_page = Math.round(mxo_project_settings.limit.begin / mxo_project_settings.limit.limit) + 1;

			if (mxo_project_settings.limit.active === true && total_pages > 1) {
				// Vorige
				if (this_page > 1) {
					pagina_navigatie += '<li class="previous"><a href="javascript: mxo_project_update.set_project_navigation_page(' + (this_page - 1) + ')">Previous</a></li>';
				}
				// Nummerrij
				for (index = 0 - mxo_project_settings.projects.num_navigation_pages; index <= mxo_project_settings.projects.num_navigation_pages; index += 1) {
					page = (this_page + index);
					if (page > 0 && page <= total_pages) {
						pagina_navigatie += '<li ' + ((page === this_page) ? 'class="current"' :'') + '><a href="javascript: mxo_project_update.set_project_navigation_page(' + page + ')">' + page + '</a></li>';
					}
				}
				// Volgende
				if (this_page < total_pages) {
					pagina_navigatie += '<li class="next"><a href="javascript: mxo_project_update.set_project_navigation_page(' + (this_page + 1) + ')">Next</a></li>';
				}
			}
			$("ul[class='paging']").html(pagina_navigatie);
		}
	return {
		set_total_projects: set_total_projects,
		set_projects: set_projects,
		set_project_navigation_page: set_project_navigation_page,
		set_project_navigation: set_project_navigation
	};
}());

mxo_project_service_proxy = {};
mxo_project_service_request = (function () {
	var sending = false, pending = false;

	function init() {
		mxo_project_service_proxy = service_proxy_init();
	}

	function disable() {
		sending = true;
		pending = true;
	}

	function enable() {
		sending = false;
		pending = false;
	}

	function send(data) {
		if (sending === false) {
			sending = true;
			mxo_project_service_proxy.execute("FilterProjects", data, response);
		} else {
			pending = true;
		}
	}

	function response(data) {
		//console.log('service execute response:',data);
		sending = false;
		mxo_project_form.change_combos(data.combos);

			//BUG
			//if (mxo_project_settings.projects.combo_change_name_for_maps !== null
			 //   && data.combos[mxo_project_settings.projects.combo_change_name_for_maps] !== null
			  //  && jQuery.isFunction(refresh_markers)) {
				//refresh_markers(data.combos[mxo_project_settings.projects.combo_change_name_for_maps]);
			//}
		if (pending === true) {
			pending = false;
			mxo_project_form.submit();
		} else {
			mxo_project_update.set_total_projects(data.count);
			mxo_project_update.set_projects(data.projects);
			mxo_project_update.set_project_navigation(data.count);
		}
	}

	// SERVICE PROXY
	function service_proxy_init() {
		return init_service_proxy({
			"handlers": {
				"loading": [{
					"loading": mxo_project_service_request.service_proxy_loading_handler,
					"done": mxo_project_service_request.service_proxy_done_handler,
					"progress": function (param) { }
				}],
				"error": [{
					 "error": mxo_project_service_request.service_proxy_error_handler
				}]
			},
			"default namespace": "../documents/services"
		});
	}

	function service_proxy_loading_handler() {
		// TODO Switch to view class
		$("#result_loading").show();
		$("#result_loading").animate({
			"opacity": 0.8
		}, 500, "linear");
	}

	function service_proxy_done_handler() {
		// TODO Switch to view class
		$("#result_loading").animate({
			"opacity": 0
		}, 500, "linear", function () {
			$("#result_loading").hide();
		});
	}

	function service_proxy_error_handler(data) {}

	return {
		init: init,
		disable: disable,
		enable: enable,
		send: send,
		service_proxy_init: service_proxy_init,
		service_proxy_loading_handler: service_proxy_loading_handler,
		service_proxy_done_handler: service_proxy_done_handler,
		service_proxy_error_handler: service_proxy_error_handler
	};
}());
