/// <reference path="../../../js/jquery-1.4.1-vsdoc.js" />
/// <reference path="../../../js/MicrosoftAjax.debug.js" />

Function.prototype.delegate = function(ref) {
	var f = this;
	return function() { return f.apply(ref, arguments); };
};
(function() {
	function responseParser(onSuccess, onError, context) {
		return function(data, textStatus, XMLHttpRequest) {
			if (!data)
				return onError.call(context, { "_FORM": "Data not found" });
			if (data.Errors)
				return onError.call(context, data.Errors);
			return onSuccess.call(context, data);
		}
	}
	function requestErrorParser(onError) {
		return function(XMLHttpRequest, textStatus, errorThrown) {
			onError({ "_FORM": "Request error." });
		}
	}
	window.Bmsi = {
		LoginPath: "/",
		RecoverPasswordPath: "/user/reset",
		SuggestionsService: '/getsuggestions/',

		responseParser: responseParser,
		GetFirstError: function(errors) {
			for (name in errors) {
				return errors[name][0];
			}
		},
		AjaxRequestError: function(XMLHttpRequest, textStatus, errorThrown) {
			//TODO: Требуется красивая обработка событий
		},
		Login: function(userEmail, userPassword, onSuccess, onError) {
			Sys.Debug.trace('Bmsi.Login');
			jQuery.ajax({
				url: Bmsi.LoginPath, cache: false, dataType: "json", type: "POST",
				data: { userEmail: userEmail, userPassword: userPassword },
				success: responseParser(onSuccess, onError),
				error: requestErrorParser(onError)
			});
		},
		RecoverPassword: function(userEmail, captchaText, onSuccess, onError) {
			jQuery.ajax({
				url: Bmsi.RecoverPasswordPath, cache: false, dataType: "json", type: "POST",
				data: { userEmail: userEmail, captchaText: captchaText },
				success: responseParser(onSuccess, onError),
				error: requestErrorParser(onError)
			});
		},
		UpdateContent: function(area, url) {
			area = $(area);
			url = url || area.attr('url');
			if (!url || url == '')
				return;
			show_progress(area);
			area.load(url, { _ajax: true }, function() {
				hide_progress(this);
				recalculate_all();
				loadTips();
				wrap_blocks();
				$('a.addFavoritesInactive', this).each(function() {
					var qtipconfig = GetQtipConfig();
					qtipconfig.position.target = $(this);
					qtipconfig.style.classes.tip = 'inactive-tip-right';
					qtipconfig.position.adjust.x = -260;
					$(this).qtip(qtipconfig);
				});
			});
		}
	};

})();
(function() {
	$ = jQuery;
	$('li.icon-fav a').live('click', function() {
		var a = this;
		jQuery.ajax({
			url: this.href, cache: false, dataType: "json", type: "POST",
			success: function(data) {
				if (data === true)
					$(a).attr("title", "Удалить из избранного").attr("href", a.href.replace("add", "remove")).parent().removeClass("icon-fav").addClass("icon-favactive");
				$(a).data('title', $(a).attr('title'));
				$(a).attr('title', '');
			},
			error: Bmsi.AjaxRequestError
		});
		return false;
	});
	$('li.icon-favactive a').live('click', function() {
		var a = this;
		jQuery.ajax({
			url: this.href, cache: false, dataType: "json", type: "POST",
			success: function(data) {
				if (data === true) {
					$(a).attr("title", "Добавить в избранное").attr("href", a.href.replace("remove", "add")).parent().removeClass("icon-favactive").addClass("icon-fav");
					$(a).data('title', $(a).attr('title'));
					$(a).attr('title', '');
				}
			},
			error: Bmsi.AjaxRequestError
		});
		return false;
	});

	$('div.updateable-content div.h-stripe a, div.updateable-content div.page a, div.updateable-content table.cat-main th a').live('click', function() {
		show_progress(this);
		$(this).parents('div.updateable-content:first').load(this.href, { _ajax: true }, function() {
			hide_progress(this);
			recalculate_all();
			loadTips();
			wrap_blocks();
			$('a.addFavoritesInactive').each(function() {
				var qtipconfig = GetQtipConfig();
				qtipconfig.position.target = $(this);
				qtipconfig.style.classes.tip = 'inactive-tip-right';
				qtipconfig.position.adjust.x = -260;
				$(this).qtip(qtipconfig);
			});
		});
		return false;
	});
	$("#block-filter").live('submit', function() {
		var update = $('div.updateable-content');
		if (!update.length)
			return;
		show_progress(update);
		var url = window.location.href;
		var urlParams = "";
		if (url.indexOf('?') >= 0) {
			urlParams = "&" + url.substring(url.indexOf('?') + 1, url.length);
			url = url.substr(0, url.indexOf('?'));
		}
		if (url.charAt(url.length - 1) != '/')
			url = url + '/'

		urlParams = urlParams.toLowerCase();
		var form = $(this).closest('form');
		var fromInputs = $("input", form);
		for (var i = 0; i < fromInputs.length; i++) {
			var name = String($(fromInputs[i]).attr("name")).toLowerCase();
			if (urlParams.indexOf(name) >= 0 && name != '') {
				var regexS = "[&]" + name + "=([^&#]*)";
				var regex = new RegExp(regexS, "gi");
				urlParams = urlParams.replace(regex, "");
			}
		}
		$.ajax({ url: url,
			data: form.serialize() + urlParams,
			cache: false,
			type: 'GET', dataType: 'html',
			success: function(result) {
				update.html($(result).contents());
				hide_progress(update);
				recalculate_all(); wrap_blocks(); loadTips();
				if (update.find('ul.main').find('li.clearfix').length > 0 ||update.find('table.cat-main').find('tbody').find('tr').length > 0) {
					hide_noresults(update);
				}
				else {
					show_noresults(update);
					update = $(update).hasClass('block') ? update : $(update).parents(".block:first");
					update.hide();
				}
				$( 'html, body' ).animate( { scrollTop: 0 }, 0 );
			}
			, error: function(xhr, status, e) { hide_progress(update); }
		});
		/*$(this).ajaxSubmit({
		type: 'GET', dataType: 'html', data: { _ajax: true }, cache: false
		, success: function(result) {
		update.html($($(result)[1]).html());
		hide_progress(update);
		recalculate_all(); wrap_blocks(); loadTips();
		if (update.find('ul.main').find('li.clearfix').length > 0) {
		hide_noresults(update);
		}
		else {
		show_noresults(update);
		update = $(update).hasClass('block') ? update : $(update).parents(".block:first");
		update.hide();
		}
		}
		, error: function(xhr, status, e) { hide_progress(update); }
		});*/
		return false;
	});


	var servicePath = Bmsi.SuggestionsService;
	$.fn.hasValue = function(name, value) {
		return this.find('input[name=' + name + '][value=' + value + ']').length > 0;
	};
	function suggestionParser(request, response, obj) {
		return function(data) {
			if (data != null && jQuery.isArray(data) && data.length > 0) {
				var re = new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + $.ui.autocomplete.escapeRegex(request.term) + ")(?![^<>]*>)(?![^&;]+;)", "gi");
				response($.map(data, function(d) {
					return {
						id: d.ID,
						label: d.DisplayName.replace(re, "<strong>$1</strong>"),
						value: d.DisplayName
					};
				}));
				return;
			}
			response([]);
			obj.onEmpty();
		}
	}
	function getTargetList(element) {
		var p = $(element).parent(), list = p.find('ul.selected');
		if (list.length)
			return list;
		return $('<ul class="selected"></ul>').appendTo(p);
	}
	function renderItem(data, obj) {
		return $('<li></li>').attr("id", data.id || data.ID).text(data.value || data.DisplayName)
						.append(
							$('<input type="hidden"/>').attr("name", obj.name).val(data.id || data.ID)
		//						).append(
		//							$('<a href="#" class="name"></a>').text(data.value || data.DisplayName)
						).append(
							$('<a href="#delete" class="delete" title="Удалить"></a>')
						);
	}
	function checkValues(el, obj) {
		var values = $(el).parent().add(obj.targetList).find('input:hidden[name=' + obj.name + ']');
		if (!values.length)
			return;
		var target = getTargetList(el);
		values.each(function() {
			var tf = $(this), val = tf.val(); tf.remove();

			tf = $('<li></li>').attr("id", val).appendTo(obj.targetList);
			$.getJSON(servicePath + obj.type + '/Item/' + val, function(data) {
				if (data != null)
					tf.replaceWith(obj.renderItem(data, obj));
				else
					tf.remove();
			});
		});
	}

	$.fn.entitySuggestions = function(opts) {
		this.filter('input').each(function() {
			var targetInput = $(this);
			if (targetInput.data('Bmsi.filterSuggestions') != null)
				return;
			var obj = {
				wrapper: opts.wrapper,
				popup: opts.popup,
				delay: opts.delay || 5000,
				type: opts.type,
				criteria: opts.criteria || {},
				name: targetInput.attr("name"),
				source: opts.source || function(request, response) {
					var c = obj.criteria;
					if (typeof (c) == 'function')
						c = opts.criteria.call(obj, request);
					$.extend(c, { input: request.term });
					$.ajax({
						success: suggestionParser(request, response, obj),
						data: c,
						dataType:'json',
						type:'POST',
						url:servicePath + obj.type
					});
				},
				appendTo: opts.appendTo || targetInput.parent(),
				renderItem: opts.renderItem || renderItem,
				targetList: opts.targetList || getTargetList(targetInput)[0],
				select: opts.select || function(event, ui) {
					if ($('#' + ui.item.id, obj.targetList).length)
						return;
					obj.renderItem(ui.item, obj).appendTo(obj.targetList);
				},
				close: opts.close,
				onEmpty: function() {
					var q = $('p.nothing', this.appendTo);
					if (!q.length)
						q = $('<p class="nothing">Ничего не найдено!</p>').appendTo(this.appendTo);
					q.show();

					if (obj.wrapper) {
						if (!obj.wrapper.parent().hasClass('selected')) {
							obj.wrapper.parent().addClass('selected');
						}
						obj.wrapper.css('display', '');
						obj.wrapper.show();
					}
				}
			};
			/*
			popup:
			iconId: id ссылки по которой открывается попап с Suggestions,
			id: id диалога,
			title: заголовок диалога,
			pageSize:  --- ,
			template: шаблон диалога
			*/
			if (obj.popup) {
				var showAllUrl = servicePath + obj.type + '/All/?pageSize=' + obj.popup.pageSize;
				if (obj.popup.template)
					showAllUrl = showAllUrl + '&template=' + obj.popup.template;
				if (obj.criteria && $.param(obj.criteria) != '') {
					showAllUrl = showAllUrl + '&' + $.param(obj.criteria);
				}
				$('#' + obj.popup.iconId).attr('href', showAllUrl);
				$('#' + obj.popup.iconId).live('click', function() {
					$.get($(this).attr('href'), function(data) {
						data = '<div class="updateable-content">'+data+'</div>';
						$.raisepopup({
							showClose: true,
							modal: true,
							title: obj.popup.title,
							id: obj.popup.id,
							html: data,
							target: $(obj.popup.id),
							load: function(data) {
								$(this).find('ul li.clearfix a').live('click', function() {
									var entityId = $(this).parent().find('#EntityID').val(); ;
									var displayName = $(this).parent().find('#DisplayName').val();
									var data = { id: entityId, value: displayName, label: displayName };
									if ($('#' + data.id, obj.targetList).length)
										return false;
									obj.renderItem(data, obj).appendTo(obj.targetList);
									$('#overlay').efadeOut(300);
									$('#' + obj.popup.id).efadeOut(300, function() { $(this).remove() });
									return false;
								});
							}
						});
					});
					return false;
				});
			}

			targetInput.data('Bmsi.filterSuggestions', obj);
			try { targetInput[0].removeAttribute("name"); }
			catch (e) { targetInput.attr("name", null); }
			checkValues(targetInput, obj);

			targetInput.autocomplete({
				appendTo: obj.appendTo,
				source: obj.source,
				delay: 500,
				select: obj.select,
				open: function(event, ui) {
					if (obj.wrapper) {
						$('div.autosuggest').parent().removeClass('selected');
						$('div.autosuggest').hide();
						if (!obj.wrapper.parent().hasClass('selected')) {
							obj.wrapper.parent().addClass('selected')
						}
						obj.wrapper.css('display', '');
						obj.wrapper.find('ul').css('left', '0px');
						obj.wrapper.show();
						$("ul.ui-autocomplete li a").each(function(){
						$(this).html($(this).html().replace(/&lt;/g, '<').replace(/&gt;/g, '>'));
						});
						
					}
					$('p.nothing', obj.appendTo).hide();
				},
				close: function(data) {
					if (obj.wrapper) {
						obj.wrapper.parent().removeClass('selected');
						obj.wrapper.hide();
					}
					targetInput.val('');
					$('p.nothing', obj.appendTo).hide();
					if (typeof (obj.close) == 'function')
						obj.close.apply(obj, arguments);
					//return false;
				}
			});
		});
		return this;
	}
	$.fn.entitySuggestions.renderItem = renderItem;
	$('ul a.delete').live('click', function() {
		$(this).parent().remove();
		return false;
	});
	function wrap_suggestion() {
		$('.ui-autocomplete').wrapInner('<div class="b-right"><div class="b-left"><div class="b-content clearfix"></div></div></div>')
		.append('<div class="br"></div><div class="bl"></div><div class="tl"></div><div class="tr"></div><div class="bottom"></div>')
		.prepend('<div class="top"></div>');
	}
	//Sys.Debug.traceDump(this.selectedIndex);

})();

