var KartDB = {
	
	Number: {
		
		kartClass: 1,
		init: false,
		
		initialize: function() {
			var e = $('numbers-select');
			for (var i=1;i<=99;i++) {
				var li = new Element('li', { 
					'text': i,
					'id': 'number-'+i,
					'class': 'with-tooltip'
				}).inject(e);
			}
			e.addEvent('click', this.onClick.bindWithEvent(this));
			$('numbers-form').addEvent('submit', this.onSubmit.bind(this));
			this.init = true;
		},
		
		onSubmit: function() {
			var out = [];
			$('numbers').getElements('div[id]').each(function(element){
				if ( element.getElement('.color').get('text') != '' ) {
					var id = element.id.split('-')[2];
					var number = $(element.getElement('div.color')).get('text');
					var count = $(element.getElement('input')).get('value');
					out.push([id, number, count].join(':'));
				}
			});
			if ( out.length ) {
				out = out.join(' ');
				$('selected-numbers').set('value', out);
			}
			return(true);
		},
		
		onClick: function(e) {
			e = new Event(e);
			var target = $(e.target);
			var tag = target.get('tag');
			if ( 'li' == tag && !target.hasClass('assigned') ) {
				this.number = target.get('text');
				this.set(this.kartClass, this.number);
				this.hidePanel();
			}
		},
	
		select: function(kartClass) {
			if ( $('numbers-select').hasClass('hidden') ) this.showPanel(); else this.hidePanel();
			this.kartClass = kartClass;
			var r = new Request.JSON({
				url: '/stream/numbers.php',
				onComplete: function(data) {
					$('numbers-select').getElements('li').each(function(element){
						element.removeClass('assigned').erase('title').setStyle('opacity', 1);
					});
					if ( data.length ) {
						data.each(function(item){
							$('number-'+item['number']).addClass('assigned').set('title', item['name']).setStyle('opacity', 0.3);
						});
					}
					
				}.bind(this)
			}).post({
				kartClass: kartClass
			});
		},
		
		clear: function(kartClass) {
			$('kart-class-'+kartClass).getElement('span').addClass('invisible');
			$('kart-class-'+kartClass).getElement('.color').set('text', '');
		},
		
		showPanel: function() {
			$('numbers-select').removeClass('hidden').setStyles({
				'left': document.body.getWidth()/2 - $('numbers-select').getWidth()/2,
				'top': document.body.getHeight()/2 - $('numbers-select').getHeight()/2
			});
		},
		
		hidePanel: function() {
			$('numbers-select').addClass('hidden');
		},
		
		set: function(kartClass, number) {
			var span = $('kart-class-'+kartClass).getElement('span').toggleClass('invisible');
			$(span).getElement('.color').set('text', number);
		}
		
	},
	
    GMap: {
	
		draw: function(hook, address) {
       		if (GBrowserIsCompatible()) {
    			var map = new GMap2(hook);
				if ( !this.geocoder ) this.geocoder = new GClientGeocoder();
			 	this.geocoder.getLatLng(address,
	                function(point) {
	                  if ( point ) {
	                    map.setCenter(point, 10);
	                    var marker = new GMarker(point);
	                    map.addOverlay(marker);
	                  }
	            }.bind(this));				
			}
		}
        
    },

	initialize: function() {
		MooTools.lang.setLanguage("ru-RU-unicode");
		
		Form.Validator.add('custom-user-exists', {
		    errorMsg: 'Такой пользователь уже существует',
		    test: function(element) {
				var value = element.get('value');
				return(this.validateOnServer('custom-user-exists', value));
			}.bind(this)
		});

		Form.Validator.add('custom-licence-exists', {
		    errorMsg: 'Такая лицензия уже зарегистрирована',
		    test: function(element) {
				var value = element.get('value');
				return(this.validateOnServer('custom-licence-exists', value));
			}.bind(this)
		});
		
		// OverTexts из классы over-text
		$(document.body).getElements('.over-text').each(function(element){
			var o = new OverText(element, {
				wrap: false
			});
		});
		
		// Формы для проверки
		$(document.body).getElements('form.with-validators').each(function(element){
			var v = new Form.Validator(element, {
				evaluateFieldsOnBlur: false,
				evaluateFieldsOnChange: false,
				onElementFail: function(element, validators) {
					var line = $(element).getParent('div.line');
					if ( line ) {
						var container = $('errors-'+element.get('name'));
						if ( !container ) {
							var container = new Element('div', { id: 'errors-'+element.get('name'), 'class': 'error-container' }).inject(line, 'after');
						} else container.empty();
						validators.each(function(validator){
							var el = new Element('div', { 'text': this.getValidator(validator).getError(element) }).inject(container);
						}.bind(this));
					}
				},
				onElementPass: function(element) {
					var container = $('errors-'+element.get('name'));
					if ( container ) container.empty();
				}
			});
		});
		
		// Карты
		$$('.map').each(function(host){
			var address = $(host).get('alt');
			if ( address ) this.GMap.draw(host, address); 
		}.bind(this));
		
	},
	
	validateOnServer: function(validator, value) {
		new Request.JSON({
			url: '/stream/validators.php',
			async: false,
			onComplete: function(data) {
				this.validateResult = data;
			}.bind(this)
		}).post({
			validator: validator,
			value: value
		});
		return(this.validateResult);
	}
	
}

document.addEvent('domready', KartDB.initialize.bind(KartDB));
