function mainIncludeJS(src) {
	document
			.write(unescape('%3Cscript type="text/javascript" src="' + src + '"%3E%3C/script%3E'));
}

function mainIncludeCSS(href) {
	document
			.write(unescape('%3Clink rel="stylesheet" type="text/css" href="' + href + '"%3E%3C/link%3E'));
}

function mainGetDocumentHeight() {
	return (document.body.scrollHeight > document.body.offsetHeight ? document.body.offsetHeight
			: document.body.scrollHeight) + 70;
}

function mainGetDocumentWidth() {
	return (document.body.scrollWidth > document.body.offsetWidth ? document.body.offsetWidth
			: document.body.scrollWidth);
}

function getWindowHeight() {
	return (jQuery.browser.msie ? document.body.clientHeight
			: window.innerHeight);
}

function getWindowWidth() {
	return (jQuery.browser.msie ? document.body.clientWidth : window.innerWidth);
}

function f_clientWidth() {
	return f_filterResults(
			window.innerWidth ? window.innerWidth : 0,
			document.documentElement ? document.documentElement.clientWidth : 0,
			document.body ? document.body.clientWidth : 0);
}

function f_clientHeight() {
	return f_filterResults(window.innerHeight ? window.innerHeight : 0,
			document.documentElement ? document.documentElement.clientHeight
					: 0, document.body ? document.body.clientHeight : 0);
}

function f_scrollLeft() {
	return f_filterResults(window.pageXOffset ? window.pageXOffset : 0,
			document.documentElement ? document.documentElement.scrollLeft : 0,
			document.body ? document.body.scrollLeft : 0);
}

function f_scrollTop() {
	return f_filterResults(window.pageYOffset ? window.pageYOffset : 0,
			document.documentElement ? document.documentElement.scrollTop : 0,
			document.body ? document.body.scrollTop : 0);
}

function f_filterResults(n_win, n_docel, n_body) {
	var n_result = n_win ? n_win : 0;
	if (n_docel && (!n_result || (n_result > n_docel)))
		n_result = n_docel;
	return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}

function mainInit(module, parm) {
	switch (module) {
	case 'main':
		mainHome = parm;
		mainAjax = mainHome + '/jlib/main.php';
		mainCache = {};
		mainDisable = false;
		mainOpenID = null;
		/*
		 * if (window.jQuery == null || window.jQuery == undefined)
		 * mainIncludeJS(mainHome + '/jlib/jquery.min.js');
		 * mainIncludeJS(mainHome + '/jlib/corners/jquery.corner.js');
		 */
		break;
	case 'events':
		$(
				'a.linkUserRegistration,a.linkPartnerRegistration,a.linkAnalystRegistration')
				.attr('href', 'javascript:void(0);').click(
						mainShowRegistrationWindow);
		$(
				'a.linkUserLogin,a.linkPartnerLogin,a.linkAnalystLogin,a.linkUserLoginForecasts')
				.attr('href', 'javascript:void(0);').click(mainShowLoginWindow);
		$('a.linkUserRemind,a.linkPartnerRemind,a.linkAnalystRemind').attr(
				'href', 'javascript:void(0);').click(mainShowRemindWindow);
		$(document).keydown(
				function(event) {
					if (mainDisable) {
						if (event.metaKey || event.shiftKey || event.altKey
								|| event.ctrlKey)
							return;
						switch (event.keyCode) {
						case 27:
							mainCloseWindow();
							break;
						}
					}
				});
		break;
	case 'datepicker':
		/**/
		if (parm != 'ru')
			parm = 'en';
		mainIncludeJS(mainHome + '/jlib/datepicker/datepicker.js');
		mainIncludeJS(mainHome + '/jlib/datepicker/datepicker-' + parm + '.js');
		mainIncludeCSS(mainHome + '/jlib/datepicker/datepicker.css');
		/**/
		break;
	case 'treeview':
		mainIncludeJS(mainHome + '/jlib/treeview/lib/jquery.cookie.js');
		mainIncludeJS(mainHome + '/jlib/treeview/jquery.treeview.js');
		mainIncludeCSS(mainHome + '/jlib/treeview/jquery.treeview.css');
		break;
	case 'tabs':
		/*
		 * mainIncludeJS(mainHome + '/jlib/tabs/tabs.js');
		 * mainIncludeCSS(mainHome + '/jlib/tabs/tabs.css');
		 */
		break;
	}
}

