$(function(){

// Hide/Show default text in inputs.
$('input[type="text"]').bind('focus', function(){
	if(this.value === this.title){
		this.value = '';
	}
}).bind('blur', function(){
	if(this.value.match(/^\s?$/)){
		this.value = this.title;
	}
});

// Transform select boxes.
$('select').alter_select();

new function(){
	var language_switch = $('#language_switch');
	var close = function(){
		if(!language_switch.hasClass('open')){
			return;
		}

		$(document).unbind('click', arguments.callee);
		language_switch.bind('click', open);
		language_switch.removeClass('open');
	};
	var open = function(){
		if(language_switch.hasClass('open')){
			return;
		}

		language_switch.addClass('open');
		$(document).bind('click', close);

		return false;
	};

	language_switch.bind('click', open);
	language_switch.hover(open, close);
}

// Main menu.
new function(){
	var pops			= $('#main_menu .items_list > * > .pop:has(> .submenu_wrapper)');
	var links			= pops.find(' > h1 > *');
	var backgrounds		= pops.find(' > .background');
	var wrappers		= pops.find(' > .submenu_wrapper');
	var submenus		= wrappers.find(' > .submenu');
	var default_shift	= -30; // "left: -30px" set in CSS.

	/* links.each(function(index, ele){
		$(backgrounds[index]).css('width', $(ele).width());
	}); */

	links.bind('mouseenter', function(event){
		var link		= $(this);
		var index		= links.index(link); // It is important to note selector which used to select "pops", otherwise "index" will not work.
		var pop			= $(pops[index]);
		var wrapper		= $(wrappers[index]);
		var background	= $(backgrounds[index]);
		var submenu		= $(submenus[index]);

		pop.addClass('hover');
		background.css('width', link.width());

		if(wrapper.length && !wrapper.data('menu_width_fixed')){
			if($.browser.msie && $.browser.version == 7){
				var length = submenu.children().length;
				wrapper.width(length * 220 + (length - 1) * 20);
			}else{
				wrapper.width(wrapper[0].scrollWidth);
			}

			wrapper.data('menu_width_fixed', true);
		}

		// Positioning of submenu.
		var wrapper_inner_width		= $('#wrapper_inner').width();
		var wrapper_width			= wrapper.width();
		var wrapper_offset			= wrapper.offset();
		var wrapper_position		= wrapper.position();
		var slack					= wrapper_offset.left + wrapper_width + (47 /* Some borders, paddings + my salary :( */);
		var wrapper_current_left	= Math.round(wrapper_position.left);
		var shift					= Math.round(wrapper_inner_width - slack + wrapper_current_left);

		if(shift > default_shift){
			shift = default_shift
		}else if(shift < default_shift && shift > default_shift * 2){
			shift = default_shift * 2;
		}

		if(wrapper_current_left != shift){
			wrapper.css('left', shift);
		}
	});

	pops.bind('mouseleave', function(event){
		$(this).removeClass('hover');
	});
};

// Sidebar-block carousel.
new function(){
	var list = $('.carousel.tips');
	var wrapper = list.parent();
	var left_button = wrapper.find('> .controls .left');
	var right_button = wrapper.find('> .controls .right');
	var step;

	var learn_more = $('.learn_more');
	learn_more.bind('click', function()
	{
	$("html, body").animate({  scrollTop: $("#learn_more").offset().top }, "slow");
	});

	// Reset scroll position.
	list.scrollLeft(0);
	left_button.hide('fast');

	left_button.bind('click', function(){move(-1); return false;});
	right_button.bind('click', function(){move(+1); return false;});

	function move(direction){
		step = list.width();

		var scroll_left = list.scrollLeft();
		var scroll_to = scroll_left + (direction * step);
		var scroll_width = list.prop('scrollWidth');

		if(scroll_to % step > step / 2){
			scroll_to = step * Math.ceil(scroll_to / step);
		}else{
			scroll_to = step * Math.floor(scroll_to / step);
		}

		if(scroll_width <= scroll_to + step){
			right_button.hide('fast');
		}else if(scroll_to < step){
			left_button.hide('fast');
		}

		if(scroll_left <= step && scroll_to >= step){
			left_button.show('fast');
		}else if(scroll_left + step >= scroll_width && scroll_to < scroll_left){
			right_button.show('fast');
		}

		list.animate({'scrollLeft' : scroll_to});
	}
};

// Index page "problems" carousel.
new function(){
	var wrapper = $('.carousel_wrapper.problem');
	var list = wrapper.find('> .carousel');
	var left_button = wrapper.find('> .controls .left');
	var right_button = wrapper.find('> .controls .right');
	var list_width = list.width();
	var scroll_width = list.prop('scrollWidth');
	var step = list_width / 5;
	var speed_per_pixel = 30;
	var autoscroll_in = 8000;

	// Reset scroll position.
	list.scrollLeft(0);
	check_width();

	if($.browser.msie){
		setInterval(check_width, 1000);
	}else{
		$(window).bind('resize', check_width);
	}

	setTimeout(function(){
		list_width = list.width();
		scroll_width = list.prop('scrollWidth');
		move(1, scroll_width - list_width , (scroll_width - list_width) * speed_per_pixel);
	}, autoscroll_in);

	// They do not care about parent object scroll offset.
	if($.browser.webkit || $.browser.opera){
		list.find('> * h4 a').bind('mouseover', function(){
			$(this).find('.pop').css('left', $(this).position().left);
		});
	}

	function check_width(){
		list_width = list.width();
		scroll_width = list.prop('scrollWidth');
		var scroll_left = list.scrollLeft();

		if(!scroll_left){
			if(!left_button.data('hidden')){
				hide_left_button();
			}
		}else if(scroll_left){
			if(left_button.data('hidden')){
				show_left_button();
			}
		}

		if(scroll_left === scroll_width - list_width){
			if(!right_button.data('hidden')){
				hide_right_button();
			}
		}else if(scroll_width > list_width){
			if(right_button.data('hidden') === undefined || right_button.data('hidden')){
				show_right_button();
			}
		}
	}

	function hide_right_button(){
		right_button.data('hidden', true).fadeOut('fast');
	}

	function show_right_button(){
		right_button.data('hidden', false).fadeIn('fast');
	}

	function hide_left_button(){
		left_button.data('hidden', true).fadeOut('fast');
	}

	function show_left_button(){
		left_button.data('hidden', false).fadeIn('fast');
	}

	left_button.bind('click', function(){move(-1); return false;});
	right_button.bind('click', function(){move(+1); return false;});

	function move(direction, scroll_to, duration){
		list_width = list.width();
		scroll_width = list.prop('scrollWidth');
		var scroll_left = list.scrollLeft();
		var scroll_to = scroll_to == undefined ? scroll_left + (direction * step) : scroll_to;
		var max_scroll = scroll_width - list_width;

		if(scroll_to < 0){
			scroll_to = 0;
		}

		if(scroll_to > max_scroll || scroll_to + (direction * step) > max_scroll){
			scroll_to = max_scroll;
		}else if(scroll_to - step < 0){
			scroll_to = 0;
		}

		if(scroll_to == scroll_left){
			return;
		}

		var distance = Math.abs(scroll_left - scroll_to);

		if(scroll_to !== 0){
			if(left_button.data('hidden')){
				show_left_button();
			}
		}else if(scroll_to === 0){
			if(!left_button.data('hidden')){
				hide_left_button();
			}
		}

		if(scroll_to === max_scroll && distance < step){
			if(!right_button.data('hidden')){
				hide_right_button();
			}
		}else if(scroll_to < max_scroll){
			if(right_button.data('hidden')){
				show_right_button();
			}
		}

		list.stop().animate({'scrollLeft' : scroll_to}, {
			duration	: duration ? duration : 500,
			complete	: check_width
		});
	}
};

// Index page big carousel(bigone).
new function(){
	var wrapper = $('.carousel_wrapper.bigone');
	var list = wrapper.find('.carousel');
	var scroller = list;
	var items = list.children();
	var countdown = 7000;
	var effect_duration = 2000;
	var click_effect_duration = 500;
	var controll_item_width = 16;

	if(wrapper.length < 1){
		return;
	}

	var controls = $(document.createElement('div')).addClass('controls');
	var controll_bar = $('<div class="scroll_bar"></div>');
	var background_bar = $('<div class="background_bar"></div>');

	var contol_items = $(new Array(items.length + 1).join('<a href="#"></a>'));
	var points = $(new Array(items.length + 1).join('<i></i>'));
	var contol_items_layer_1 = $('<div class="layer_1"></div>').append(new Array(items.length + 1).join('<i></i>'));
	var contol_items_layer_2 = $('<div class="layer_2"></div>').append(points);
	var contol_items_layer_3 = $('<div class="layer_3"></div>').append(contol_items);

	contol_items.bind('click', function(){
		var index = contol_items.index(this);

		play(contol_items.index(this), click_effect_duration);

		return false;
	});

	controls.append(background_bar)
	controls.append(controll_bar);
	controls.append(contol_items_layer_1);
	controls.append(contol_items_layer_2);
	controls.append(contol_items_layer_3);
	wrapper.append(controls);

	var max_controll_bar_width = controls.width() - controll_item_width;
	var controll_item_distance = max_controll_bar_width / (contol_items.length - 1);

	function play(current_index, speed){
		var current_item	= $(items.get(current_index));
		var previous_item	= items.filter(function(){return $(this).data('selected');});
		var previous_index	= items.index(previous_item);
		var previous_point	= $(points.get(previous_index));
		var current_point	= $(points.get(current_index));
		var used_direction	= previous_index < current_index ? 1 : -1;
		var distance		= Math.abs(previous_index - current_index);

		if(used_direction > 0){
			var next_index = current_index + 2 > items.length ? current_index - 1 : current_index + 1;
		}else{
			var next_index = current_index - 1 >= 0 ? current_index - 1 : 1;
		}

		var on_half_complete = function(){
			current_item.data('selected', true);
			previous_item.data('selected', false);

			change(current_item, effect_duration);
			current_point.animate({opacity : 1});
			previous_point.animate({opacity : 0});
		}

		var on_full_complete = function(){
			play(next_index, countdown);
		};

		controll_bar.stop(true, false);

		if(current_index === previous_index){
			on_full_complete();
			return;
		}

		if(previous_index < 0){
			current_point.animate({opacity : 1}, {
				complete	: function(){
					on_half_complete();
					on_full_complete();
				}
			});

			return;
		}

		var scroll_to = current_index * controll_item_distance;
		var half_properties = {width : controll_item_distance * distance}
		var full_properties = {width : 0};

		if(used_direction > 0){
			half_properties.left = previous_index * controll_item_distance
			full_properties.left = scroll_to;
		}else{
			half_properties.left = scroll_to;
			full_properties.left = scroll_to;
		}

		controll_bar.animate(half_properties, {
			duration	: speed,
			easing		: 'swing',
			complete	: function(){
				on_half_complete();

				controll_bar.animate(full_properties, {
					duration	: speed,
					easing		: 'swing',
					complete	: on_full_complete
				});
			}
		});
	}

	function change(item, duration, callback){
		scroller.animate({scrollLeft : item.position().left + scroller.scrollLeft()}, {
			duration	: duration,
			easing		: 'easeInOutExpo',
			complete	: callback

		});
	}

	play(0, countdown);
}

// Accordion
new function(){
	$('.accordion_wrapper').accordion();
};

// Ajxa load more articles
new function(){
	$('.load_more.button').each(function(){
		var button = $(this);
		var list = $('#' + button.attr('rel'));

		if(!list.length){
			return;
		}

		button.bind('click', function(){
			$.ajax({
				url			: button.attr('href'),
				complete	: function(ajax){
					var result = $.parseJSON(ajax.responseText);


					if(result.list_next_page){
						button.attr('href', result.list_next_page);
					}else{
						button.parents('.block_content').slideUp();
					}

					if(result.list_content){
						var new_items = $(result.list_content).css('display', 'none');
						list.append(new_items);

						if(list.hasClass('accordion')){
							list.accordion();
						}

						new_items.slideDown();
					}
				}
			});

			return false;
		});
	});
}

new function(){
	var list = $('.bookmarker');
	var items = list.find('ul');
	var default_item = list.find('.ico_default');

	items.css({visibility : 'hidden', display : 'block'});

	var items_height = items.height();

	items.css({marginTop : -items_height, visibility : 'visible'});

	default_item.toggle(function(){
		items.stop().animate({marginTop : 0});
	}, function(){
		items.stop().animate({marginTop : -items_height});
	});
}

});

