/**
 * @author Coolmen
 */

/**
 * Класс бокса заказов
 * @class
 * @param {Object} el
 * @param {Object} settings
 */
function Orders ( el, settings ) {
	
	/**
	 * Пресеты
	 * @private
	 */
	 settings = jQuery.extend({
		next_button:	'Заказать'
	}, settings );
	
	/**
	 * Метка даты
	 * @private
	 */
	var label	= $(el);
	/**
	 * Дата бокса
	 * @private
	 */
	var	date 	= label.attr( 'for' );
	date = date.replace( /^l\-/, '' );
	/**
	 * Ссылка в метке
	 * @private
	 */
	var link	= label.children('a');
	/**
	 * Блок заказа
	 * @private
	 */
	var box		= $( '#' + label.attr( 'for' ) );
	/**
	 * Таблица в блоке заказов
	 * @private
	 */
	var table	= $( '#' + label.attr( 'for' ) + ' .places table' );
	/**
	 * Текущий статус блока заказов
	 * @private
	 * 		true	-- открыт
	 * 		false	-- закрыт
	 */
	var status	= label.hasClass('a');
	/**
	 * Боксы с ценой заказа
	 * @private
	 */
	var price_box = box.find('.price-box');

	/**
	 * Инит ссылки даты
	 * @method init()
	 */	
	this.init = function () {
		this.piano();
		show_price();
		link.click( this.show );
		box.find('.order-form a').click( function() { return $().OrderBox( date, get_order() ); } );
	};

	/**
	 * Расскрас/интерактив таблицы
	 * @method piano()
	 */
	this.piano = function () {
		if (! table.length ) {
			return false;
		}
		table.find('tr:odd').addClass('odd');
		table.find('tr').hover(
			function () { $(this).addClass('hover'); }, 
			function () { $(this).removeClass('hover'); }
		);
		table.find('tr').click( function () { selected(this); }	);
		table.find('input:checkbox').click( function () { selected(this); }	);
		table.find('input:checked').parents('tr').addClass('select');

	}

	/**
	 * Показываем блок заказа для даты
	 * @method show()
	 */
	this.show = function () {
		if (!status) {
			hide_all();
			label.addClass('a');
			box.fadeIn('normal');
			status = true;
			$().scrollTo( box.parents('table'), 800 );
		}
		return false;
	} 
	
	/**
	 * Прячим блок заказа для даты
	 * @methos hide()
	 */
	this.hide = function () {
		// Если есть таблица билетов -- снимаем флажки
		if ( table.length ) {
			table.find('input:checked').attr('checked','').
				parents('tr').removeClass('select');
				price_box.html('&nbsp;');
		}
		if (status) {
			label.removeClass('a');
			box.hide();
//			box.slideUp('fast', function() { box.hide()	});
			status = false;
		}
		return false;
	}

	/**
	 * Получение заказа
	 * @return {}
	 */
	function get_order () {
		var price = 0, ticket = 0, places = '';
		// Если это таблица
		if ( table.length ) {
			string = $('<div class="places"><table style="width:95%;"><tr class="th"><td class="al">зона</td><td>ряд</td><td class="al">места</td><td>цена, руб</td></table></div>'); 
			table.find('input:checked').each( function () {
				ticket ++;
				string.find('table').append( $(this).parents('tr').clone() );
				price += parseInt( $(this).parents('td').nextAll('td.price').text() );
				places = places ? places + ';' + $(this).attr('name') : $(this).attr('name');
			});
			// Ищим чекбоксы
			string.find('td span input').parents('td').remove();
			string.find('table').append( $('<tr><td colspan=4><b>Итого:</b> ' + price + ' руб.</td></tr>' ) );
		}
		else {
			string = $("<div class='order-text-html'>");
			string.text( $('.order-form textarea[name=text]').val() );
		}
		return [ string, places ];
	}

	/**
	 * Проверка нажатия/отжатия чекбокса, подсветка строки таблицы, пересчёт прайса
	 * @private
	 * @param {Object} el
	 */
	function selected ( el ) {
		// Чекбокс или тр
		var checkbox = $(el).is('input:checkbox') ? $(el) : $(el).find('input:checkbox')
		// Отжат 
		if ( checkbox.attr('checked') ) {
			checkbox.attr('checked',0);
			checkbox.parents('tr').removeClass('select');
		}
		// Нажат
		else {
			checkbox.attr('checked',1);
			checkbox.parents('tr').addClass('select');
		}
		show_price();
	}

	/**
	 * Пересчёт прайса заказа
	 * @private
	 */
	function show_price() {
		var price = 0, ticket = 0;
		table.find('input:checked').each( function () {
			ticket++;
			price += parseInt( $(this).parents('td').nextAll('td.price').text() );
		});
		ticket = ticket ? '<b>Итого:</b> билетов: ' + ticket + ', на сумму ' + price + ' руб. <span class="trianglered3"><a href="#">' + settings.next_button + '</a></span>' : '&nbsp;';
		price_box.html( ticket );
		price_box.find('a').unbind().click( function() { return $().OrderBox( date, get_order() ); } );
	}


	this.init();
}

