function CatalogueSearchArticul(sFormId)
{
	this.sFormId = sFormId;
	
	this.oFilterForm = null;
	this.aFilterFormElements = [];
	
	this.oReset = null;

	this.oAjaxProvider = null;
	
	this.iTimeout = null;

	this.oJSONResponse = null;

	this.oSubmitButton = null;
	
	this.init();
}

CatalogueSearchArticul.prototype.appendParam = function(sName, sValue)
{
	this.oAjaxProvider.addParameter(sName, sValue);
}

CatalogueSearchArticul.prototype.build = function()
{
	var oThis = this;

	this.oAjaxProvider = new Ajax('/services/');

	this.oAjaxProvider.setCallbackHandler(
		function(x){
			setTimeout( function(){ oThis.ajaxCompleteDraw(x); },  1);
		}
	); 
	
	this.oAjaxProvider.setCallbackErrorHandler(
		function(x){
			setTimeout( function(){ oThis.ajaxFailureDraw(x); },  1);
		}
	); 

	this.oAjaxProvider.addParameter('action', 'search');

	for (var i = 0; i < this.aFilterFormElements.length; i++) {
		var oElement = this.aFilterFormElements[i];
		if (hasClassName(oElement, 'skip')) {
			continue;
		}
		
		if ((oElement.type.match(/(checkbox|radio)/) && oElement.checked) || oElement.type.match(/(text)/) || oElement.type.match(/(hidden)/)) {
			if (oElement.name) {
				this.appendParam(oElement.name, oElement.value);
			}
		}
	}
}

CatalogueSearchArticul.prototype.ajaxStartLoadingDraw = function()
{
	addClassName(this.oFilterForm, 'dummy');
}


CatalogueSearchArticul.prototype.ajaxCompleteDraw = function(oResponse)
{
	this.oJSONResponse = eval('(' + oResponse.responseText + ')');
	
	var oJSON = this.oJSONResponse;
	var iCount = parseInt(oJSON.count);

	for (var i = 0; i < this.aFilterFormElements.length; i++) {
		
		var oElement = this.aFilterFormElements[i];
		var oParentElement = getParentElement(oElement, 'div');
		
		removeClassName(oParentElement, 'dummy');
	}

	if (iCount > 0) {
		this.oSubmitButton.value = 'Показать ' + iCount + ' ' + getRightCase(iCount, ['предмет', 'предмета', 'предметов']);
		this.oSubmitButton.removeAttribute('disabled');
	} else {
		this.oSubmitButton.value = 'Найти';
		this.oSubmitButton.setAttribute('disabled', 'disabled');
	}

	removeClassName(this.oFilterForm, 'dummy');
}


CatalogueSearchArticul.prototype.ajaxFailureDraw = function()
{
	oThis.iTimeout = setTimeout( function(){ oThis.rebuild(); }, 200); 
}

CatalogueSearchArticul.prototype.rebuild = function()
{
	if (this.iTimeout) {
		this.build();
		this.transfer();
	}
}

CatalogueSearchArticul.prototype.prevent = function()
{
	clearTimeout(this.iTimeout);
}

CatalogueSearchArticul.prototype.transfer = function()
{
	this.ajaxStartLoadingDraw();
	this.oAjaxProvider.transfer();
}

CatalogueSearchArticul.prototype.setChangeEvents = function()
{
	for (var i = 0; i < this.aFilterFormElements.length; i++) {
		var oElement = this.aFilterFormElements[i];
		this.setChangeEvent(oElement);
	}
}

CatalogueSearchArticul.prototype.setChangeEvent = function(oElement)
{
	var oThis = this;
	
	oElement.setAttribute('prev_value', oElement.value);

	var aEventType = oElement.type && oElement.type.toLowerCase() == 'text' ? ['keyup'] : ['click'];

	for (var i = 0; i < aEventType.length; i++) {
		var sEventType = aEventType[i];

		addEvent(oElement, sEventType, function(oEvent){
			oThis.prevent();
			
			var iKeyCode = getEventKeyCode(getEvent(oEvent));
			if ((sEventType == 'keyup') && (!isValidKeyForSuggest(iKeyCode) && iKeyCode != 17)) {
				return;
			}

			var oParentElement = getParentElement(oElement, 'div');
			if (oElement.checked) {
				addClassName(oParentElement, 'checked');
			} else {
				removeClassName(oParentElement, 'checked');
			}
			
			var iT = sEventType == 'keyup' ? 100 : 1;
			oThis.iTimeout = setTimeout( function(){ oThis.rebuild(); }, iT); 
		});
	}

	//qiuck stub for real change
	if (oElement.type.toLowerCase() == 'text') {
		var itv = setInterval( 
			function() {
				if (oElement.value != oElement.getAttribute('prev_value')) {
					oElement.setAttribute('prev_value', oElement.value);
				
					oThis.rebuild();
				}
			}, 
		100); 
	}
	
}

CatalogueSearchArticul.prototype.init = function()
{
	var oThis = this;

	this.oFilterForm = $$(this.sFormId);
	this.aFilterFormElements = this.oFilterForm.getElementsByTagName('input');

	this.setChangeEvents();
	
	this.oSubmitButton = $$('articul-filter-submit');

	this.iTimeout = setTimeout( function(){ oThis.rebuild(); },  1); 
}


addEvent(window, 'load', function() { new CatalogueSearchArticul('zf2'); });