(function() {
	$ = jQuery;
	window.Bmsi.QueryBuilder = function(input) {
		function getActionValue(e) {
			return $(e.target).attr('href');
		}
		var t = this;
		t.input = input;
		t.selection = $(input).data('selection');
		if (!t.selection) {
			t.selection = { start: null, end: null };
			$(input).data('selection', t.selection);
		}
		t.UpdateSelection = function(e) {
			if (document.activeElement == t.input || e.target == t.input) {
				t.selection.start = t.FindSelectionStart();
				t.selection.end = t.FindSelectionEnd();
			}
		}

		t.FindSelectionStart = function() {
			if ($.browser.msie) {
				var range = document.selection.createRange();
				if (range.compareEndPoints("StartToEnd", range) != 0)
					range.collapse(true);
				return range.getBookmark().charCodeAt(2) - 2;
			}
			else
				return t.input.selectionStart;
		}

		t.FindSelectionEnd = function() {
			if ($.browser.msie) {
				var range = document.selection.createRange();
				if (range.compareEndPoints("StartToEnd", range) != 0)
					range.collapse(false);
				var b = range.getBookmark();
				return range.getBookmark().charCodeAt(2) - 2;
			}
			else
				return t.input.selectionEnd;
		}
		t.InsertString = function(e, str) {
			t.input.focus();
			if ($.browser.msie) {
				var range = document.selection.createRange();
				if (t.selection.start != t.selection.end) {
					range.moveStart('character', t.selection.end - t.selection.start);
				}
				range.text = str;
				t.UpdateSelection(e);
				range.select();
			} else {
				var left = t.input.value.substr(0, t.selection.end),
				right = t.input.value.substr(t.selection.end);
				t.input.value = left + str + right;
				t.SetCaretPos(left.length + str.length);
				t.UpdateSelection(e);
			}
		}
		t.AppendString = function(e, str, shift) {
			shift = (shift && shift > 0) ? shift : 0;
			t.input.value += ' ' + str;
			t.SetCaretPos(t.input.value.length - shift);
			t.UpdateSelection(e);
			t.input.focus();
		}
		t.AddZone = function(e, zone) {
			if (zone == null)
				zone = getActionValue(e);
			t.AppendString(e, zone + ':()', 1);
			e.preventDefault();
			e.stopPropagation();
			return false;
		}
		t.AddOperator = function(e, op) {
			t.input.focus();
			if (op == null)
				op = getActionValue(e);
			var text = ' ' + op + ' ';
			if (op == '*')
				t.InsertString(e, text);
			else
				t.AppendString(e, text);
			e.preventDefault();
			e.stopPropagation();
			return false;
		}
		t.Clear = function() {
			t.input.value = '';
			t.input.focus();
		}
		t.SetCaretPos = function(position) {
			if (t.input.selectionStart) {
				t.input.selectionStart = position;
				t.input.selectionEnd = position; t.input.focus();
			}
			else {
				var range = t.input.createTextRange();
				range.moveStart('character', position);
				range.collapse();
				range.select();
			}
		}
		$(input)
			.click(t.UpdateSelection)
			.focus(t.UpdateSelection)
			.select(t.UpdateSelection)
			.keyup(t.UpdateSelection)
			.keydown(t.UpdateSelection);
		return t;
	}
})();

