﻿/// <reference path="jquery.js" />

;(function()
{	
	$.fn.depended = function(options, args) {
		return this.each(function() {
			if (typeof options == "string") {
				var elem = $.data(this, "ui-depended");
				if (elem) {
					if (args) {
						elem[options].apply(elem, args);
					}
					else {
						elem[options].apply(elem);
					}
				}
			}
			else {
				if ("SELECT" != this.tagName.toUpperCase()) {
					return;
				}
				else {
					$.data(this, "ui-depended", new $.depended(this, options)); 
				}
			}
		});
	};
	
	$.fn.refreshDepended = function() {
		return this.depended("refresh", null);
	};
	
	$.fn.addDepended = function(dependedArgs) {
		var arr = [];
		arr.push(dependedArgs);
		return this.depended("add", arr);
	};
	
	
	
	$.fn.clear = function() {
		return this.depended("clear", null);
	};
	
	/*
	 * 
	 */
	$.depended = function(container, options) {
		this.element = container;
		this.options = $.extend({}, $.depended.defaults, options || {});
		this.dependedList = [];
		$(this.element).bind("change", function(ev) {
			//Utils.debug("Call change for: " + $(ev.currentTarget).attr("id"));
			var dependedObj = $(ev.currentTarget);
			dependedObj.refreshDepended();
		});
	};
	
	$.depended.prototype = {
		// ************************************************************
		// Интерфейсный метод
		// Обновление значений в контролах после инициализации
		// ************************************************************
		refresh: function() {
			this._internalRefresh();
		},

		// ************************************************************
		// Интерфейсный метод
		// Добавление зависимости для контрола
		// ************************************************************
		add: function(dependedArgs) {
			var depArgs = $.extend({}, $.depended.defaults, dependedArgs || {});
			this.dependedList.push(depArgs);
		},

		// ************************************************************
		// Интерфейсный метод
		// Сброс значений в зависимых контролах
		// ************************************************************
		clear: function() {
			this._internalClear();
		},

		_initDependedItem: function(dependedItem) {
		
		},
		// ************************************************************
		// Возвращает текущее выбранное значение
		// ************************************************************
		getEventValue: function() {
			return $(this.element).val();
		},
		
		// ************************************************************
		// Проверяет нужно ли обновлять зависимый элемент. 
		// Возвращает true если обновление нужно, иначе false
		// ************************************************************
		_getIsRaiseEventForDepended: function(dependedItem) {
			var result = true;
			if (this.getEventValue() == "" || this.getEventValue() == null) {
				result = false;
			}
			else if (dependedItem.eventValues != null 
				&& $.isArray(dependedItem.eventValues)
				&& $.inArray(this.getEventValue(), dependedItem.eventValues) == -1) {
				result = false;
			}
			return result;
		},

		// ************************************************************
		// ************************************************************
		_internalRefresh: function() {
			//Utils.debug("Call _internalRefresh for: " + $(this.element).attr("id"));
			var $this = this;
			$.each(this.dependedList, function(i, dependedItem) {
				$this._internalRefreshItem(dependedItem);
			});
		},
		
		// ************************************************************
		// ************************************************************
		_internalRefreshItem: function(dependedItem)
		{
			if (this._getIsRaiseEventForDepended(dependedItem)) {
				if ($.isFunction(dependedItem.loadCallback)) {
					//Utils.debug("call _internalRefreshItem for: " + dependedItem.container);
					//this._internalClearItem(dependedItem);
					$.autosuggest.activate(dependedItem.container);
					//$(dependedItem.container).removeAttr("disabled");
					dependedItem.loadCallback.call(this, dependedItem);
				}
			}
			else if (dependedItem.clearIfDependencyIsNotActive){
				this._internalClearItem(dependedItem);
			}
		},
		
		_internalClear: function() {
			var $this = this;
			$.each(this.dependedList, function(i, dependedItem) {
				$this._internalClearItem(dependedItem);
			});
		},
		
		_internalClearItem: function(dependedItem) {
			//Utils.debug("Call _internalClearItem for: " + dependedItem.container);
			$(dependedItem.container).empty().clear();
			$.autosuggest.deactivate(dependedItem.container);
			if ($.isFunction(dependedItem.clearCallback)) {
				dependedItem.clearCallback.call(this, dependedItem);
			}
		}
	};
	
	$.depended.defaults = {
		container: null,
		clearIfDependencyIsNotActive: true,
		eventValues: null,
		loadCallback: function(dependedItem) {},
		clearCallback: function(dependedItem) {}
	};
	
})(jQuery); 
