var CallBack = {
	
	debug: false,
	
	serverTimeSource: '/php_lib/callback/time.php',
	requestSource: '/php_lib/callback/callback_handler.php',

	intervals: [10, 12, 14, 16, 18],
	
	Config: {
		week: { start: 10, end: 18 },
		holiday: { start: 10, end: 17 }
	},
	
	overs: [],
	
	DOMReady: function() {

		MooTools.lang.setLanguage("ru-RU-unicode");
		
		this.server_time = 0;
		this.backdrop = $('backdrop');
		this.callBack = $('call-back');

		$('i-cb-time').addEvent('focus', function() {
			$('i-cb-today').set('checked', 'checked');
		});

		this.tips = new Tips('.help', { className: 'tooltip', fixed: true });
		
	 	this.TimeZone.init();

		$('i-cb-form').addEvent('submit', function() {
			return(false);
		});
		
		Form.Validator.addAllThese([
		    ['valid-sub-number', {
					errorMsg: function(){
						$('i-cb-phone-error').set('text', 'Неверный формат добавочного номера. Разрешено: 0-9, от трех до пяти символов.').removeClass('i-hidden');
						return(false);
					}, 
					test: function(element) {
						$('i-cb-phone-error').addClass('i-hidden');
						if ( element.get('value') == '' ) return(true); else return(element.get('value').test('^[0-9]{3,5}$'));
					} 
			}],
		    ['valid-order-number', {
					errorMsg: 'Неверный номер заказа.',
					test: function(element) {
						var number = element.get('value');
						if ( element.get('value') == '' ) return(true); else return(number.test('^[0-9]*$'));
					} 
			}],
		    ['valid-phone-number', {
					errorMsg: 'Неверный формат телефонного номера. Разрешено: 0-9, -, +, (, ), пробел, минимум одиннадцать символов.',
					test: function(element) {
						var number = element.get('value');
						var r = new RegExp('^[0-9\u0028\u0029\u002B\\u002D\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029]{11,}$','g');
						return(number.test(r));
					} 
			}]
		]);		
		
		var v = new Form.Validator.Inline('i-cb-form', {
			useTitles: true,
			errorPrefix: '',
			evaluateFieldsOnBlur: false,
			evaluateFieldsOnChange: false,
			onFormValidate: function(status){
				if ( status )  this.sendRequest();
			}.bind(this)
		});
	},
	
	toggleCommentField: function() {
		var value = 'Добавить комментарий' == $('comment-link').get('text') ? 'Убрать комментарий' : 'Добавить комментарий';
		$('comment-link').set('text', value);
		$('i-cb-comment').toggleClass('i-hidden');
	},
	
	isInit: false,
	
	show: function() {

		$('i-cb-success').addClass('i-hidden');
		$('i-cb-inner').removeClass('i-hidden');
		
		this.showBackdrop();
		this.clickHandler = this.hide;
		this.backdrop.addEvent('click', this.clickHandler.bind(this, false))
		
		this.callBack.removeClass('i-hidden');
		this.callBackReposition();

		this.resizeHandler = this.callBackReposition;
		window.addEvent('resize', this.resizeHandler.bind(this));
		
		new Request.JSON({
			url: this.serverTimeSource,
			onComplete: function(time) {
				this.server_time = time;
				this.MSKTime = new Date(time*1000);
				this.currentTime = this.MSKTime.clone();
				this.updateTime();
			}.bind(this)
		}).post({
			'action': 'getServerTime'
		});
		
		this.keyPressHandler = this.onKeyPress.bindWithEvent(this);
		document.addEvent('keypress', this.keyPressHandler)


		if ( !CallBack.isInit ) {
			$(document.body).getElements('input.over-text').each(function(element){
				this.overs.push(new OverText(element));
			}.bind(this));		
			CallBack.isInit = false;	
		}
		
	},
	
	updateTime: function() {
		CallBack.currentTime = CallBack.MSKTime.clone();
		CallBack.currentTime.increment('hour', this.TimeZone.zone);
		
		$('i-cb-time').empty();
		$('i-current-time').set('text', this.currentTime.format('%H:%M')+' GMT+'+(3 + this.TimeZone.zone));
		$('time-zone-hook').set('text', this.TimeZone.dir[this.TimeZone.zone]);
		
		var isSat = 6 == this.MSKTime.format('%w');
		var isSun = 0 == this.MSKTime.format('%w');
		var tomorrow = this.MSKTime.clone().increment();
		var isSatTomorrow = 6 == tomorrow.format('%w');
		var work = isSat ? this.Config.holiday : this.Config.week;

		var hour = this.MSKTime.getHours().toInt();
		if ( hour<work.start || hour>work.end ) {
			// Не рабочее время
			$('i-cb-now').set('disabled', 'disabled');
			$('i-cb-today').set('checked', 'checked');
		} else {
			// Рабочее время
			$('i-cb-now').set('checked', 'checked');
		}
		
		var tIntervals = this.getIntervals();
		
		// Рабочие часы и до начала дня
		if ( (hour>=work.start && hour<work.end) || hour < work.start && !isSun ) {
			// Ищем ближайший интервал
			var nearest;
			this.intervals.each(function(value){
				if ( value >= hour && !nearest ) nearest = value;
			});
			

			$('i-cb-now').set('value', this.server_time+'-'+this.server_time);
			this.addOption(this.getInterval(nearest, work.end), 'Сегодня');
			$each(tIntervals, function(item, key){
				if ( key >= nearest && !isSat || (key >= nearest  && isSat && key != 18) ) this.addOption(item.value, item.label);
			}.bind(this));
		}
		// Следующий день, понедельник
		var workTomorrow = isSatTomorrow ? this.Config.holiday : this.Config.week;
		
		var next = this.MSKTime.clone();
		
		// Сегодня суббота
		if ( isSat ) {
			this.addOption(this.getInterval(this.Config.week.start, this.Config.week.end, next.increment('day', 2)), 'Понедельник'); 
		} else {
			this.addOption(this.getInterval(workTomorrow.start, workTomorrow.end, next.increment()), 'Завтра');
		}

		var nIntervals = this.getIntervals(next, ( isSatTomorrow ? '' :'')+( isSat ? '' : ''));
		
		$each(nIntervals, function(item, key){
			if ( !isSatTomorrow || ( isSatTomorrow && key != 18) ) this.addOption(item.value, item.label);
		}.bind(this));
	},

	onKeyPress: function(e) {
		e = new Event(e);
		if ( 'submit' != $(e.target).get('type') && 'enter' == e.key && 'textarea' != $(e.target).get('tag') ) {
			e.preventDefault();
		}
	},
	
	sendRequest: function(e) {
		var request = {
			'action': 'sendRequest'
		};
		request.phone = $('i-cb-phone').get('value');
		if ( $('i-cb-subnumber').get('value') ) request.subnumber = $('i-cb-subnumber').get('value');
		if ( $('i-cb-number').get('value') != '' ) request.number = $('i-cb-number').get('value');
		if ( $('i-cb-name').get('value') != '' ) request.name = $('i-cb-name').get('value');
		if ( !$('i-cb-comment').hasClass('i-hidden') && $('i-cb-comment').get('value') ) request.comment = $('i-cb-comment').get('value');
		if ( $('i-cb-now').get('checked') ) request.when = $('i-cb-now').get('value');
		if ( $('i-cb-today').get('checked') ) {
			var value = $('i-cb-time').get('value');
			request.when = value;
		}
		
		request.zone = this.TimeZone.zone;
		request.nearestCity = this.TimeZone.dir[this.TimeZone.zone]; 
		
		new Request.JSON({
			url: this.requestSource,
			onComplete: function(data) {
				var msg = data && 'OK' == data.status ? 'Спасибо.<br>Ожидайте звонка.' : 'Сервис временно недоступен.<br>Попробуйте воспользоваться им позже.';
				$('i-cb-success').set('html', msg).removeClass('i-hidden');
				$('i-cb-inner').addClass('i-hidden');
				$('i-cb-comment').set('value', '').addClass('i-hidden');
				this.clearForm();
			}.bind(this)
		}).post(request);
	},
	
	addOption: function(value, text) {
		new Element('option', { value: value, text: text }).inject($('i-cb-time'));
	},
	
	getInterval: function(start, end, date) {
		date = date || this.MSKTime.clone();
		var d = date.format('%x ');
		d = d.split('/');
		d = d[1]+'/'+d[0]+'/'+d[2];
		var dStart = new Date().parse(d+' '+start+':00:00 GMT+0300');
		var dEnd= new Date().parse(d+' '+end+':00:00 GMT+0300');
		return(Math.ceil(dStart.getTime()/1000)+'-'+Math.ceil(dEnd.getTime()/1000));
	},
	
	getHour: function(start, date) {
		date = date || this.MSKTime.clone();
		var d = date.format('%x ');
		d = d.split('/');
		d = d[1]+'/'+d[0]+'/'+d[2];
		var dStart = date.clone().parse(d+' '+start+':00:00 GMT+0300');
		dStart.increment('hour', this.TimeZone.zone);
		return(dStart.format('%H'));
	},
	
	getIntervals: function(date, add) {
		add = add || ''
		date = date ||  this.MSKTime.clone();
		var intervals = {};
		this.intervals.each(function(value){
			intervals[value] = {
				label: this.getHour(value, date)+':00'+'—'+this.getHour(value + (value == 18 ? 1 : 2), date)+':00'+add,
				value: this.getInterval(value, value + (value == 18 ? 1 : 2), date)
			};
		}.bind(this));
		return(intervals);
	},
	
	callBackReposition: function() {
		this.callBack.setStyles({
			'left': document.getWidth()/2 - this.callBack.getWidth()/2,
			'top': document.getHeight()/2 - this.callBack.getHeight()/2
		});
		$('time-zone').addClass('i-hidden');		
	},
	
	hide: function(clear) {
		this.hideBackdrop();
		this.backdrop.removeEvent('click', this.clickHandler);
		
		this.callBack.addClass('i-hidden');

		window.removeEvent('resize', this.resizeHandler);
		
		document.removeEvent('keypress', this.keyPressHandler);
		
		if ( clear ) this.clearForm();
		$('time-zone').addClass('i-hidden');
	},
	
	clearForm: function() {
		$('i-cb-inner').getElements('input[type="text"], textarea').each(function(element){
			$(element).set('value', '');
		});

		$(document.body).getElements('.overTxtLabel').each(function(item){
			$(item).setStyle('display', 'block');
		});
		
	},
	
	showBackdrop: function() {
		this.backdrop.setStyle('opacity', 0.5).removeClass('i-hidden');
		if ( Browser.Engine.trident ) {
			this.backdrop.setStyles({
				position: 'absolute',
				left: 0,
				top: 0,
				width: document.getWidth(),
				height: document.getHeight()
			});
		}
	},
	
	hideBackdrop: function() {
		this.backdrop.addClass('i-hidden');
	},

	TimeZone: {
		
		dir: {
			'-1': 'Калининград',
			'0': 'Москва',
			'2': 'Екатеринбург',
			'3': 'Новосибирск',
			'4': 'Красноярск',
			'5': 'Иркутск',
			'6': 'Чита',
			'7': 'Владивосток',
			'8': 'Магадан'
		},
		
		zone: 0, 
		
		init: function() {
			var ul = $('time-zone').getElement('div.list');
			$each(this.dir, function(item, key) {
				if ( key>=0 ) key = '+'+key;
				var checked = key == 0 ? ' checked="checked"': '';
				new Element('label', {
					html: '<input type="radio" name="time-zone" value="'+key+'"'+checked+' onclick="CallBack.TimeZone.select('+key+')"> <b>'+key+'</b> <i>GMT+'+(3+key.toInt())+'</i>, '+item
				}).inject(ul);
			});
		},
	
		select: function(zone) {
			this.zone = zone.toInt();
			this.toggleFrame();
			CallBack.updateTime();
		},
		
		toggleFrame: function() {
			var c = $('time-zone-hook').getPosition();
			$('time-zone').setStyles({
				left: c.x,
				top: c.y + $('time-zone-hook').getHeight() + 2
			}).toggleClass('i-hidden');
		}
		
	}
	
}

window.addEvent('domready', CallBack.DOMReady.bind(CallBack));