function mainPostIsError(data) {
	var ret = false;
	if (data.error != '') {
		alert(data.error);
		ret = true;
	}
	return ret;
}

/* ******************************************************************************** */

function mainCacheExists(_class) {
	var ret = false;
	if (mainCache[_class] != null && mainCache[_class] != undefined)
		if ($('#' + mainCache[_class]).length > 0)
			ret = true;
	return ret;
}

function mainAddCache(_class, data) {
	if (mainCacheExists(_class))
		return false;
	if (data == null || data == undefined || data == '')
		return false;

	var container_id = 'container_' + _class;
	$('body').append(
			'<div id="' + container_id + '" class="containerPopup">' + data
					+ '</div>');
	mainCache[_class] = container_id;
	return true;
}

function mainGetCache(_class) {
	return mainCache[_class];
}

/* ******************************************************************************** */

function mainShowModalBg(visible, callback) {
	var bg = $('#modalBg');
	if (bg.length == 0) {
		$('body').append('<div id="modalBg" class="modalBg"></div>');
		bg = $('#modalBg');

	}
	if (visible) {
		bg.css( {
			"background-color" : "black",
			"opacity" : "0.8",
			"height" : mainGetDocumentHeight() + 'px',
			"filter" : "alpha(opacity=" + (0.8 * 100) + ")"
		});
		bg.fadeIn('fast', callback);
	} else
		bg.fadeOut('fast', callback);
}

function mainShowWindow(_class) {
	if (mainDisable)
		return;
	mainDisable = true;

	var cache = mainGetCache(_class);
	if (cache != null && cache != undefined)
		mainOpenID = '#' + cache;
	else
		mainOpenID = '#' + _class;
	obj = $(mainOpenID);

	if (obj.length > 0) {
		mainShowModalBg(true);
		obj.css( {
			'top' : (f_clientHeight() - obj.height()) / 2,
			'left' : (f_clientWidth() - obj.width()) / 2
		}).show(0, function() {
			$(this).corner();
		});
		mainSetFocus(obj);
	}
}

function mainShowDefaultWindow(action, _class, clear, callback, pdata) {
	var no_cache = _class == null || _class == undefined;
	if (!no_cache && mainCacheExists(_class)) {
		mainCloseWindow(false);
		mainShowWindow(_class);
		if (clear)
			mainClearFormData(_class);
		if (callback != null && callback != undefined)
			callback();
	} else {
		data = {};
		data['action'] = action;
		data['class'] = _class;
		if (pdata != null && pdata != undefined)
			$.each(pdata, function(key, val) {
				data[key] = val;
			});
		$
				.post(
						mainAjax,
						data,
						function(data) {
							if (!mainPostIsError(data)) {
								if (data.form != null && data.form != undefined
										&& data.form != '') {
									mainCloseWindow(false);
									if (no_cache) {
										_class = 'container_data';
										if ($('#' + _class).length == 0)
											$('body')
													.append(
															'<div id="' + _class + '" class="containerPopup"></div>');
										$('#' + _class).html(data.form);
									} else
										mainAddCache(_class, data.form);
									mainShowWindow(_class);
									if (clear)
										mainClearFormData(_class);
									if (callback != null
											&& callback != undefined)
										callback();
								}
							}
						}, 'json');
	}
}

function mainShowResultNewWindow(data) {
	var cont_id = 'container_result';
	var cont = $('#' + cont_id);
	if (cont.length == 0) {
		$('body').append(
				'<div id="' + cont_id + '" class="containerPopup"></div>');
		cont = $('#' + cont_id);
	}
	if (data != null && data != undefined && data != '') {
		cont.html(data);
		mainCloseWindow(false);
		mainShowWindow(cont_id);
	}
}