$.fn.alter_select = (function(){
	function alter(options){
		var select = this;

		if(select.data('altered_select')){
			return select;
		}

		var altered_select	= $(document.createElement('div')).addClass('altered_select');
		var label 			= $(document.createElement('div')).addClass('label');
		var arrow 			= $(document.createElement('div')).addClass('arrow');
		var holder 			= select.parent();
		var update_label	= function(){
			if(select.prop('selectedIndex') > -1){
				label.text(select.prop('options')[select.prop('selectedIndex')].innerHTML);
			}else{
				label.text('');
			}
		}

		update_label();
		altered_select.append(label);
		altered_select.append(arrow);
		select.before(altered_select);
		altered_select.append(select);
		select.bind('change', update_label);
		select.bind('keyup', update_label);

		return select;
	}

	return function(options){
		return $(this).each(function(){
			alter.call($(this), options);
		});
	};
})();

$.fn.accordion = (function(){
	var effect_duration = 400;
	var color_from_1 = [255, 255, 255];
	var color_from_2 = [252, 250, 247];
	var color_to = [255, 253, 230];
	var to_rgb = function(from, to, position){
		return [
			Math.abs(parseInt(((from[0] - to[0]) / 100) * position + to[0])),
			Math.abs(parseInt(((from[1] - to[1]) / 100) * position + to[1])),
			Math.abs(parseInt(((from[2] - to[2]) / 100) * position + to[2]))
		];
	};
	var pull = function(leaver, direction, oncomplete){
		if(!direction){
			direction = +1;
		}

		var frames = 12 + (direction > 0 ? -2 : 0);
		var frame = 1 / frames;
		var current_frame = (direction > 0 ? 1 : 3);
		var frame_width = 31;
		var interval = setInterval(function(){
			leaver.css('backgroundPosition', direction * (current_frame * frame_width) + 'px 0');

			if(++current_frame > frames){
				clearInterval(interval);

				if(typeof oncomplete === 'function'){
					oncomplete();
				}
			}
		}, effect_duration / frames);
	};
	var click_handler = function(){
		var title = $(this);
		var title_link = title.find('a:first-child');
		var item = title.parent();
		var content = item.find('> .content');
		var leaver = item.find('> .title .lever');
		var item_even = item.parents('.accordion').find('> *').filter(':even').has(this).length ? true : false;

		if(item.hasClass('open')){
			leaver.queue('fx', function(next){
				pull(leaver, -1, next);
			});
			content.slideUp(effect_duration, function(){});
			title_link.animate({fontSize : '100%'}, {
				duration	: effect_duration,
				step		: function(value, effect){
					if(item_even){
						var rgb = to_rgb(color_to, color_from_2, 100 - (effect.pos * 100));
					}else{
						var rgb = to_rgb(color_to, color_from_1, 100 - (effect.pos * 100));
					}

					item.css('backgroundColor', 'rgb(' + rgb.join(',') + ')');
				},
				complete	: function(){
					item.removeClass('open');
				}
			});
		}else{
			leaver.queue('fx', function(next){
				pull(leaver, +1, next);
			});
			content.slideDown(effect_duration);
			title_link.animate({'fontSize' : '190%'}, {
				duration	: effect_duration,
				step		: function(value, effect){
					if(item_even){
						var rgb = to_rgb(color_from_2, color_to, 100 - (effect.pos * 100));
					}else{
						var rgb = to_rgb(color_from_1, color_to, 100 - (effect.pos * 100));
					}

					item.css('backgroundColor', 'rgb(' + rgb.join(',') + ')');
				},
				complete	: function(){
					item.addClass('open');
				}
			});
		}

		return false;
	}

	function create_accordion(){
		if($(this).hasClass('accordion')){
			var list = $(this);
		}else{
			var list = $(this).find('.accordion');
		}

		if(!list.length){
			return;
		}

		list.find('> * > .title').each(function(){
			if($(this).data('accordion_extended')){
				return;
			}

			$(this).data('accordion_extended', true);
			$(this).bind('click', click_handler);
		});
	}

	return function(){
		$(this).each(create_accordion);
	}

})();
