;(function($) {

	"use strict";

	// jQuery hacks
	var _addClass = $.fn.addClass;
	$.fn.addClass = function() {
		var result = _addClass.apply( this, arguments );
		if (this.prop('tagName') == 'BODY' && arguments[0] == 'folded') { calculatePositionAndSize(); }
		return result;
	};
	var _removeClass = $.fn.removeClass;
	$.fn.removeClass = function() {
		var result = _removeClass.apply( this, arguments );
		if (this.prop('tagName') == 'BODY' && arguments[0] == 'folded') { calculatePositionAndSize(); }
		return result;
	};

	// custom checkbox and radiobutton event binding
	vp.custom_check_radio_event(".vp-wrap", ".vp-field.vp-checked-field .field .input label");

	$( function() {
		vp.init_controls($('.vp-wrap'));
	});

	/* BEGIN FETCHING ALL FIELDS' VALIDATION and BINDING RULES */
	var validation    = [];
	var bindings      = [];
	var items_binding = [];
	var dependencies  = [];
	var dep;
	$('.vp-menu-goto').each(function(i) {
		var href = $(this).attr('href'),
		    $panel = $(href),
		    fields = [];

		$panel.children('.vp-field').each(function(j) {
				var $field = $(this),
				name       = $field.attr('id'),
				rules      = $field.attr('data-vp-validation'),
				bind       = $field.attr('data-vp-bind'),
				items_bind = $field.attr('data-vp-items-bind'),
				type       = $field.getDatas().type,
				$input     = $('[name="' + name + '"]');

			dep = $field.attr('data-vp-dependency');

			dep         && dependencies.push({dep: dep, type: 'field', source: $field.attr('id')});
			bind        && bindings.push({bind: bind, type: type, source: name});
			items_bind  && items_binding.push({bind: items_bind, type: type, source: name});
			rules       && fields.push({name: name, rules: rules, type: type});
		});

		$panel.children('.vp-section').each(function(i) {
			var $section = $(this);

			dep = $section.attr('data-vp-dependency');
			dep && dependencies.push({dep: dep, type: 'section', source: $section.attr('id')});

			$section.find('.vp-field').each(function(j) {
				var $field     = $(this),
					name       = $field.attr('id'),
					rules      = $field.attr('data-vp-validation'),
					bind       = $field.attr('data-vp-bind'),
					items_bind = $field.attr('data-vp-items-bind'),
					type       = $field.getDatas().type,
					$input     = $('[name="' + name + '"]');

				dep = $field.attr('data-vp-dependency');

				dep         && dependencies.push({dep: dep, type: 'field', source: $field.attr('id')});
				bind        && bindings.push({bind: bind, type: type, source: name});
				items_bind  && items_binding.push({bind: items_bind, type: type, source: name});
				rules       && fields.push({name: name, rules: rules, type: type});

			});
		});

		if (fields.length > 0) validation.push({ name: href.trimChar('#'), fields: fields });
	});
	/* END FETCHING ALL FIELDS' VALIDATION and BINDING RULES */

	// get and click current hash
	$('.vp-js-menu-goto').click(function(e) {
		e.preventDefault();
		// add `_` prefix
		window.location.hash = '#_' + $(this).attr('href').substr(1);
		var $this     = $(this),
		    $li       = $this.parent('li'),
		    $parent   = $li.parents('li'),
		    $siblings = $li.siblings('li'),
		    $parent_siblings = $parent.siblings('li'),
		    $panel    = $($this.attr('href'));
		$siblings.removeClass('vp-current');
		$parent_siblings.removeClass('vp-current');
		$parent.addClass('vp-current');
		$li.addClass('vp-current');
		$panel.siblings('.vp-panel').removeClass('vp-current');
		$panel.addClass('vp-current');
	});

	// goto current menu
	var hash = window.location.hash;
	if (hash !== '')
	{
		// remove `_` prefix
		hash = '#' + hash.substr(2);
		$('a[href="' + hash + '"]').trigger('click');
	}
	else
	{
		$('.vp-current > .vp-js-menu-goto').click();
	}

	$('.vp-js-menu-dropdown').click(function(e) {
		e.preventDefault();
		var $this = $(this),
		    $parent = $this.parent('li'),
		    $li = $parent.siblings('li'),
		    $sub = $this.next('ul');
		if ($parent.hasClass('vp-current')) return;
		$li.removeClass('vp-current');
		$parent.addClass('vp-current');
		if($sub.children('li.vp-current').exists())
			$sub.children('li.vp-current').children('a').click();
		else
			$sub.children('li').first().children('a').click();
	});

	// Bindings
	for (var i = 0; i < bindings.length; i++)
	{
		var field = bindings[i],
		    temp  = field.bind.split('|'),
		    func  = temp[0],
		    dest  = temp[1],
		    ids   = [];

		dest = dest.split(/[\s,]+/);

		for (var j = 0; j < dest.length; j++)
		{
			ids.push(dest[j]);
		}

		for (var j = 0; j < ids.length; j++)
		{
			vp.binding_event(ids, j, field, func, '.vp-wrap', 'option');
		}
	}
	/* ============================================================ */

	// Items Binding
	for (var i = 0; i < items_binding.length; i++)
	{
		var field = items_binding[i],
		    temp  = field.bind.split('|'),
		    func  = temp[0],
		    dest  = temp[1],
		    ids   = [];

		dest = dest.split(/[\s,]+/);

		for (var j = 0; j < dest.length; j++)
		{
			ids.push(dest[j]);
		}

		for (var j = 0; j < ids.length; j++)
		{
			vp.items_binding_event(ids, j, field, func, '.vp-wrap', 'option');
		}
	}
	/* ============================================================ */

	// DEPENDENCY
	for (var i = 0; i < dependencies.length; i++)
	{
		var field = dependencies[i],
		    temp  = field.dep.split('|'),
		    func  = temp[0],
		    dest  = temp[1],
		    ids   = [];

		dest = dest.split(',');

		for (var j = 0; j < dest.length; j++)
		{
			ids.push(dest[j]);
		}

		for (var j = 0; j < ids.length; j++)
		{
			vp.dependency_event(ids, j, field, func, '.vp-wrap');
		}
	}

	// Ajax Saving
	$('.vp-js-option-form').bind('submit', function(e) {
		e.preventDefault();
		
		// update tinyMCE textarea content
		vp.tinyMCE_save();

		$('.vp-js-option-form .vp-field').removeClass('vp-error');
		$('.validation-notif.vp-error').remove();
		$('.validation-msg.vp-error').remove();

		var allError = 0,
		    menuNotifHTML = '<em class="validation-notif vp-error"></em>';

		for (var i=0; i<validation.length; i++)
		{
			var panel = validation[i];

			panel.nError = 0;
			panel.nError = vp.fields_validation_loop(panel.fields);

			if (panel.nError > 0)
			{
				// notify the menu which has the href
				var $notif  = $(menuNotifHTML),
				    $anchor = $('[href="#' + panel.name +'"]'),
				    $grandparent = $anchor.parent('li').parent('ul');
				$notif.appendTo($anchor);
				if ($grandparent.hasClass('vp-menu-level-2'))
				{
					if ($grandparent.siblings('a').children('.validation-notif.vp-error').length === 0)
					{
						$notif.clone().appendTo($grandparent.siblings('a'));
					}
				}
			}
			allError = allError + panel.nError;
		}

		// do not saving it any error occurs
		if (allError > 0) { return; }

		// otherwise, do saving
		var $loading = $('.vp-js-save-loader'),
			$button = $(this).find('.vp-save'),
			$save_status = $('.vp-js-save-status'),
			$form = $('#vp-option-form'),
			option = $form.serializeArray(),
			data = {
				action: 'vp_ajax_' + vp_opt.name + '_save',
				option: option,
				nonce : vp_opt.nonce
			};

		$button.attr('disabled', 'disabled');
		$loading.stop(true, true).fadeIn(100);

		$.post(ajaxurl, data, function(response) {
			$save_status.html(response.message);
			if (response.status)
			{
				$save_status.addClass('success');
			}
			else
			{
				$save_status.addClass('failed');
			}
			$loading.stop(true, true).fadeOut(100, function() {
				$save_status.stop(true, true).fadeIn(100);
			});

			setTimeout(function() {
				$button.removeAttr('disabled');
				$save_status.stop(true, true).fadeOut(1000, function() {
					$save_status.removeClass('success').removeClass('failed');
				});
			}, 3000);
		}, 'JSON');

	});

	$('.vp-js-restore').bind('click', function(e) {
		e.preventDefault();

		if (!confirm('The current options will be deleted, do you want to proceed?'))
			return;

		var $button = $(this),
		    $parent = $button.parent(),
		    $status = $parent.find('.vp-js-status'),
		    $loader = $parent.find('.vp-js-loader'),
		    data    = {action: 'vp_ajax_' + vp_opt.name + '_restore', nonce : vp_opt.nonce};

		$button.attr('disabled', 'disabled');
		$loader.fadeIn(100);

		$.post(ajaxurl, data, function(response) {
			$loader.fadeOut(0);
			switch(response.code)
			{
				case parseInt(vp_opt.SAVE_SUCCESS):
					$status.html(vp_opt.util_msg.restore_success);
					break;
				case parseInt(vp_opt.SAVE_NOCHANGES):
					$status.html(vp_opt.util_msg.restore_nochanges);	
					break;
				case parseInt(vp_opt.SAVE_FAILED):
					$status.html(vp_opt.util_msg.restore_failed + ': ' + response.message);
					break;
			}
			$status.fadeIn(100);
			setTimeout(function() {
				$status.fadeOut(1000, function() {
					$button.removeAttr('disabled');
					$status.fadeOut(500);
					if (response.code == parseInt(vp_opt.SAVE_SUCCESS))
						location.reload();
				});
			}, 2000);
		}, 'JSON');
	});

	$('#vp-js-import').bind('click', function(e) {
		e.preventDefault();

		var $textarea      = $('#vp-js-import_text'),
		    $import_status = $('#vp-js-import-status'),
		    $import_loader = $('#vp-js-import-loader'),
		    $button        = $(this),
		    data           = {action: 'vp_ajax_' + vp_opt.name + '_import_option', option: $textarea.val(), nonce : vp_opt.nonce};

		$button.attr('disabled', 'disabled');
		$import_loader.fadeIn(100);

		$.post(ajaxurl, data, function(response) {
			$import_loader.fadeOut(0);
			if (response.status)
			{
				$import_status.html(vp_opt.util_msg.import_success);
			}
			else
			{
				$import_status.html(vp_opt.util_msg.import_failed + ': ' + response.message);
			}
			$import_status.fadeIn(100);
			setTimeout(function() {
				$import_status.fadeOut(1000, function() {
					$button.removeAttr('disabled');
					$import_status.fadeOut(500);
					if (response.status)
						location.reload();
				});
			}, 2000);
		}, 'JSON');
	});

	$('#vp-js-export').bind('click', function(e) {
		e.preventDefault();

		var $export_status = $('#vp-js-export-status'),
		    $export_loader = $('#vp-js-export-loader'),
		    $button        = $(this),
		    data           = {action: 'vp_ajax_' + vp_opt.name + '_export_option', nonce : vp_opt.nonce};

		$button.attr('disabled', 'disabled');
		$export_loader.fadeIn(100);
		$.post(ajaxurl, data, function(response) {
			$export_loader.fadeOut(0);
			if (!$.isEmptyObject(response.option) && response.status)
			{
				$('#vp-js-export_text').val(response.option);
				$export_status.html(vp_opt.util_msg.export_success);
			}
			else
			{
				$export_status.html(vp_opt.util_msg.export_failed + ': ' + response.message);
			}
			$export_status.fadeIn(100);
			setTimeout(function() {
				$export_status.fadeOut(1000, function() {
					$button.removeAttr('disabled');
					$export_status.fadeOut(500);
				});
			}, 3000);
		}, 'JSON');
	});


}(jQuery));