function mainCloseWindow(hide_bg) {
	$(mainOpenID).hide(0);
	if (hide_bg != null && hide_bg != undefined) {
		if (hide_bg)
			mainShowModalBg(false);
	} else
		mainShowModalBg(false);
	mainDisable = false;
}

function mainSetFocus(obj) {
	var ret = false;
	obj.find('input[type!="button"],textarea').each(function() {
		if (ret)
			return;

		_this = $(this);
		if (!_this.is(":disabled") && _this.is(":visible")) {
			_this.focus();
			ret = true;
		}

	});
}

function mainClearFormData(_class) {
	$('#' + mainGetCache(_class)).find(':input').each(function() {
		if (this.name != '') {
			if (this.type != 'radio')
				$(this).val('');
		}
	});
}

function mainSubmitForm(action, _class, callback, pdata, id) {
	var no_cache = _class == null || _class == undefined;
	data = {
		'action' : action,
		'class' : _class
	};
	if (pdata != null && pdata != undefined)
		$.each(pdata, function(key, val) {
			data[key] = val;
		});
	if (no_cache)
		var form = $('#' + id);
	else
		var form = $('#' + mainGetCache(_class));
	form.find(':input').each(function() {
		if (this.name != '') {
			if (this.type == 'radio') {
				if ($(this).is(':checked'))
					data[this.name] = $(this).val();
			} else
				data[this.name] = $(this).val();
		}
	});
	$.post(mainAjax, data, function(data) {
		if (!mainPostIsError(data)) {
			if (callback != null && callback != undefined)
				callback(data);
		} else {
			if (data.element_id != null && data.element_id != undefined) {
				$('#' + mainGetCache(_class)).find('#' + data.element_id)
						.focus();
			}
		}
	}, 'json');
}

/* ******************************************************************************** */

function mainShowLoginWindow(_class) {
	if (typeof (_class) != 'string')
		_class = $(this).attr('class');
	$.post(mainAjax, {
		'action' : 'is_logged',
		'class' : _class,
		'cached' : mainCacheExists(_class)
	}, function(data) {
		if (!mainPostIsError(data)) {
			if (data.result == 1)
				mainLoginResult(_class, data);
			else {
				mainAddCache(_class, data.form);
				mainShowWindow(_class);
			}
		}
	}, 'json');
}

function mainLoginFormSubmit(_class) {
	var data = {
		'action' : 'login',
		'class' : _class
	};
	$('#' + mainGetCache(_class)).find(':input').each(function() {
		if (this.name != '') {
			data[this.name] = $(this).val();
		}
	});
	$.post(mainAjax, data, function(data) {
		if (!mainPostIsError(data))
			mainLoginResult(_class, data);
	}, 'json');
	return false;
}

function mainLoginResult(_class, data) {
	switch (_class) {
	case 'linkUserLoginForecasts':
		if (window.location.href.indexOf('forecast-archive') != -1)
			$('#orders_form').attr('action', mainHome + '/forecast-archive')
					.submit();
		else
			$('#orders_form').attr('action', mainHome + '/forecast-list')
					.submit();
		break;
	default:
		if (data.url != null && data.url != undefined) {
			mainCloseWindow();
			window.location.href = data.url;
		}
		break;
	}
}

/* ******************************************************************************** */

function mainLogout(object) {
	var data = {
		'action' : 'logout',
		'id' : object.id
	};
	$.post(mainAjax, data, function(data) {
		if (!mainPostIsError(data)) {
			// jQuery('#' + object.id).hide();
			// window.location.href = mainHome;
			window.location.reload(true);
		}
	}, 'json');
}

/* ******************************************************************************** */

function mainShowRemindWindow(_class) {
	if (typeof (_class) != 'string')
		_class = $(this).attr('class');
	mainShowDefaultWindow('remind', _class, true);
}