(function($){
	/**
	 * Класс формы заказа
	 * @class
	 * @param {String} date
	 * @param {String} order
	 * @param {String} places
	 */
	$.fn.OrderBox = function( date, order, settings ) {
		
		/**
		 * Пресеты
		 * @private
		 */
		 settings = jQuery.extend({
    		opacity:	0.8,
     		bgcolor:	'#000'
  		}, settings );

  		/**
  		 * Генерация формы
  		 * @private
  		 */
		function set_ui () {
			$('embed, object, select').css({ 'visibility' : 'hidden' });
			$('body').append(
	'<div id="order-box-fade"></div>'
+	'<div id="order-box">'

+	'<div style="float: right; margin-right: 10px;"><a href="#" id="order-close">Закрыть</a></div>'
+	'<div class="order-head">Заказ</div>'
+	'<div class="order-form">'
+	'<form method="post"><fildset><input type="hidden" name="mode" value="order"/><table><colgroup><col class="legend"/><col class="controls"/></colgroup>'
+	'<tr><td>Представьтесь:</td><td><input type="text" id="name-id" name="name" size="20" maxlength="250"/></td></tr>'
+	'<tr><td>Ваш телефон:</td><td><input type="text" id="phone-id" name="phone" size="20" maxlength="250"/></td></tr>'
+	'<tr><td>E-mail:</td><td><input type="text" id="email-id" name="email" size="20" maxlength="250"/></td></tr>'
+	'<tr><td>Адрес, комментарии:</td><td><textarea name="text" acols="30" rows="4"></textarea></td></tr>'
+	'<tr><td>Заказ:</td><td class="order-html"><textarea name="order" class="order-text" style="display:none;"></textarea><input type="hidden" name="places" id="places-id"/></td></tr>'
+	'<tr><td>&nbsp;</td><td><a href="#" id="order-submit">Отправить</a></td></tr>'
+	'</table></fildset></form>'
+	'</div>'

+	'</div>');

			_page	= getPageSize();
			_scroll	= getPageScroll();
			// Подложка
			$('#order-box-fade').css({
				backgroundColor:	settings.bgcolor,
				opacity:			settings.opacity,
				width:				_page[0],
				height:				_page[1],
				position:			'absolute',
				top:				0,
				left:				0,
				display:			'none'
			}).fadeIn( function() {
				// Диалог
				$('#order-box').css({
					top:		_scroll[1] + ( $(window).height() - $('#order-box').height() ) / 2
				}).show();
			});

			// Ресайз
			$(window).resize( function () {
				_page	= getPageSize();
				_scroll	= getPageScroll();
				// Подложка
				$('#order-box-fade').css({
					width:		_page[0],
					height:		_page[1]
				});
				// Диалог
				$('#order-box').stop().animate({
					top:		_scroll[1] + ( $(window).height() - $('#order-box').height() ) / 2
				});
			}).scroll( function () {
				_scroll	= getPageScroll();
				// Диалог
				$('#order-box').stop().animate({
					top:		_scroll[1] + ( $(window).height() - $('#order-box').height() ) / 2
				});
			});
			$('#order-box-fade').click( rm_ui );
		};

		/**
		 * Удаление формы
		 * @private
		 */
		function rm_ui () {
			$('embed, object, select').css({ 'visibility' : 'visible' });
			$('#order-box').remove()
			$('#order-box-fade').fadeOut( function () { $('#order-box-fade').remove() } );
			return false;
		};
		
		/**
		 * THIRD FUNCTION
		 * getPageSize() by quirksmode.com
		 *
		 * @return Array Return an array with page width, height and window width, height
		 */
		function getPageSize() {
			var xScroll, yScroll;
			if (window.innerHeight && window.scrollMaxY) {	
				xScroll = window.innerWidth + window.scrollMaxX;
				yScroll = window.innerHeight + window.scrollMaxY;
			} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
				xScroll = document.body.scrollWidth;
				yScroll = document.body.scrollHeight;
			} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
				xScroll = document.body.offsetWidth;
				yScroll = document.body.offsetHeight;
			}
			var windowWidth, windowHeight;
			if (self.innerHeight) {	// all except Explorer
				if(document.documentElement.clientWidth){
					windowWidth = document.documentElement.clientWidth; 
				} else {
					windowWidth = self.innerWidth;
				}
				windowHeight = self.innerHeight;
			} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
				windowWidth = document.documentElement.clientWidth;
				windowHeight = document.documentElement.clientHeight;
			} else if (document.body) { // other Explorers
				windowWidth = document.body.clientWidth;
				windowHeight = document.body.clientHeight;
			}	
			// for small pages with total height less then height of the viewport
			if(yScroll < windowHeight){
				pageHeight = windowHeight;
			} else { 
				pageHeight = yScroll;
			}
			// for small pages with total width less then width of the viewport
			if(xScroll < windowWidth){	
				pageWidth = xScroll;		
			} else {
				pageWidth = windowWidth;
			}
			arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight);
			return arrayPageSize;
		};
		/**
		 / THIRD FUNCTION
		 * getPageScroll() by quirksmode.com
		 *
		 * @return Array Return an array with x,y page scroll values.
		 */
		function getPageScroll() {
			var xScroll, yScroll;
			if (self.pageYOffset) {
				yScroll = self.pageYOffset;
				xScroll = self.pageXOffset;
			} else if (document.documentElement && document.documentElement.scrollTop) {	 // Explorer 6 Strict
				yScroll = document.documentElement.scrollTop;
				xScroll = document.documentElement.scrollLeft;
			} else if (document.body) {// all other Explorers
				yScroll = document.body.scrollTop;
				xScroll = document.body.scrollLeft;	
			}
			arrayPageScroll = new Array(xScroll,yScroll);
			return arrayPageScroll;
		};

		
		function validate() {
			var valid = 1;
			// Имя
			if ( $('#order-box form #name-id').val().match(/[^\s]{3,}/i) ) {
				$('#order-box form #name-id').removeClass('need')
			}
			else {
				$('#order-box form #name-id').addClass('need')
				valid = 0;
			}
			// Телефон
			if ( $('#order-box form #phone-id').val().match(/^\+?\s?\d?\s?(\(\d{3,8}\))?[\d\-\s]{6,}$/i) ) {
				$('#order-box form #phone-id').removeClass('need')
			}
			else {
				$('#order-box form #phone-id').addClass('need')
				valid = 0;
			}
			// Мыло
			if ( !$('#order-box form #email-id').val() || $('#order-box form #email-id').val().match(/^[\-\.\w]+@([\w\-]+\.)+\w{2,3}$/i) ) {
				$('#order-box form #email-id').removeClass('need')
			}
			else {
				$('#order-box form #email-id').addClass('need')
				valid = 0;
			}

			return valid;
		}
		
		function send () {
			if ( validate() ) {
				$('#order-box form').submit();
			}
			return false
		}
		
		set_ui();
		
		var loc = document.location.href;
		loc = loc.replace( /\/[^\/]*$/, '/' );
		if ( date ) {
			loc += '?date='+date;
		}
		$('#order-box form').attr( 'action', loc );
		$('#order-box .order-html').append( order[0] );
		$('#order-box .order-text').val( order[0].html() );
		$('#order-box #places-id').val( order[1] );

		$('#order-box form #name-id').keyup( validate ).change( validate ).mouseup( validate );
		$('#order-box form #phone-id').keyup( validate ).change( validate ).mouseup( validate );
		$('#order-box form #email-id').keyup( validate ).change( validate ).mouseup( validate );

		validate();
		$('#order-submit').click( send ); 
		$('#order-close').click( rm_ui );
		
		return false;
	}
}(jQuery));

