$(document).ready(function ()
{

	$.fn.IssueCarousel = function(options)
	{

		this.each(function()
		{

			var Carousel = {
	
				Init: function(cont_obj, opt)
				{
					this.is_busy = false;
					this.is_animate = false;
					this.next = 0;
					this.current = 0;
					this.count = 0;
					this.total = -1;
	//				this.container = [];
					this.cont_imgs = [];
					this.cont_tabs = [];
	
					this.img_rxp = new RegExp('<img\\s+[^>]*src=[\'"]?([^\'">]+)[\'"]?[^>]*>', 'ig');
	
					this.options = jQuery.extend({
	
						speed: 800,
						opacity: 0.5,
	
						ajax_url: null,
						ajax_limit: 5,

						callback: null,

						slide_round: false
		
						}, opt);

					this.el_cont = cont_obj;
					this.el_tabs = $(".carousel-tabs", this.el_cont).eq(0);
					this.el_prev = $(".carousel-prev", this.el_cont).eq(0);
					this.el_next = $(".carousel-next", this.el_cont).eq(0);
					this.el_cont_ul = $(".carousel-wrap", this.el_cont).eq(0);
	
					this.cont_width = this.el_cont.width();
					this.count = 0;
	
					var tabs = [];
					var lis = $(".panel", this.el_cont_ul);
					for( var i = 0, o, l = lis.length; i < l; i++ )
					{
						o = $(lis[i]);
						o.css('width', this.cont_width);
						this._findImages(i, o.html());
						this.count++;

						if (this.el_tabs)
						{
							this.cont_tabs.push(o.attr('title')||('tab'+i));
							o.attr('title', '');
						}
					}

					if ( ! this.options.ajax_url)
						this.total = this.count;
					
	
	//				this.Add(list);
					this.FitContainer();
					this.InitButtons();
	//				this.Show(0);
				},
	
				FitContainer: function()
				{
					var h = 0;
					var lis = $(".panel", this.el_cont_ul).each(function()
						{
							var hh = $(this).height();
							if (hh > h) h = hh;
						});
					
					$(".panel", this.el_cont_ul).each(function()
						{
							$(this).css('height', h);
						});

					this.el_cont_ul.css('width', this.count * this.cont_width);
					this.el_cont_ul.css('height', h);
				},
	
				Add: function(cont)
				{
					if (cont)
					{
						var list = jQuery.isArray(cont) ? cont : [ cont ];
		
						for( var i = 0, m; i < list.length; i++ )
						{
							if (list[i] === false)
							{
								this.total = this.count;
								break;
							}
		
							this._findImages(this.count, list[i]);
	
							var li = $('<div class="panel"></div>').css('width', this.cont_width).append(list[i]);
							
							this.el_cont_ul.append(li);
	
							this.count++;
						}
					}
	
					this.FitContainer();
				},
	
				_findImages: function(i, cont)
				{
					this.img_rxp.lastIndex = 0;
					this.cont_imgs[i] = [];
					var m;
					while ((m = this.img_rxp.exec(cont)) != null)
					{
						var img = new Image();
						img.src = m[1];
						this.cont_imgs[i].push(img);
					}
				},
	
				InitButtons: function()
				{
					this.el_prev.click( (function(o)
						{
							return function(){ o.Prev(); }
						} )(this) )
						.hover(
							function(){ $(this).addClass('carousel-prev-hover') },
							function(){ $(this).removeClass('carousel-prev-hover') }
							);
					this.el_next.click( (function(o)
						{
							return function(){ o.Next(); }
						} )(this) )
						.hover(
							function(){ $(this).addClass('carousel-next-hover') },
							function(){ $(this).removeClass('carousel-next-hover') }
							);
					this.ActivateButtons();

					
					if (this.el_tabs)
					{
						for( var i = 0, l = this.cont_tabs.length; i < l; i++ )
						{
							var li = $('<div class="tab"></div>')
								.html('<span>'+this.cont_tabs[i]+'</span>')
								.css('cursor', 'pointer')
								.click((function(o, ii)
								{
									return function(){ o.Show(ii, true); }
								} )(this, i))
								.appendTo(this.el_tabs);
						}
						this.ActivateTabs();
					}
				},
	
				Prev: function()
				{
					this.Show(-1);
				},
	
				Next: function()
				{
					this.Show(1);
				},
	
				ActivateButtons: function(state)
				{
					if (state === false || ! (this.current > 0 || this.options.slide_round))
						this.el_prev
//							.css('opacity', this.options.opacity)
							.addClass('carousel-prev-disabled');
					else
						this.el_prev
//							.css('opacity', 1.0)
							.removeClass('carousel-prev-disabled');
					if (state === false || ! (this.options.slide_round || this.total < 0 || (this.total > 0 && this.current < this.total - 1)))
						this.el_next
//							.css('opacity', this.options.opacity)
							.addClass('carousel-next-disabled');
					else
						this.el_next
//							.css('opacity', 1.0)
							.removeClass('carousel-next-disabled');
				},

				ActivateTabs: function()
				{
					if (this.el_tabs)
					{
						var o = $(".panel:eq(" + this.current +")", this.el_cont_ul);

						$('.selected', this.el_tabs).removeClass('selected');
						$('.tab:eq(' + this.current + ')', this.el_tabs).addClass('selected');
					}
				},


				ActivateIssue: function(state)
				{
					if (state)
						this.el_cont
//							.css('opacity', 1.0)
							.removeClass('loading');
					else
						this.el_cont
//							.css('opacity', this.options.opacity)
							.addClass('loading');
					this.ActivateButtons();
				},
	
				Show: function(inc, absolute)
				{
					if (this.is_busy || this.is_animate) return;
	
					this.next = absolute ? inc : this.current + inc;
					
					if ( ! (
						this.next >= 0 && (this.total < 0 || (this.total > 0 && this.next < this.total))
						))
					{
						if (this.options.slide_round && this.next < 0)
						{
							this.next = this.total - 1;
						}
						else if (this.options.slide_round && this.next >= this.total)
						{
							this.next = 0;
						}
						else return;
					}
	
					this.is_busy = true;
	
					if (this.next >= this.count)
					{
						if (this.options.ajax_url)
						{
							this.ActivateIssue(false);
		
							// load content
							return this._loadNext();
						}

						this.is_busy = false;
						return;
					}
	
					if (this._ready()) this._show();
					else this._waitingShow(0);
				},


				Preload: function()
				{
					if (this.is_busy) return;
					this.is_busy = true;
	
					this.next = this.current;
	
					// load content
					return this._loadNext();
				},
	
				_loadNext: function()
				{
					var fn_succ = (function(o) { return function(html){
	
						var data = null;
						try {
							data = eval(html)
							}
						catch(e) {}
	
						if (data)
							o.Add(data);
	
						if (o._ready()) o._show();
						else o._waitingShow(0);
	
						if (o.options.callback) o.options.callback();

						} } )(this);
	
					var fn_err = (function(o) { return function(){
	
						o.ActivateIssue(true);
						o.is_busy = false;

						} } )(this);
	
					this.ActivateButtons(false);
	
					jQuery.ajax({
							timeout: 5000,
							url: this.options.ajax_url,
							cache: false,
							data: ({ seek : this.count, limit: this.options.ajax_limit }),
							success: fn_succ,
							error: fn_err
						});
				},
	
				_ready: function()
				{
					if (this.next >= 0 && this.next < this.count)
						for( var j = 0, l = this.cont_imgs[this.next].length; j < l; j++ )
							if ( ! this.cont_imgs[this.next][j].complete) return false;
					return true;
				},
	
				_waitingShow: function(times)
				{
					if (this._ready())
						return this._show();
	
					times++;
	
					if (times < 50)
					{
	//				alert(times);
						setTimeout( (function(o, t)
								{
									return function(){ o._waitingShow(t); }
								}
							)(this, times), 100);
					}
					else
					{
						this.ActivateIssue(true);
						this.is_busy = false;
					}
				},
	
				_show: function()
				{
					if (this.next>= 0 && this.next < this.count)
					{
						this._animate();
						this.current = this.next;
						
						this.ActivateTabs();
					}
	
					this.ActivateIssue(true);
					this.is_busy = false;
				},


				_animate: function()
				{
					var speed = Math.abs( this.options.speed / (this.next - this.current) );
	
					var fn_complete = (function(o, p)
							{
								return function(){ o._adjust(p); }
							}
						)(this, this.next);
	
//					this.is_animate = true;
					if (1) // horizontal
					{
						var p = this.next * this.cont_width * (-1);
						this.el_cont_ul.animate(
							{ marginLeft: p },
							{ queue:false, duration:speed
								, complete: fn_complete
								}
							);
					}
				},
	
				_adjust: function(p)
				{
					this.el_cont_ul.css("margin-left", p * this.cont_width * (-1) );
//					this.is_animate = false;
				}
	
				};
			
			Carousel.Init($(this), options);
			if (options.preload) Carousel.Preload();
		
		});
	};


	$.fn.SlideMenu = function(options)
	{
		options = jQuery.extend({
			animateduration: {over: 100, out: 100} //duration of slide in/ out animation, in milliseconds
			}, options);

		return this.each(function()
		{
			var $mainmenu=$(this).find("ul");
			var $headers=$mainmenu.find("ul").parent()
			$headers.each(function(i){
				var $curobj=$(this)
				var $subul=$(this).find('ul:eq(0)')
				this._dimensions={w:this.offsetWidth, h:this.offsetHeight, subulw:$subul.outerWidth(), subulh:$subul.outerHeight()}
				this.istopheader=$curobj.parents("ul").length==1? true : false
				$subul.css({top:this.istopheader? this._dimensions.h+"px" : 0})
//				$curobj.children("a:eq(0)")
	//			.css(this.istopheader? {paddingRight: arrowsvar.down[2]} : {}).append(
	//				'<img src="'+ (this.istopheader? arrowsvar.down[1] : arrowsvar.right[1])
	//				+'" class="' + (this.istopheader? arrowsvar.down[0] : arrowsvar.right[0])
	//				+ '" style="border:0;" />'
	//			)
				$curobj.hover(
					function(e){
						$(this).addClass('hover');
						$(this).children("a:eq(0)").addClass('hover');
						var $targetul=$(this).children("ul:eq(0)")
						this._offsets={left:$(this).offset().left, top:$(this).offset().top}
						var menuleft=this.istopheader? 0 : this._dimensions.w
						menuleft=(this._offsets.left+menuleft+this._dimensions.subulw>$(window).width())? (this.istopheader? -this._dimensions.subulw+this._dimensions.w : -this._dimensions.w) : menuleft
						if ($targetul.queue().length<=1) //if 1 or less queued animations
							$targetul.css({left:menuleft+"px", width:this._dimensions.subulw+'px'}).slideDown(options.animateduration.over)
					},
					function(e){
						$(this).removeClass('hover');
						$(this).children("a:eq(0)").removeClass('hover');
						var $targetul=$(this).children("ul:eq(0)")
						$targetul.slideUp(options.animateduration.out)
					}
				) //end hover
			}) //end $headers.each()
			$mainmenu.find("ul").css({display:'none', visibility:'visible'})
		});
	};

	$.fn.supersleight = function(settings) {
		settings = jQuery.extend({
			imgs: true,
			backgrounds: true,
			shim: 'x.gif',
			apply_positioning: true
		}, settings);
		
		return this.each(function(){
			if (jQuery.browser.msie && parseInt(jQuery.browser.version, 10) < 7 && parseInt(jQuery.browser.version, 10) > 4) {
				jQuery(this).find('*').andSelf().each(function(i,obj) {
					var self = jQuery(obj);
					// background pngs
					if (settings.backgrounds && self.css('background-image').match(/\.png/i) !== null) {
						var bg = self.css('background-image');
						var src = bg.substring(5,bg.length-2);
						var mode = (self.css('background-repeat') == 'no-repeat' ? 'crop' : 'scale');
						var styles = {
							'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizingMethod='" + mode + "')",
							'background-image': 'url('+settings.shim+')'
						};
						self.css(styles);
					};
					// image elements
					if (settings.imgs && self.is('img[src$=png]')){
						var styles = {
							'width': self.width() + 'px',
							'height': self.height() + 'px',
							'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + self.attr('src') + "', sizingMethod='scale')"
						};
						self.css(styles).attr('src', settings.shim);
					};
					// apply position to 'active' elements
					if (settings.apply_positioning && self.is('a, input') && (self.css('position') === '' || self.css('position') == 'static')){
						self.css('position', 'relative');
					};
				});
			};
		});
	};

	$.fn.QuickTabs = function(settings)
	{
		settings = jQuery.extend({

			toggle: false,
			speed: 0,
			toggle: false,
			callback_click: null,
			active_tab: 0

			}, settings);
		
		return this.each(function () {

			var tabs = jQuery(this);
			var tab_menu = $('.quick-tabs-menu', tabs).eq(0);
			var tab_menu_exists = true;
			var panels = [];

			if ( ! tab_menu.length)
			{
				tab_menu = $('<ul></ul>').attr('class', 'quick-tabs-menu');
				tab_menu_exists = false;
			}

			tabs.prepend(tab_menu);

			var superfunc = function(i)
				{
					var panel, menu_li, menu_cont;

					if (tab_menu_exists)
					{
						menu_li = $(this);
						menu_cont = menu_li.children().eq(0);
						panel = $('#'+menu_li.attr('id')+'-panel');
					}
					else
					{
						panel = $(this);
						var tab = $('.tab', panel).eq(0);
//						var cont = $('.cont', panel).eq(0);
						menu_li = $('<li></li>');
						menu_cont = $('<div></div>').html( tab.html() )
							.css('cursor', 'pointer');
						tab.hide();
					}

					$('.closed', panel).eq(0);
					panels.push(panel);

					menu_cont
						.click(function()
							{
								if (settings.callback_click)
									settings.callback_click(menu_li, panel);

								if (settings.toggle && menu_li.hasClass('selected'))
								{
									menu_li.removeClass('selected');
									panel.removeClass('selected').slideUp(settings.speed);
								}
								else
								{
									$('.selected', tab_menu).removeClass('selected');
	
									menu_li.addClass('selected');
	
									if (settings.toggle)
									{
										$(panels).each(function()
											{
												var o = $(this);
												if (o.hasClass('selected'))
													o.removeClass('selected').slideUp(settings.speed);
											});

										panel.addClass('selected').slideDown(settings.speed);
									}
									else
									{
										$(panels).each(function()
											{
												var o = $(this);
												if (o.hasClass('selected'))
													o.removeClass('selected').hide(settings.speed);
											});

										panel.addClass('selected').show(settings.speed);
									}
								}

								return false;
							})
						.hover(function()
							{
								$(menu_li).addClass('hover');
							},
							function()
							{
								$(menu_li).removeClass('hover');
							});
					
					if ( ! tab_menu_exists)
					{
						menu_cont.appendTo(menu_li);
						menu_li.appendTo(tab_menu);
					}

					panel.addClass('quick-tabs-panel');

					if (settings.active_tab == i)
					{
						menu_li.addClass('selected');
						panel.addClass('selected');
					}
					else panel.hide();
					i++;
				};

			if (tab_menu_exists)
				$('li', tab_menu).each(superfunc);
			else
				$('.panel', tabs).each(superfunc);

		});
	};



	$.fn.formValidate = function(settings)
	{
		settings = jQuery.extend({

			ajax_checkform: null,
			min_length_passwd: 5,
			min_length_username: 4,
			max_length_up: 32

			}, settings);

		return $(this).each(function () {

			var o = $(this);

			if (o.hasClass('skip-validate')) return;

			o.bind('submit', function()
				{
//					var f = $(this);
					var f = o;
					var error = '';

					if (o.submit_oke) { return; }

					function submit_form (submt)
					{
						var err_el = $('.err', o);
			
						if (err_el.length)
						{
							if (error == '')
							{
								err_el.hide(150).text('');
//alert('oke');
//return false;

								o.submit_oke = true;
								if (submt)
								{

o.submit();


								}
								return;
							}
							else
							{
								err_el.text(error).show(300);
							}
						}
						else
						{
							if (error == '')
							{
//alert('oke'); return false;
								o.submit_oke = true;
								if (submt) o.submit();
								return;
							}
							else
								alert(error);
						}
					
						return false;
					}

					function set_error (el, err)
					{
						if (err.length)
						{
							if (error == '') error = err[0];

							el.addClass('error');
							if (el.attr('id'))
							{
								$( '#'+el.attr('id')+'-label' ).addClass('error');
							}
						}
						else
						{
							el.removeClass('error');
							if (el.attr('id'))
								$( '#'+el.attr('id')+'-label' ).removeClass('error');
						}
					}

					$(':input', f).each(function()
						{
							var err = [];
							var inp = $(this);

							var vv = (inp.attr('type') == 'checkbox' && !inp.attr('checked')) ? '' : inp.val();

							if ($.isArray(vv)) vv = vv.join(', ');
							
							var v = $.trim(vv);

							if (inp.hasClass('required'))
							{
								if (inp.hasClass('rules') && v == '')
								{
									err.push('Вы не согласились с нашими правилами!');
								}
								else if (inp.hasClass('conditions') && v == '')
								{
									err.push('Вы не согласились с нашими условиями!');
								}
								else if (v == '')
								{
									err.push('Не заполнены обязательные поля!');
								}
							}
							
							if ( ! (err.length || v == ''))
							{
								if (inp.hasClass('email'))
								{
									if ( ! /^[\w_\-]+(\.[\w_\-]+)*@([\w_\-]+\.)+[a-zA-Z]{2,6}$/.test(v))
									{
										err.push('Неправильно указан e-mail адрес!');
									}
								}
								else if (inp.hasClass('passwd'))
								{
									var repasswd = $( '#' + inp.attr('id') + '_confirm' );
						
									if (repasswd && vv != repasswd.val())
									{
										err.push('Пароль не совпадает с повтором!');
									}
									else if (vv.length < settings.min_length_passwd)
									{
										err.push('Слишком короткий пароль!');
									}
									else if (vv.length > settings.max_length_up)
									{
										err.push('Пароль не должен превышать '+settings.max_length_up+'символов!');
									}
									
								}
								else if (inp.hasClass('username'))
								{
									if (/[\|\x7d'"!<\x7b>]/.test(v))
									{
										err.push('Логин содержит неразрешенные символы!');
									}
									else if (vv.length < settings.min_length_username)
									{
										err.push('Слишком короткий логин!');
									}
									else if (vv.length > settings.max_length_up)
									{
										err.push('Логин не должен превышать '+settings.max_length_up+'символов!');
									}
								}
							}

							set_error(inp, err);
						});

					if (error == '' && settings.ajax_checkform)
					{
						var buttn = $('input.submit', f).attr('disabled', 'disabled');
						var loadg = $('.loading', f).show();

						var fn_compl = function(res)
							{
 								var data = null;
 								try {
 									eval('data = ' + res)
 									}
 								catch(e) {}

								if ( ! (data && data.response))
								{
									data = {response:"Ошибка!"};
								}
								buttn.attr('disabled', false)
								loadg.hide()
								error = data.response == 'oke' ? '' : data.response;
								submit_form(true);
							};

						jQuery.ajax({
//									timeout: 5000,
								type: "POST",
								url: settings.ajax_checkform,
								cache: false,
								data: f.serialize()+'&f='+f.attr('id'),
								success: fn_compl,
								error: function()
									{
										fn_compl('');
									}
							});

						return false;
					}

					return submit_form();
				});

			});
	};

	var search_hint = 'Поиск по сайту';
	$("#quick-search-form .keywords")
		.focus(function ()
			{
				if ($(this).val() == search_hint)
					$(this).val('');
				$(this).addClass('focus');
			})
		.blur(function ()
			{
				if ($(this).val() == '')
					$(this).val(search_hint);
				$(this).removeClass('focus');
			})
		.each(function()
			{
				if ($(this).val() == '')
					$(this).val(search_hint);
			});

	$("a.new-win").click(function()
		{
			var url = $(this).attr('href');
			var w =  800, h = 600;
			var t=0,l=0;
			var mw=screen.availWidth;
			var mh=screen.availHeight;
			if (mw>0 && mh>0) {
				l=(mw-40-w)*.5;
				t=(mh-40-h)*.5;
				}
			var win=open(url,'',"width="+w+",height="+h+"," +"left="+l+",top="+t+"," +
			"directories=no,location=yes,menubar=yes,resizable=yes,scrollbars=yes,status=yes,toolbar=no,titlebar=no");
			if (win)
			{
				win.focus();
				return false;
			}
			return;
		});
	

	$('.png').supersleight({shim: '/images/transparent.gif'});

	$('#archive-issue.carousel').IssueCarousel({
		ajax_url: "/ajax_issue.php",
		ajax_limit: 5,
		preload: false,
		callback: function()
			{
				Cufon.replace('#archive-issue h2',{hover: true});
			}
		});
	
	$('#carousel-small').IssueCarousel({
		ajax_url: "/ajax_issue.php?tmpl=small",
		ajax_limit: 5,
		preload: false
		});

	$('#carousel-about').IssueCarousel({
		slide_round: true
		});

	$('#header-nav').SlideMenu();

	$('#right-side .quick-tabs').QuickTabs();

	$('#header .quick-tabs').QuickTabs({
		active_tab: -1,
		speed: 300,
		toggle: true,
		callback_click: function(tab, panel)
			{
				var what = '';
				if (panel.attr('id') == 'tab-login-panel' && ! panel._init_login)
				{
					what = 'login';
				}
				else if (panel.attr('id') == 'tab-register-panel' && ! panel._init_register)
					what = 'register';
				else return;

				panel['_init_'+what] = true;

				panel.html('<div class="loading" style="position: absolute; top: 5px; left: 0; height: 16px; width: 100%; text-align: center;"><img src="/images/loading.gif" width="16" height="16" alt="загрузка" /></div>');

				$.get("/common_files/"+what+"_form", {'ajax':'y'}, function(data)
					{
						$(panel).append('<div class="cont" style="display: none;"><fieldset>' + data + '</fieldset></div>');
						$('.loading', panel).hide();
						$('.cont', panel).slideDown(300);
						$(what == 'register' ? '#member_form' : '#login-form', panel).formValidate({
							ajax_checkform: '/ajax_checkform.php'
							});
						$('.close', panel)
							.click(function()
								{
									tab.removeClass('selected');
									panel.removeClass('selected').slideUp(300);
								});
					});

			}
		});

	$('#classifieds-comment-form-button').click(function()
		{
			var m = /#(\d+)$/.exec($(this).attr('href'));
			var cont = $('#classifieds-comment-form-here:eq(0)');
			var form_url = '/classifieds/comments_form/' + m[1] + '/';
			var post_url = '/classifieds/post/' + m[1] + '/';

			if (cont.attr('init_oke'))
			{
				if (cont.css('display') != 'block')
					cont.slideDown(300);
				else
					cont.slideUp(300);
			}
			else
			{
				cont.attr('init_oke', 'y');
	
				cont.html('<div class="loading" style="position: absolute; top: 5px; left: 0; height: 16px; width: 100%; text-align: center;"><img src="/images/loading.gif" width="16" height="16" alt="загрузка" /></div>');
	
				cont.slideDown(300);

				$.post(form_url, {
					'ajax': 'y',
					'RET': post_url
					}, function(data)
					{
						$('.loading', cont).hide();
						cont.append(data);
						cont.slideDown(300);
						$('#comment_form', cont).formValidate({
							ajax_checkform: '/ajax_checkform.php'
							});
						$('.close', cont)
							.click(function()
								{
									cont.slideUp(300);
								});
					});
			}

			return false;
		});

	$('#classifieds-comment-form-here .close').click(function() {
		$('#classifieds-comment-form-here').slideUp(300);
		});

	$('form[method=post]').formValidate({
		ajax_checkform: '/ajax_checkform.php'
		});


});


