/*****************************
**   AJAX
******************************/

/*
	url - откуда загружаем
	ajaxCallBackFunction - что вызываем по завершении загрузки
	callObject - методом какого объекта является ajaxCallBackFunction (если это метод, а не глобальная фунция)
	params - параметры в виде объекта или массива
	ajaxCallBackErrorFunction - необязательная функция, обрабатывающая ошибки соединения
*/

function ajaxLoad(url, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction) {
	// branch for native XMLHttpRequest object
	if (window.XMLHttpRequest) {
		var ajaxObject = new XMLHttpRequest();
		ajaxObject.onreadystatechange = function(){
			ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction);
		}
		ajaxObject.open("GET", url, true);
		ajaxObject.send(null);
	// branch for IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		var ajaxObject = new ActiveXObject("Microsoft.XMLHTTP");
		if (ajaxObject) {
			ajaxObject.onreadystatechange = function(){
				ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction);
			}
			ajaxObject.open("GET", url, true);
			ajaxObject.send();
		}
	}
}

function ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction){
	// only if req shows "complete"
	if (ajaxObject.readyState == 4) {
		// only if "OK"
		if (ajaxObject.status == 200) {
			// ...processing statements go here...
			ajaxCallBackFunction.call(callObject, ajaxObject, params);
		} else {
			if(ajaxCallBackErrorFunction){
				ajaxCallBackErrorFunction.call(callObject, ajaxObject);	
			} else {
				futu_alert(("There was a problem retrieving the data:\n" + ajaxObject.statusText), true, 'rock_red');
				$A(document.getElements('.js-loading')).each(function (el) {
					el.removeClass('js-loading');
				});
			}
		}
	}
}


function ajaxLoadPost(url, data, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction) {
	var ajaxObject = null;
	
	if (window.XMLHttpRequest) { // branch for native XMLHttpRequest object
		ajaxObject = new XMLHttpRequest();
	} else if (window.ActiveXObject) { // branch for IE/Windows ActiveX version
		var ajaxObject = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if(ajaxObject){
		ajaxObject.onreadystatechange = function(){
			ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction);
		}
		ajaxObject.open("POST", url, true);
		ajaxObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		ajaxObject.setRequestHeader("Content-length", data.length);
		ajaxObject.setRequestHeader("Connection", "close");
		ajaxObject.send(data);	
	}
}

/* AJAX handlers */
ajaxHandler = {
	alertError : function (message) {
		if (message && message != '') {
			futu_alert(message, false, 'red');
		} else {
			futu_alert('Ошибка без названия.', false, 'red');
		}
	},
	checkResponse : function (ajaxObj, text) {
		if (text) {
			var response = JSON.decode(ajaxObj);
		} else {
			var response = JSON.decode(ajaxObj.responseText);
		}
		
		//var response = JSON.decode(ajaxObj);
		if (!$defined(response)) {
			ajaxHandler.alertError('Сервер почему-то ничего не ответил.');
			return false;
		}
		
		if (!response.status) {
			ajaxHandler.alertError('Сервер ни с того, ни с сего сообщил следующее: «' + ajaxObj.responseText + '»');
			return false;
		}
		
		if (response.status == 'ERR') {
			ajaxHandler.alertError(response.message);
			return false;
		}
		
		if (response.status == 'OK') {
			if (!response.message) {
				return response;
			} else {
				ajaxHandler.alertError(response.message);
				return response;
			}
		} else {
			ajaxHandler.alertError('Сервер не сообщил об ошибке, но и не подтвердил, что всё прошло хорошо.');
			return response;
		}
	},
	highlightField : function (input, bg_color, highlight_color) {
		var input = $(input);
		var bg_color = bg_color || '#FFFFFF';
		var highlight_color = highlight_color || '#FF0000';
		var loadingHighlightFx = new Fx.Tween($(input),  {'link':'cancel', 'onComplete' : function () {
			$(input).erase('style');
		}});
		input.style.backgroundColor = highlight_color;
		loadingHighlightFx.start('background-color', highlight_color, bg_color);
	},
	loadingHighlight : function (params) {
		var button = $(params.button);
		params.attribute = params.attribute || 'background-color';
		params.timing = params.timing || 333;
		var fx = new Fx.Tween($(button),  {'duration':params.timing, 'onComplete' : function () {
			if ($(button).hasClass('js-lh_to_color_2')) {
				fx.start(params.attribute, params.color1, params.color2);
				$(button).removeClass('js-lh_to_color_2');
			} else {
				if (params.loadingCheck()) {
					fx.start(params.attribute, params.color2, params.color1);
					$(button).addClass('js-lh_to_color_2');
				} else {
					if (params.transparent) {
						$(button).erase('style');
					}
					$(button).removeClass('js-lh_active');
				}
			}
		}});
		if ($(button).hasClass('js-lh_active')) {
			(function () {
				if (params.loadingCheck()) {
					fx.start(params.attribute, params.color2, params.color1);
					$(button).addClass('js-lh_to_color_2');
					$(button).addClass('js-lh_active');
				}
			}).delay(params.timing);
		} else {
			fx.start(params.attribute, params.color2, params.color1);
			$(button).addClass('js-lh_to_color_2');
			$(button).addClass('js-lh_active');
		}
		return fx;
	}
};