(function($){
	/**
	 * Класс сообщения
	 * @class
	 * @param {String} title
	 * @param {String} message
	 */
	$.fn.MessageBox = function( title, message, settings ) {
		
		/**
		 * Пресеты
		 * @private
		 */
		 settings = jQuery.extend({
    		opacity:	0.8,
     		bgcolor:	'#000'
  		}, settings );

  		title	= title || 'Сообщение';
  		message	= message || '';
  		
  		/**
  		 * Генерация формы
  		 * @private
  		 */
		function set_ui () {
			$('embed, object, select').css({ 'visibility' : 'hidden' });
			$('body').append(
	'<div id="order-box-fade"></div>'
+	'<div id="order-box">'

+	'<div class="order-head"><ul class="ulb"><li class="circleb1">' + title + '</li></ul></div>'
+	'<div class="order-form">'
+	'<table><colgroup><col/><col class="controls"/></colgroup>'
+	'<tr><td class="message-html" style="padding: 1.2em;" colspan="2">' + message + '</td></tr>'
+	'<tr><td>&nbsp;</td><td><ul class="ulb"><li class="trianglewhite1"><a href="#" id="order-close">Закрыть</a></li></ul></td></tr>'
+	'</table></fildset>'
+	'</div>'

+	'</div>');

			_page	= getPageSize();
			_scroll	= getPageScroll();
			// Подложка
			$('#order-box-fade').css({
				backgroundColor:	settings.bgcolor,
				opacity:			settings.opacity,
				width:				_page[0],
				height:				_page[1],
				position:			'absolute',
				top:				0,
				left:				0,
				display:			'none'
			}).fadeIn( function() {
				// Диалог
				$('#order-box').css({
					top:		_scroll[1] + ( $(window).height() - $('#order-box').height() ) / 2
				}).show();
			});

			// Ресайз
			$(window).resize( function () {
				_page	= getPageSize();
				_scroll	= getPageScroll();
				// Подложка
				$('#order-box-fade').css({
					width:		_page[0],
					height:		_page[1]
				});
				// Диалог
				$('#order-box').stop().animate({
					top:		_scroll[1] + ( $(window).height() - $('#order-box').height() ) / 2
				});
			}).scroll( function () {
				_scroll	= getPageScroll();
				// Диалог
				$('#order-box').stop().animate({
					top:		_scroll[1] + ( $(window).height() - $('#order-box').height() ) / 2
				});
			});
			$('#order-box-fade').click( rm_ui );
		};

		/**
		 * Удаление формы
		 * @private
		 */
		function rm_ui () {
			$('embed, object, select').css({ 'visibility' : 'visible' });
			$('#order-box').remove()
			$('#order-box-fade').fadeOut( function () { $('#order-box-fade').remove() } );
			return false;
		};
		
		/**
		 * THIRD FUNCTION
		 * getPageSize() by quirksmode.com
		 *
		 * @return Array Return an array with page width, height and window width, height
		 */
		function getPageSize() {
			var xScroll, yScroll;
			if (window.innerHeight && window.scrollMaxY) {	
				xScroll = window.innerWidth + window.scrollMaxX;
				yScroll = window.innerHeight + window.scrollMaxY;
			} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
				xScroll = document.body.scrollWidth;
				yScroll = document.body.scrollHeight;
			} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
				xScroll = document.body.offsetWidth;
				yScroll = document.body.offsetHeight;
			}
			var windowWidth, windowHeight;
			if (self.innerHeight) {	// all except Explorer
				if(document.documentElement.clientWidth){
					windowWidth = document.documentElement.clientWidth; 
				} else {
					windowWidth = self.innerWidth;
				}
				windowHeight = self.innerHeight;
			} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
				windowWidth = document.documentElement.clientWidth;
				windowHeight = document.documentElement.clientHeight;
			} else if (document.body) { // other Explorers
				windowWidth = document.body.clientWidth;
				windowHeight = document.body.clientHeight;
			}	
			// for small pages with total height less then height of the viewport
			if(yScroll < windowHeight){
				pageHeight = windowHeight;
			} else { 
				pageHeight = yScroll;
			}
			// for small pages with total width less then width of the viewport
			if(xScroll < windowWidth){	
				pageWidth = xScroll;		
			} else {
				pageWidth = windowWidth;
			}
			arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight);
			return arrayPageSize;
		};
		/**
		 / THIRD FUNCTION
		 * getPageScroll() by quirksmode.com
		 *
		 * @return Array Return an array with x,y page scroll values.
		 */
		function getPageScroll() {
			var xScroll, yScroll;
			if (self.pageYOffset) {
				yScroll = self.pageYOffset;
				xScroll = self.pageXOffset;
			} else if (document.documentElement && document.documentElement.scrollTop) {	 // Explorer 6 Strict
				yScroll = document.documentElement.scrollTop;
				xScroll = document.documentElement.scrollLeft;
			} else if (document.body) {// all other Explorers
				yScroll = document.body.scrollTop;
				xScroll = document.body.scrollLeft;	
			}
			arrayPageScroll = new Array(xScroll,yScroll);
			return arrayPageScroll;
		};


		function send () {
			rm_ui();
			return false
		}
		
		set_ui();
		$('#order-close').click( rm_ui );
		return false;
	}
}(jQuery));


/**
 * Прячим все открытые блоки
 */
function hide_all () {
	$('.show-link').each( function () { this.Orders.hide() } );
}

/**
 * jQuery accessor
 * @param {Object} options
 */
jQuery.fn.orders = function( options ) {
	this.each( function () {
			this.Orders = new Orders( this );
		});
};

$(document).ready( function () {
	$('.show-link').orders();
});

