/* JavaScript calculator */

var Calculator = (function() {

	var Setts = {
		loader: '/service-to-loader.xgi',
		imgLoader: '/images/ajax-loader.gif'
	}

	// Calc form
	var $F,
		$Inputs,
		$Result,
		bLoading = false;

	/**
	 * _init
	 */
	function _init( form ) {
		$F = $( form );

		if( $F ) {
			$Inputs = $F.find(':input[type!=hidden][type!=image]');

			//console.log( $Inputs );

			_initRels( $F.find('select[rel]') );

			$F.bind('submit', _calculate);
		}

		$Result = $('#calculator_result');

		// Img preloading
		var _cache = new Image();
		_cache.src = Setts.imgLoader;
	}
	
	/**
	 * _initRels
	 */
	function _initRels( $rels ) {

		$rels.each(function() {
			var t = $(this).get(0);
			t.selectedIndex = 0;
		});

		$rels.bind('change', function() {
			var t = $(this);

			_getData( 
				$('#' + t.attr('rel')), 
				{
					url: Setts.loader, 
					q: t.attr('name') + '=' + t.val()
				}
			);
		});
	}

	/**
	 * _checkForm
	 */
	function _checkForm( form ) {

		var bValid = true;

		if( bLoading ) {
			return false;
		}

		$Inputs.each( function() {
			var value = $(this).val();
			if( !value.length || value == '-1' ) {

				$( this ).focus();
				bValid = false;

			}
		});

		return bValid;

	}

	/**
	 * _getData
	 */
	function _getData( select, param ) {
		if( !select || bLoading ) {
			return false;
		}

		bLoading = true;

		select.attr('disabled', 'true');

		var _imgLoader = select.siblings('img');
		_imgLoader.show();
		
		var _url = param.url + '?' + param.q + '&ajax=' + (new Date().getTime());
		$.getJSON( _url, function( data ) {

			if( data ) {
				var options = _processData( data );

				if( options ) {
					select.html('');

					select.get(0).appendChild( options.cloneNode(true) );

					select.attr('disabled', '');
				}
			}

			_imgLoader.hide();
			bLoading = false;

		});
	}

	/**
	 * _processData
	 */
	function _processData( jsonObj ) {
		var fragment = document.createDocumentFragment();

		//fragment.appendChild( new Option('Выберите', -1) );
		fragment.appendChild( addOption('Выберите', -1) );

		$.each( jsonObj, function(i, val) {
			fragment.appendChild( addOption(val, i) );
		});
		
		return fragment;
	}

	/**
	 * _showResult
	 */
	function _showResult( jsonObj ) {
		if( typeof jsonObj.price !== "undefined" ) {
			$Result.html('<p><span class="h h_result">Итого:</span> <span class="value">' + jsonObj.price + ' руб.</span></p>')
		} else {
			$Result.html('<p>Извините, по вашему запросу ничего не найдено</p>')
		}
	}

	/**
	 * _calculate
	 */
	function _calculate() {
		if( !$F ) {
			return;
		}

		if( !_checkForm( $F ) ){
			return false;
		}

		var q = '';
		$Inputs.each( function() {
			q += $(this).attr('name') + '=' + $(this).val() + '&';
		});

		var _url = Setts.loader + '?' + q + 'ajax=' + (new Date().getTime());
		$.getJSON(_url, function( data ) {

			$Result.html('');

			if( data ) {
				_showResult( data );
				//console.log( data );
			}

		});

		return false;
	}


	/**
	 * _reset
	 */
	function _reset( $F ) {
		//$F.get(0).reset();
	}


	function addOption( text, value, isDefaultSelected, isSelected ) {
		var oOption = document.createElement("option");
		oOption.appendChild(document.createTextNode(text));
		oOption.setAttribute("value", value);

		if( isDefaultSelected ){
			oOption.defaultSelected = true;
		} else if( isSelected ) {
			oOption.selected = true;
		}

		//oListbox.appendChild(oOption);
		return oOption;
	}


	return {
		init: _init,
		reset: _reset
	}

})();



$(function(){
	
	Calculator.init( $('#calculator') );

	$(window).unload( function(){
		Calculator.reset();
		Calculator = null;
	});

});