utils = {
	getPlural : function (num, texts) {
		var n = num % 100;
		var n1 = num % 10;
		if (n > 10 && n < 20) return texts[2];
		if (n1 > 1 && n1 < 5) return texts[1];
		if (n1 == 1) return texts[0];
		return texts[2];
	},
	focusText : function (input, text, input_holder) {
		input = $(input);
		if (!input_holder) {
			var input_holder = input;
		}
		input.addEvent('focus', function () {
			if (input.value == text) {
				input.value = '';
				input_holder.removeClass('js-input_default');
			}
			input_holder.addClass('js-input_focus');
		});
		input.addEvent('blur', function () {
			if (input.value == '') {
				input.value = text;
				input_holder.addClass('js-input_default');
			} else {
				input_holder.removeClass('js-input_default');
			}
			input_holder.removeClass('js-input_focus');
		});
	}
};

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			   string: navigator.userAgent,
			   subString: "iPhone",
			   identity: "iPhone/iPod"
	    },
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

function futu_alert(text, close, className) {
	if (!$('futu_alerts_holder')) {
		var futuAlertOuter = new Element('div', {
			'class' : 'futu_alert_outer'
		}).injectInside(document.body);
	
		var futuAlertFrame = new Element('div', {
			'class' : 'frame'
		}).injectInside(futuAlertOuter);
	
		new Element('div', {
			'class' : 'futu_alerts_holder',
			'id' : 'futu_alerts_holder'
		}).injectInside(futuAlertFrame);
	}
	$('futu_alerts_holder').setStyle('left', window.getSize().x/2 - 200);
	var className = className || ''; 
	var futuAlert = new Element('div', {
		'class' : ('futu_alert '+className)
	}).injectTop($('futu_alerts_holder'));
	
	futuAlert.set('morph', {duration: 222});
	if (close) {
		var futuAlertCloseButton =  new Element('a', {
			'href' : '#',
			'class' : 'futu_alert_close_button',
			'events' : {
				'click' : function (event) {
					if (!Browser.Engine.trident) event.preventDefault(); else event.returnValue = false;
					
					futuAlert.morph({
						'opacity':0,
						'width':'250px'
					});
					(function () {
						futuAlert.setStyle('display','none');
						futuAlert.destroy();
					}).delay(500);
				}
			}
		}).injectInside(futuAlert);
	}
	
	var futuAlertText =  new Element('div', {
		'class' : 'futu_alert_text'
	}).injectInside(futuAlert);
	
	futuAlertText.innerHTML = text;
	
	futuAlert.setStyles({
		'position':'relative',
		'top':'0',
		'margin-top':-futuAlert.getSize().y + 'px',
		'opacity':0,
		'width':'250px'
	});
	futuAlert.morph({
		'margin-top':0,
		'opacity':1,
		'width':'400px'
	});
	if (!close) {
		(function () {
			futuAlert.morph({
				'opacity':0,
				'width':'250px'
			});
			
		}).delay(5000);
		
		(function () {
			futuAlert.setStyle('display','none');
			futuAlert.destroy();
		}).delay(5500);
	}
}