function mainRemindFormSubmit(_class) {
	mainSubmitForm('remind_data', _class, function(data) {
		mainShowResultNewWindow(data.result);
	});
	return false;
}

/* ******************************************************************************** */

function mainShowRegistrationWindow(_class) {
	if (typeof (_class) != 'string')
		_class = $(this).attr('class');
	mainShowDefaultWindow('registration', _class, true);
	// mainInit("tabs");/***/
	/*
	 * $(function(){ $("#tabs").tabs(); });
	 */
}

function mainRegistrationFormSubmit(_class) {
	mainSubmitForm('registration_data', _class, function(data) {
		mainShowResultNewWindow(data.result);
	});
	return false;
}

/* ******************************************************************************** */

function mainShowUserBalanceWindow() {
	mainShowDefaultWindow('user_balance', 'formUserBalance', true, function() {
		mainUserBalanceAction('refresh');
	});
}

function mainUserBalanceSubmit() {
	return false;
}

function mainUserBalanceABSubmit(form_id, command, alert_txt, confirm_txt) {
	var obj = $('#' + form_id + ' .sum_input')
	var sum = obj.val();
	if (sum == '') {
		alert(alert_txt)
		obj.focus();
	} else {
		sum = parseFloat(sum);
		if (sum == null || isNaN(sum)) {
			alert(alert_txt);
			obj.focus();
		} else {
			var pdata = {
				'action' : 'user_balance_data',
				'command' : command,
				'sum' : sum,
				'check' : true
			};
			$.post(mainAjax, pdata, function(data) {
				if (!mainPostIsError(data)) {
					if (data.result) {
						if (confirm(confirm_txt.replace('[:sum:]', sum
								.toFixed(2)))) {
							pdata['check'] = false;
							$.post(mainAjax, pdata, function(data) {
								if (!mainPostIsError(data)) {
									$('#balance_main_td').text(
											'$' + data.balance_main);
									$('#balance_programm_td').text(
											'$' + data.balance_programm);
									$('#balance_forecast_td').text(
											'$' + data.balance_forecast);
									mainCloseWindow(false);
									mainShowDefaultWindow('user_balance',
											'formUserBalance', true);
								}
							}, 'json');
						}
					}
				}
			}, 'json');
		}
	}
	return false;
}

function mainUserNewBillSubmit() {
	mainSubmitForm('new_bill_data', 'formUserNewBill', function(data) {
		mainShowResultNewWindow(data.form);
	});
	return false;
}

function mainUserNewBillCashlessSubmit(_this) {
	window.open(_this.action);
	return false;
}

function mainUserBalanceAction(command) {
	switch (command) {
	case 'refresh':
	case 'bonus_a':
	case 'bonus_b':
		var data = {
			'action' : 'user_balance_data',
			'command' : command
		};
		$.post(mainAjax, data, function(data) {
			if (!mainPostIsError(data)) {
				$('#balance_main_td').text('$' + data.balance_main);
				$('#balance_programm_td').text('$' + data.balance_programm);
				$('#balance_forecast_td').text('$' + data.balance_forecast);

				if (data.bonus_a == "1")
					$('#user_balance #bonus_a').removeAttr("disabled");
				else
					$('#user_balance #bonus_a').attr("disabled", "disabled");
				if (data.bonus_b == "1")
					$('#user_balance #bonus_b').removeAttr("disabled");
				else
					$('#user_balance #bonus_b').attr("disabled", "disabled");

				if (data.message != null && data.message != undefined)
					alert(data.message);
			}
		}, 'json');
		break;
	case 'newbill':
		mainCloseWindow(false);
		mainShowDefaultWindow('new_bill', 'formUserNewBill', true);
		break;
	case 'account_a':
		mainCloseWindow(false);
		mainShowDefaultWindow('user_balance', 'formUserBalanceA', true,
				function() {
					$('#user_balance_a_form .balance_main').text(
							$('#balance_main_td').text());
				});
		break;
	case 'account_b':
		mainCloseWindow(false);
		mainShowDefaultWindow('user_balance', 'formUserBalanceB', true,
				function() {
					$('#user_balance_b_form .balance_main').text(
							$('#balance_main_td').text());
				});
		break;
	}
}

