jQuery().ready
(
	function()
	{
		var voidHref = 'javascript:void(0);';
		
		/**
		 * links
		 */
		$('a[href=#]').attr('href', voidHref);
		
		
		/**
		 * login form
		 */
		$('a.toggle-login-box').click
		(
			function()
			{
				var loginAnchor = $(this);
				var loginForm = $('form#login-box');
				var loginAnchorLocation = loginAnchor.attr('rel');
				var loginFormLocation = loginForm.attr('rel');
				
				if (loginAnchorLocation == loginFormLocation && loginForm.is(':visible'))
				{
					loginForm.slideToggle('fast');
				}
				else
				{
					var loginFormTop;
					var loginFormRight;
					
					if (loginAnchorLocation == 'top')
					{
						loginFormTop = loginAnchor.get(0).offsetTop + 16;
						loginFormRight = 0;
					}
					else
					{
						loginFormTop = loginAnchor.get(0).offsetTop - 70;
						loginFormRight = 150;
					}
					
					if (loginForm.is(':visible'))
					{
						loginForm.hide();
					}
					
					loginForm
						.css('top', loginFormTop + 'px')
						.css('right', loginFormRight + 'px')
						.attr('rel', loginAnchorLocation)
						.slideToggle
						(
							'fast',
							function()
							{
								// adding a focus to the form
								if ($(this).is(':visible'))
								{
									$('input:first', this).focus();
								}
							}
						);
				}
			}
		);
		
		
		/**
		 * buyer steps
		 */
		var themeImagesDir = '/wp-content/themes/mytownmedia/images/';
		
		$('ul.buyersteps li div[id^=buyersteps-] div').each
		(
			function()
			{
				var container = $(this);
				var className = container.attr('class');
				var logoHtml = '<span class="logo">MyTownMedia</span>';
				var imgHtml = '<img class="art" src="' + themeImagesDir + className + '.jpg" alt="' + className + '" width="400" height="300" />';
				container.prepend(logoHtml + imgHtml);
			}
		);
		
		$('ul.buyersteps li a[id^=buyersteps-]').each
		(
			function()
			{
				var zoomOptions =
				{
					directory: themeImagesDir + 'zoom',
					closeOnClick: true,
					width: 800,
					height: 400
				};
				
				$(this).fancyZoom(zoomOptions);
			}
		);
		
		
		/**
		 * dynamic sidebar buttons and content
		 */ 
		var sidebarButtons = $('div#sidebar-buttons');
		
		if (sidebarButtons.is('#sidebar-buttons'))
		{
			var postContent = $('div#post-content');
			
			// content switcher
			var postContentSwitcher = function(subject)
			{
				// hiding all content
				postContent.children().hide();
				
				// showing the subject element
				subject.show();
				
				// starting element to initiate a loop through
				var next = subject.next();
				
				// looping through the following elements until end of post or the next header
				while (next.length && !$(next).is(':header'))
				{
					next = next.show().next();
				}
			};
			
			// event for sidebar dynamic buttons 
			var sidebarButtonsClick = function()
			{
				// current link/button
				var button = $(this);
				
				// active flag
				$('a', sidebarButtons).removeClass('on');
				button.addClass('on').blur();
				
				// target header in the content section
				var header = $(':header.' + button.attr('rel').toString(), postContent);
				
				if (header.is(':header'))
				{
					postContentSwitcher(header);
				}
			};
			
			// sidebar dynamic buttons creation
			$(':header', postContent).each
			(
				function(index)
				{
					var header = $(this);
					var element;
					
					// checking nested headers
					if (!header.next().is(':header'))
					{
						element = $('<a></a>')
							.attr('href', voidHref)
							.text(header.text())
							.click(sidebarButtonsClick);
						
						// link identifier
						var linkIdentifier = header.attr('class');
						
						if (linkIdentifier)
						{
							element
								.attr('id', linkIdentifier)
								.attr('href', '#' + linkIdentifier);
						}
						
						// pair identifier
						var pairIdentifier = 'dynamic-button-' + index;
						
						header.addClass(pairIdentifier);
						element.attr('rel', pairIdentifier);
					}
					else
					{
						element = $('<strong></strong>')
							.text(header.text() + ':');
					}
					
					element.addClass(header[0].tagName.toLowerCase());
					
					// appending new element
					sidebarButtons.append(element);
				}
			);
			
			// initial section to be shown by default
			if ($(':first', postContent).is(':header'))
			{
				$('a:first', sidebarButtons).click();
			}
			else
			{
				// prepending a heading to content
				postContent.prepend($('div#standby-post-title').html());
				
				// get it displayed
				postContentSwitcher($(':first', postContent));
			}
			
			// simulating a click on media buyers navigation if a corresponding anchor exists in url
			var mediaBuyersAnchor = $.url.attr('anchor');
			
			if (mediaBuyersAnchor)
			{
				var mediaBuyersMatch = mediaBuyersAnchor.match(/^buyersteps-/);
				
				if (mediaBuyersMatch && mediaBuyersMatch.length > 0)
				{
					var mediaBuyersLink = $('a#' + mediaBuyersAnchor);
					
					if (mediaBuyersLink.is('a'))
					{
						mediaBuyersLink.click();
					}
				}				
			}
		}
		
		
		/**
		 * request phone number page
		 */
		function phoneNumberRequested(data)
		{
			var response = $('response', data);
			var success = $('status', response).text() == 'OK';
			var messageText = $('message', data).text();
			var messageClass = (success ? 'success' : 'error') + '-note';
			
			$('div.request-phone-number img').fadeOut
			(
				'fast',
				function()
				{
					$('a#request-phone-number').fadeIn('fast');
				}
			);
			
			$('div.ajax-message')
				.text(messageText)
				.removeClass('success-note')
				.removeClass('error-note')
				.addClass(messageClass)
				.fadeIn('slow');
			
			return false;
		}
		 
		$('a#request-phone-number').click
		(
			function()
			{
				var options = 
				{
					url: '/wp-content/plugins/secondmeta-mtm-reporting/secondmeta-mtm-reporting-ajax.php',
					type: 'post',
					dataType: 'xml',
					data: 'action=request-phone-number',
					processData: false,
					success: phoneNumberRequested
				};
				
				$(this).hide();
				$('div.request-phone-number img').fadeIn('fast');
				
				$.ajax(options);
				
				return false;
			}
		);
		
		
		/** 
		 * manage phone names
		 */
		function togglePhoneRowElement(element, selector)
		{
			$(element)
				.parent().parent()
				.children('span').hide().end()
				.find(selector).show()
				.find('input:visible').focus();
		}
		
		function phoneNumberUpdated(data)
		{
			var response = $('response', data);
			var success = $('status', response).text() == 'OK';
			var messageText = $('message', data).text();
			var messageClass = (success ? 'success' : 'error') + '-note';
			
			var number = $('dnis', response).text() + $('extension', response).text();
			var container = $('td#phone-' + number);

			var activeElement = success ? 'span.change' : 'span.save';
			togglePhoneRowElement($('a.save-phone-number-name', container), activeElement);
			
			var message = $('div.message', container);
			
			message
				.text(messageText)
				.removeClass('success-note')
				.removeClass('error-note')
				.addClass(messageClass);
			
			if (success)
			{
				$('span.name-text', container).text($('name', data).text());
				$('a.change-phone-number-name', container).text('Change Name');
				
				if (message.is(':visible'))
				{
					message.slideUp('normal');
				}
			}
			else
			{
				message.slideDown('normal');
			}
			
			return false;
		}
		
		$('.reportTable td span.change a.change-phone-number-name').click
		(
			function()
			{
				togglePhoneRowElement(this, 'span.save');
			}
		);
		
		$('.reportTable td span.save a.cancel-phone-number-name').click
		(
			function()
			{
				togglePhoneRowElement(this, 'span.change');
			}
		);
		
		$('.reportTable td span.save a.save-phone-number-name').click
		(
			function()
			{
				var options = 
				{
					url: '/wp-content/plugins/secondmeta-mtm-reporting/secondmeta-mtm-reporting-ajax.php',
					type: 'post',
					dataType: 'xml',
					data: 'action=update-phone-number&name=' + $(this).prev().val() + '&' + $(this).attr('rel'),
					processData: false,
					success: phoneNumberUpdated
				};
				
				togglePhoneRowElement(this, 'span.progress');
				
				$.ajax(options);
				
				return false;
			}
		);
		
		
		/**
		 * reporting
		 */
		function filteredReport(element)
		{
			var selector = $(element);
			
			if (selector.is('select'))
			{
				selector
					.blur()
					.removeAttr('disabled')
					.next().removeClass('update');
			}
		}
		
		function filteredReportPeriod(data)
		{
			var response = $('response', data);
			var success = $('status', response).text() == 'OK';
			var messageText = $('message', data).text();
			var messageClass = (success ? 'success' : 'error') + '-note';
			var totals = $('totals', data).text();
			
			filteredReport('#filter-report-period');
			
			$('#reporting-totals')
				.removeClass('update')
				.hide()
				.html(totals)
				.slideDown('slow');
			
			return false;
		}
		
		function filteredReportByPhone(data)
		{
			var response = $('response', data);
			var success = $('status', response).text() == 'OK';
			var messageText = $('message', data).text();
			var messageClass = (success ? 'success' : 'error') + '-note';
			var phones = $('phones', data).text();
			
			if (!success)
			{
				$('div.ajax-message')
					.text(messageText)
					.removeClass('success-note')
					.removeClass('error-note')
					.addClass(messageClass)
					.fadeIn('normal');
			}
			else
			{
				$('div.ajax-message').fadeOut('fast');
			}
			
			filteredReport('#filter-report-phone');
			
			$('table.reportTable tbody').html(phones).fadeIn('normal');
			
			return false;
		}
		
		function filterReport(ajaxOptions, element)
		{
			if (element && $(element).is('select'))
			{
				$(element)
					.attr('disabled', 'disabled')
					.next().addClass('update');
			}
			
			$.ajax(ajaxOptions);
		}
		
		function filterReportByPhone()
		{
			var periodSelector = $('#filter-report-period');
			var periodLenth = periodSelector.is('select') ? periodSelector.val() : 1;
			
			var phoneSelector = $('#filter-report-phone');
			var phone = phoneSelector.val().split('/');
			
			var options = 
			{
				url: '/wp-content/plugins/secondmeta-mtm-reporting/secondmeta-mtm-reporting-ajax.php',
				type: 'post',
				dataType: 'xml',
				data: 'action=filter-report-phone&period=' + periodLenth + '&dnis=' + phone[0] + '&extension=' + phone[1],
				processData: false,
				success: filteredReportByPhone
			};
			
			$('table.reportTable tbody, div.ajax-message').fadeOut('fast');
			
			filterReport(options, phoneSelector);
		}
		
		function filterReportPeriod()
		{
			var periodSelector = $('#filter-report-period');
			var periodLenth = periodSelector.is('select') ? periodSelector.val() : 1;
			
			var options = 
			{
				url: '/wp-content/plugins/secondmeta-mtm-reporting/secondmeta-mtm-reporting-ajax.php',
				type: 'post',
				dataType: 'xml',
				data: 'action=filter-report-period&period=' + periodLenth,
				processData: false,
				success: filteredReportPeriod
			};
			
			var reportingTotals = $('#reporting-totals');
			var reportingTotalsChildren = reportingTotals.children();
			
			if (reportingTotalsChildren.length)
			{
				reportingTotalsChildren.slideUp
				(
					'slow',
					function()
					{
						reportingTotalsChildren.remove();
						reportingTotals.addClass('update');
						filterReport(options, periodSelector);
					}
				);
			}
			else
			{
				reportingTotals.addClass('update');
				filterReport(options, periodSelector);
			}
			
			if ($('#filter-report-phone').is('select'))
			{
				filterReportByPhone();
			}
		}
		
		$('#filter-report-period').change
		(
			function()
			{
				filterReportPeriod();
			}
		);
		
		$('#filter-report-phone').change
		(
			function()
			{
				filterReportByPhone();
			}
		);
		
		if ($('#reporting-totals').is('div'))
		{
			filterReportPeriod();
		}
		
		
		/**
		 * earnings estimator
		 */
		var earningsEstimatorContainer = $('#earnings-estimator');
		
		if (earningsEstimatorContainer.length)
		{
			var estimatorCallVolume = $('#estimator-call-volume');
			var estimatorConversionRate = $('#estimator-conversion-rate');
			var estimatorDaysAmount = $('#estimator-days-amount');
			
			var estimatorResultContainer = $('#estimator-result');
			var estimatorPattern = $('#estimator-pattern').html();
			
			function earningsEstimator()
			{
				// conversion rate
				var conversionRate = Number(estimatorConversionRate.val());
				
				// number of working days in month
				var daysAmount = Number(estimatorDaysAmount.val());
				
				// getting calls parameters, a sample value format: "1|9|1.25"
				var calls = String(estimatorCallVolume.val()).split('|');
				
				// first parameter is a minimum number of call within selected period
				var callsMinVolume = Number(calls[0]);
				
				// second parameter is a maximum number of call within selected period
				var callsMaxVolume = Number(calls[1]);
				
				// price of a call within selected period
				var rangePrice = Number(calls[2]);
				
				// call prices depends on conversion rate
				var callPrice = Number(rangePrice * conversionRate).toFixed(2);
				
				// calculating estimations
				var estimationMin = Number(callsMinVolume * callPrice * daysAmount).toFixed(0);
				var estimationMax = Number(callsMaxVolume * callPrice * daysAmount).toFixed(0);
				
				// output parameters
				var callsVolumeLabel = $(':selected', estimatorCallVolume).text();
				var conversionRateLabel = $(':selected', estimatorConversionRate).text().toLowerCase();
				
				// forming an output string
				var output = estimatorPattern
					.replace(/{callsVolumeLabel}/g, callsVolumeLabel.toLowerCase())	
					.replace(/{callsVolumeLabelUC}/g, callsVolumeLabel)
					.replace(/{conversionRateLabel}/g, conversionRateLabel)
					.replace(/{rangePrice}/g, rangePrice)
					.replace(/{conversionRate}/g, conversionRate)
					.replace(/{callPrice}/g, callPrice)
					.replace(/{daysAmount}/g, daysAmount)
					.replace(/{callsMinVolume}/g, callsMinVolume)
					.replace(/{callsMaxVolume}/g, callsMaxVolume)
					.replace(/{estimationMin}/g, estimationMin)
					.replace(/{estimationMax}/g, estimationMax);
				
				// output animation
				// using a "fadeTo" transition to avoid a "jumping" effect in the footer
				estimatorResultContainer.fadeTo
				(
					'fast', 0, function()
					{
						$(this).html(output).fadeTo('fast', 1);
					}
				);
				
				return false;
			}
			
			$('select', earningsEstimatorContainer).bind('change', earningsEstimator);
			
			earningsEstimator();
		}
	}
);