formHandler = {
	setSex : function (button, sex) {
		if (!$(button).hasClass('k-form_sex_active')) {
			if ($(button).getParent('.b-form_field').getElement('.k-form_sex_active')) {
				$(button).getParent('.b-form_field').getElement('.k-form_sex_active').removeClass('k-form_sex_active');
			}
			$(button).addClass('k-form_sex_active')
		}
		$('js-form_sex_input').disabled = false;
		if (sex == 'male') {
			$('js-form_sex_input').value = '0';
		} else {
			$('js-form_sex_input').value = '1';
		}
	},
	checkFields : function () {
		if ($('js-form_email_input').value.trim().length == 0) {
			futu_alert('Обязательно укажите свой e-mail.');
			ajaxHandler.highlightField($('js-form_email_input'), '#6FB8CC');
			return false;
		}
		if (!$('js-agreement_checkbutton').checked) {
			futu_alert('Обязательно прочитайте и примите соглашение об использовании личных данных.');
			ajaxHandler.highlightField($('js-agreement_checkbutton'), '#6FB8CC');
			return false;
		}
		if ($('js-form_name_input').value.trim().length == 0) {
			futu_alert('Представьтесь, пожалуйста.');
			ajaxHandler.highlightField($('js-form_name_input'), '#6FB8CC');
			return false;
		}
		if ($('js-form_surname_input').value.trim().length == 0) {
			futu_alert('Ваша фамилия нам тоже поднадобится.');
			ajaxHandler.highlightField($('js-form_name_input'), '#6FB8CC');
			return false;
		}
		if ($('js-form_birth_day_select').value != '' || $('js-form_birth_month_select').value != '' || $('js-form_birth_year_select').value != '') {
			if ($('js-form_birth_year_select').value == '') {
				futu_alert('Укажите год своего рождения.');
				ajaxHandler.highlightField($('js-form_birth_year_select').getParent('.b-form_field'), '#6FB8CC');
				return false;
			}
			if ($('js-form_birth_month_select').value == '') {
				futu_alert('Укажите месяц своего рождения.');
				ajaxHandler.highlightField($('js-form_birth_month_select').getParent('.b-form_field'), '#6FB8CC');
				return false;
			}
			if ($('js-form_birth_day_select').value == '') {
				futu_alert('Укажите день своего рождения.');
				ajaxHandler.highlightField($('js-form_birth_day_select').getParent('.b-form_field'), '#6FB8CC');
				return false;
			}
		}
		return true;
	},
	showOverlay : function (e) {
		e = new Event(e);
		e.stopPropagation();
		e.preventDefault();
		$('js-overlay').removeClass('pos_hidden');
		$('js-overlay').setStyle('top', $(document.body).getScroll().y + 20);
		$('js-overlay').addEvent('click', function (e) {
			e = new Event(e);
			e.stopPropagation();
		});
		$(document.body).addEvent('click', function () {
			if (!$('js-overlay').hasClass('pos_hidden')) {
				$('js-overlay').addClass('pos_hidden');
			}
		});
	}
};

if (Browser.Engine.trident && Browser.Engine.version  < 5) {
	window.addEvent('domready', function() {
		DD_belatedPNG.fix('.js-png_bg');
	});
}
window.addEvent('domready', function() {
	if ($('js-slider_1')) {
		var sliders = [];
		document.onselectstart =  function () { };
		for (var i=1; i <= 15; i++) {
			sliders.push(new Slider($('js-slider_' + i), $('js-slider_knob_' + i), {
				range : [1,11],
				steps : 11,
				initialStep : 6,
				onChange : function (step) {
					this.element.getParent('.b-question').getElement('.js-slider_input').value = step;
					document.onselectstart =  function () { return false; };
				}
			}));
			$('js-slider_' + i).getElement('.b-knob').ondrag = function () { return false; };
		}
	}
});