function mainCloseBalanceABWindow() {
	mainCloseWindow(false);
	mainShowDefaultWindow('user_balance', 'formUserBalance', true);
}

function mainShowNewPromoCodeWindow() {
	mainShowDefaultWindow('new_promo_code', 'formUserNewPromoCode', true);
}

function mainNewPromoCodeFormSubmit() {
	mainSubmitForm('new_promo_code_data', 'formUserNewPromoCode',
			function(data) {
				location.reload();
			});
	return false;
}

function mainUserBuyForecast(_this, fid, confirm_txt) {
	if (confirm(confirm_txt)) {
		data = {
			'action' : 'user_buy_forecast',
			'fid' : fid
		};
		$.post(mainAjax, data, function(data) {
			if (!mainPostIsError(data)) {
				window.location.href = _this.href;
			}
		}, 'json');
	}
	return false;
}

function mainCabLogout(text, type) {
	if (confirm(text))
		window.location.href = mainHome + '/logout/?type=' + type;
}

/* ******************************************************************************** */

function mainSendUserRating(id) {
	var data = {
		'action' : 'user_rating_data',
		'fid' : id,
		'rating' : $('#user_rating').val()
	};
	$.post(mainAjax, data, function(data) {
		if (!mainPostIsError(data)) {
			if (data.message != null && data.message != undefined)
				alert(data.message);
			$('#user_rating,#user_rating_submit').attr('disabled', 'disabled');
		}
	}, 'json');
}

function mainShowForecastCommentWindow(id) {
	mainShowDefaultWindow('forecast_comment', 'formForecastComment', true,
			function() {
				$('#user_forecast_comment_form #forecast_id').val(id);
			});
}

function mainForecastCommentFormSubmit() {
	mainSubmitForm('forecast_comment_data', 'formForecastComment', function(
			data) {
		if (data.message != null && data.message != undefined)
			alert(data.message);
		mainCloseWindow();
		$('#comment_button').attr('disabled', 'disabled');
	});
	return false;
}

/* ******************************************************************************** */

function mainShowAnalystInfo(id) {
	mainShowDefaultWindow('user_info', null, false, function() {
	}, {
		'analyst_id' : id
	});
}

function mainShowAnalystComments(id) {
	mainShowDefaultWindow('user_comments', null, false, function() {
	}, {
		'analyst_id' : id
	});
}

/* ******************************************************************************** */

function mainShowUserProfileWindow() {
	mainShowDefaultWindow('profile', null, false, null, {
		'type' : 'user'
	});
}

function mainShowPartnerProfileWindow() {
	mainShowDefaultWindow('profile', null, false, null, {
		'type' : 'partner'
	});
}

function mainShowAnalystProfileWindow() {
	mainShowDefaultWindow('profile', null, false, function() {
		jQuery("#tabs").tabs();
		var obj = jQuery('#container_data');
		obj.css( {
			'top' : (f_clientHeight() - obj.height()) / 2,
			'left' : (f_clientWidth() - obj.width()) / 2
		});
		$("#birth_date").datepicker();
	}, {
		'type' : 'analyst'
	});
}

function mainProfileFormSubmit(type) {
	mainSubmitForm('profile_data', null, function(data) {
		// alert(data.result);
			if (data.wizard != null && data.wizard != undefined)
				mainShowResultNewWindow(data.wizard);
			else
				mainCloseWindow();
		}, {
			'type' : type
		}, 'profile_form');
	return false;
}

/* ******************************************************************************** */

function mainShowChangePasswordWindow(_class) {
	mainShowDefaultWindow('change_pass', _class, true);
}

function mainChangePasswordFormSubmit(_class) {
	mainSubmitForm('change_pass_data', _class, function(data) {
		mainShowResultNewWindow(data.result);
	});
	return false;
}
