var validators = {
	'notempty': [
		'\\S',
		'This field cannot be empty'
	],
	'url': [
		'^((https?|HTTPS?)\\:\\/\\/)?[a-zA-Z]\\w*([\\.\\-]\\w+)*\\.(aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|no|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|uk|gd|ge|gf|fr|gg|gh|gi|gl|gm|gn|gp|fr|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mn|mo|mp|mq|fr|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|fr|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|fr|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|fr|ro|rs|yu|ru|su|rw|sa|sb|sc|sd|se|sg|sh|si|sj|no|sk|sl|sm|sn|sr|st|su|sv|sy|sz|tc|td|tf|fr|tg|th|tj|tk|tl|tp|tm|tn|to|tp|tl|tr|tt|tv|tw|tz|ua|ug|uk|us|gov|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|fr|ws|ye|yt|fr|yu|za|zm|zw|arpa)(\\:\\d+)*([\\/\\.\\-\\?\\&\\%\\#=]\\w+)*\\/?$',
		'Invalid URL',
		function(field) {
			if (field.match(/^http/) === null) {
				return 'http://' + field;
			}
			return field.toLowerCase();
		}
	],
	'date': [
		'^(\\d{2}/\\d{2}/\\d{4})?$',
		'Invalid date'
	],
	'phone': [
		'^[ 0-9()-.]{9,}$',
		'The phone number entered is not valid. Please double-check the number and enter it again.'
	],
	'email': [
		'^\\S+@\\S+\\.[a-z]{2,4}$',
		'Please enter a valid email address in the format username@domain.com'
	],
	'year': [
		'^\\d{4}$',
		'The year entered is not valid.'
	],
	'integer': [
		'^\\-?\\d+$',
		'Must be an integer'
	],
	'selected': [
		'^[1-9]\\d*$',
		'Please select a value'
	],
	'selected_any': [
		'^.+$',
		'Please select a value'
	],
	'decimal': [
		'^\\-?\\d+(\\.\\d+)?$',
		'Must be a decimal'
	],
	'percentage':[
	    '^\\-?\\d+(\\.\\d+)?$',
	    'Must be percentage'
	],
    'short_decimal': [
		'^\\-?\\d*(\\.\\d+)?$',
		'Must be a decimal'
	],
	'yesno': [
		'^(1|0)$',
		'Please select Yes or No'
	],
	'max_length': function(length) {
		return [
			'^(.|\n){0,' + length + '}$',
			'Maximum length is ' + length
		];
	},
	'min_length': function(length) {
		return [
			'^(.|\n){' + length + ',}$',
			'Minimum length is ' + length
		];
	},
	'currency': [
		'^\\-?\\d+(\\.\\d+)?$',
		'Must be currency'
	],
    'company_name': [
		'^(\\d|\\w){1,50}',
		'Please check a company name. Name should contain at least two characters, cannot begin with a space or a punctuation mark'
	]
};

jQuery.fn.swap = function(b) {
	b = jQuery(b)[0];
	var a = this[0];
	var t = a.parentNode.insertBefore(document.createTextNode(''), a);
	b.parentNode.insertBefore(a, b);
	t.parentNode.insertBefore(b, t);
	t.parentNode.removeChild(t);
	return this;
};

function show_message(container, msg, timeout) {
	if (typeof timeout === 'undefined') {
		timeout = 2;
	}
	$('.notification').slideUp(function() {
		$(this).remove();
	});
	var message = $('<div class="notification" style="padding:0 4px; margin:3px 0 3px 0; background-color:#ffffcc; color:#000000; border: solid 1px gray; display:none;">' + msg + '</div>');
	if (container.find('.sol-subtitle').size()) {
		container.find('.sol-subtitle').after(message);
	}
	else {
		container.prepend(message);
	}
	message.slideDown();
	if (timeout !== true) {
		setTimeout(function() {
			message.slideUp(function() {
				message.remove();
			});
		}, timeout * 1000);
	}
}

function show_error(popup, errors) {
	var error_box = popup.find('.error-box');
	error_box.hide();
	var ul = error_box.find('.e-content ul');
	ul.empty();
	var error, input, len=errors.length;
	for(var i=0 ; i<len ; i++) {
		error = errors[i];
		input = error.input[0];
		if(!input.id) {
			input.id = 'uid_' + parseInt(Math.random() * 1000000000);
		}
		$('<li><label for="' + input.id + '">' + error.message + '</label></li>').appendTo(ul);
	}
	error_box.slideDown();
}

function setup_popup(title, modified, edit) {
	if (modified === null) { 
		modified = 'Last modified: <em>January 1, 2010 00:00am</em> by <a href="#">Name</a>';
	}
	var popup = $('#dialog_popup_content');
	var popupContent = popup.find('.l-content');
	popupContent.empty();
	edit.find('input:file').each(function(){
		var el = $(this);
		var wrap0 = $('<div class="input-file-wrap"></div>');
		var wrap1 = $('<div class="input-file"></div>');
		var inputText = $('<input type="text" readonly="readonly" />');
		var parent = el.parent();
		wrap1.append(el);
		wrap0.append(inputText);
		wrap0.append(wrap1);
		parent.append(wrap0);
		el.bind('change', function(){
			var file = $(this);
			file.parents('.input-file-wrap').find('input:text').val(file.val());
		});
	});
	edit.find('select, input:text, input:password, textarea').each(function(){
		var el = $(this);
		var wrap = $('<div class="input-wrap"><div class="cr lt"></div><div class="cr rt"></div><div class="cr lb"></div><div class="cr rb"></div></div>');
		el.parent().append(wrap);
		wrap.append(el);
	});
	popupContent.append(edit);
	popup.find('h1').html(title);
	popup.find('.left-box .modified').html(modified);

	return popup;
}

function create_editor(config, skip_required) {
	var user_role = $('#user_role').val();

	var form_tag = '';

	if (config.is_file) {
		form_tag = '<form method="post" action="" enctype="multipart/form-data" target="upload-target"></form>';
	} else {
		form_tag = '<form method="post" action=""></form>';
	}

  if (config.instructions && config.instructions != '') {
		edit = $('<div class="edit-layout"><div class="edit-instruct">' + config.instructions + '</div><div class="draft-form nx-clear">' + form_tag + '<div class="navigation"><ul></ul></div></div></div>');
	} else {
		edit = $('<div class="edit-layout"><div class="draft-form nx-clear">' + form_tag + '<div class="navigation"><ul></ul></div></div></div>');
	}

  if (config.is_file) {
    edit.append('<iframe name="upload-target" width="0" height="0" frameborder="0"></iframe>');
    edit.find('form').append('<input type="hidden" name="type" value="' + config.type + '" />');
    edit.find('form').append('<input type="hidden" name="provider_id" value="' + $('#provider_id').val() + '" />');
    edit.find('form').append('<input type="hidden" name="owner" value="' + $('#user_id').val() + '" />');
    edit.find('form').append('<input type="hidden" name="display_order" value="" />');
    edit.find('form').append('<input type="hidden" name="id" value="" />');
    edit.find('form').append('<input type="hidden" name="file_from" value="" />');
  }

	if (config.fields) {
		for (var i in config.fields)
		{
			var default_field = {
				'name':'title',
				'validator':validators.notempty,
				'type':'input'
			};
			var field = $.extend(default_field, config.fields[i]);

			var cont = $('<div></div>');
			if (field.label) {
				cont.append('<label>' + field.label + (!skip_required && field.required && (user_role == 'provider' || user_role == 'ffc') ? '<sup style="color:red; font-weight:bold;">*</sup>' : '') + '</label><br />');
			}
			var input;

			switch (field.type)
			{
			case 'input':
				input = $('<input type="text" name="'+field.name+'" />');
				break;
			case 'textarea':
				input = $('<textarea name="'+field.name+'" ></textarea>');
				break;
			case 'file':
				if (config.file_link) {
					cont.append('<div id="file_link">' + config.file_link + '</div>');
				} else {
					cont.append('<div id="file_link"></div>');
				}
				input = $('<input type="file"  name="'+field.name+'" />');
				break;
			case 'checkbox':
				input = $('<label><input style="width:auto; border:none;" type="checkbox" name="'+field.name+'" />  ' + field.text + '</label>');
				break;
			case 'radio':
				input = $('<input id="yes" style="width:auto; border:none;" type="radio" value="1" name="'+field.name+'" /><label for="yes">Yes</label>' + 
						'<input id="no" style="width:auto; border:none;" type="radio" value="0" name="'+field.name+'" /><label for="no">No</label>');
				break;
			default:
				input = field.type.call(config.container);
				input.attr('name', field.name);
			}

			if (field.value !== undefined) {
				if (field.type == 'checkbox') {
					input.find('input').attr('checked', !!field.value);
				}
				else {
					input.val(field.value);
				}
			}
			if (field.validator.constructor == String) {
				if (field.type == 'checkbox') {
					input.find('input').attr('validator', field.validator);
				}
				else {
					input.attr('validator', field.validator);
				}
			}
			cont.append(input);

			if (field.tip) {
				var question = $('<img src="/img/provider/hint-ico.gif" helptip="' + field.tip + '" />');
				if (field.type != 'textarea') {
					cont.find(':input:last').after(question).after(' ');
				}
				else if(field.label) {
					cont.find('label:last').after(question).after(' ');
				}
			}

			edit.find('form').append(cont);
		}
	}

	if (!config.actions) {
		config.actions = new Array();
	}
	/*
	if (config.actions.save !== false) {
		edit.find('.navigation ul').append('<li><a href="#" class="save" title="Save">Save Draft</a></li>');
	}
	*/
	if (config.actions.publish !== false) {
		edit.find('.navigation ul').append('<li><a href="javascript:;" class="publish" title="Commit">Commit</a></li>');
	}
	if (config.actions.cancel !== false) {
		edit.find('.navigation ul').append('<li><a href="javascript:;" class="cancel" title="Cancel">Cancel</a></li>');
	}
	if (config.actions.del !== false) {
		edit.find('.navigation ul').append('<li><a href="javascript:;" class="delete" title="Delete">Delete</a></li>');
	}
	if($('#solution_id').val() && config.actions.history !== false && config.container.find('input[name="value_id"]').val()){
		edit.find('.navigation').append('<a href="javascript:;" class="show-history" title="History" >Show Version History</a>');
	}
	//Proofpoints to editor
	/*if(config.container.find('input[name="attachmen_enabled"]').val()){
		edit.append('<div class="attachment-box"><div class="attachment-add"><div class="title">Proofpoints:</div>'+
				'<div class="actions"><a href="javascript:;" id="add_file">Add File</a><a href="javascript:;" id="add_link">Add Link</a></div>'+
				'<div class="items-adding"></div>'+
				'</div><div class="existing loading"><span>Existing proofpoints:</span></div>'+
				'</div>');
	}*/
	return edit;
}

jQuery.fn.brochure = function(config) {
	var container = $(this);

	var default_field = {
		'name':'title',
		'type': 'input',
		'required': typeof config.parent_field === 'undefined'
	};
	for (var i in config.fields) {
		config.fields[i] = $.extend({}, default_field, config.fields[i]);
	}

	if (!container.size()) {
		return false;
	}

	container.find('.sort_arrows a').live('click', function() {
		var action = $(this).hasClass('move-item-up');
		var current_item = $(this).parents('.bitem');
		var new_item;
		if (action) {
			new_item = current_item.prev('.bitem:last');
			if (!new_item.size()) {
				new_item = current_item.parent().find('>.bitem:last');
			}
		}
		else {
			new_item = current_item.next('.bitem:first');
			if (!new_item.size()) {
				new_item = current_item.parent().find('>.bitem:first');
			}
		}

		var display_order = current_item.find('input[name=display_order]').val();
		var swap_display_order = new_item.find('input[name=display_order]').val();

		var type = current_item.parent().parent().find('input[name=type]').val();
		var provider_id = $('#provider_id').val();
		$.post(move_value_url, {
			type: type,
			display_order: display_order,
			direction: (action ? "up" : "down"),
			provider_id: provider_id
		});

		current_item.find('input[name=display_order]').val(swap_display_order);
		new_item.find('input[name=display_order]').val(display_order);

		current_item.swap(new_item);
		current_item.blur();

		brochure_change();

		return false;
	});

	function brochure_change() {
		// restore from last time
		container.find('.sort_arrows div').remove();
		container.find('.sort_arrows a').show();

		// remove arrow from first element
		var first = container.find('.items>.bitem:first');
		first.find('.move-item-up').hide().after('<div style="width:11px;">&nbsp;</div>');

		// remove arrow from last element
		var second = container.find('.items>.bitem:last');
		second.find('.move-item-down').hide().after('<div style="width:11px;">&nbsp;</div>');

		if (first.html()) {
			container.find('.no_info').remove();
		}

		if (config.change) {
			config.change.call(container, container);
		}
	}

	function validate(popup) {
		var errors = [];

		if (!popup.hasClass('validation-in-progress')) {
			popup.find('.edit-layout .error-field').removeClass('error-field');
			popup.find('.edit-layout .input-wrap.error').removeClass('error');
			popup.find('.edit-layout .checked').removeClass('checked');
			popup.addClass('validation-in-progress');
		}

		for (var i in config.fields) {
			var field = config.fields[i];
			var input = popup.find('[name=' + field.name + ']:not(.checked):visible');
			var value = input.val();
			
			if (!input.size()) {
				continue;
			}

			if ($.trim(value).length == 0) {
				if (field.required) {
					errors.push({input:input, message:((field.label? '<strong>' + field.label + ':</strong> ': '') + 'This field cannot be empty.')});
					input.addClass('error-field');
					input.parent('.input-wrap').addClass('error');
				}
				continue;
			}

			if (!field.validator) {
				continue;
			}

			for (var validator_index in field.validator) {
				var validator = field.validator[validator_index];

				if (validator.length >= 3 && typeof validator[2] !== undefined) {
					value = validator[2](value);
					popup.find('.edit-layout [name=' + field.name + ']:not(.checked):visible').val(value);
				}
				
				if (value.search(new RegExp(validator[0])) == -1) {
					input.addClass('error-field');
					input.parent('.input-wrap').addClass('error');
					errors.push({input:input, message:((field.label? '<strong>' + field.label + ':</strong> ': '') + validator[1] + '.')});
					break;
				}
			}

			input.addClass('checked');
		}

		popup.removeClass('validation-in-progress');
		var error_input = popup.find('.error-field:first');
		if (error_input.size()) {
			error_input.focus();
			show_error(popup, errors);
			return false;
		}
		return true;
	}

	brochure_change();

	function hide_editor() {
		$.modal.close();
		$('#dialog_popup_content .l-content').empty();
		return false;
	}

	function show_editor(bitem, isNew) {
		var popupOptions = {
			close : true,
			closeHTML: null,
			closeClass: 'cancel',
			escClose : true,
			overlayCss : { backgroundColor : 'black' },
			onShow: function (dialog) {
				var popup = dialog.data;
				var edit = popup.find('.edit-layout');
				if(!isNew) {
					popup.find('a.delete').click(function(){
						delete_handler(bitem, edit);
						return false;
					});
					if (!config.is_file) {
						popup.find('form').submit(function(){
							save_handler(bitem, edit);
							return false;
						});
					}
					popup.find('a.publish').click(function(){
						save_handler(bitem, edit);
						return false;
					});
				}
				else {
					if (!config.is_file) {
						edit.find('form').submit(function() {
							add_save_handler(edit);
							return false;
						});
					}
					edit.find('a.publish').click(function(){
			 			add_save_handler(edit);
						return false;
					});
				}
			},
			onClose: function (dialog) {
				hide_editor();
			}
		};
		$('#dialog_popup').width(636);
		$('#dialog_popup').modal(popupOptions);
	}

	function add_handler() {
		var container = $(this);
		var edit = create_editor({
			'fields': config.fields,
			'container': container,
			'instructions': config.instructions,
			'is_file': config.is_file,
			'type': config.type,
			'actions': {
				'del': false
			}
		});

		var popup = setup_popup(container.find('.field_name:first').text(), '&nbsp;', edit);

		if (config.edit_renderer) {
			config.edit_renderer({
				'edit':edit,
				'add':true
			});
		}

		show_editor(container, true);

		if (config.edit_renderer) {
			config.edit_renderer.call(container, {
				'edit':edit,
				'add':false
			});
		}
	}

	function delete_handler(bitem, edit) {
		hide_editor();
		bitem.remove();
		brochure_change();

		var provider_id = $('#provider_id').val();
		var value_id = bitem.find('input[name=value_id].published').val();
		if (value_id !== '' && typeof value_id !== 'undefined') {
			$.post(del_value_url, {
				id:value_id,
				provider_id: provider_id
			});
		}

		var draft_id = bitem.find('input[name=value_id].saved').val();
		if (draft_id !== '' && typeof draft_id !== 'undefined') {
			$.post(del_draft_url, {
				id: draft_id,
				provider_id: provider_id
			});
		}
		return false;
	}

	function save_handler(bitem, edit) {
		function edit_property(name, value) {
			value = value.replace(/\n/g, '<br />');
			if (!bitem.find('[name=' + name + '][type=hidden].published').size()) {
				bitem.prepend('<input type="hidden" name="' + name + '" class="published" />');
			}
			bitem.find('[name=' + name + '][type=hidden].published').val(value);
		}

		function success(fields) {
			if (!config.is_file) {
				hide_editor(bitem);
				show_message(container, 'Published');
			}

			if (config.renderer) {
				config.renderer( {
					'items' : fields,
					'bitem' : bitem,
					'published' : true,
					'edit' : edit
				});
			}

			for ( var name in fields) {
				edit_property(name, fields[name]);
			}

			var server_url, server_data = {
				type : config.type,
				provider_id : $('#provider_id').val()
			};

			var display_order = parseInt(bitem.find('input:hidden[name=display_order]').val());

			server_data.display_order = display_order;
			server_data.owner = $('#user_id').val();

			var value_id;
			server_url = publish_url;
			value_id = bitem.find('[name=value_id].published').val();

			if (value_id && value_id != '') {
				server_data.id = value_id;
			}

			if (config.fields.length == 1) {
				for ( var field_key in fields) { }
				server_data.value = fields[field_key];
			} else {
				server_data.value = $.toJSON(fields);
			}

			function server_response_handler(response) {
				var response = $.evalJSON(response);

				bitem.html(response.html);
				brochure_change();
			}

			if (config.is_file) {
				form = edit.find('form');
				form.attr('action', server_url);
				form.find('input[name=display_order]')[0].value = server_data.display_order;
				form.find('input[name=id]')[0].value = server_data.id;
				form.find('input[name=file_from]')[0].value = bitem.find('[name=file_from]').val();
				form.ajaxForm(function() {
					location.reload(true);
				});
				form.submit();
			} else {
				if (config.server_handler) {
					config.server_handler( {
						'url' : server_url,
						'server_data' : server_data,
						'values' : fields,
						'server_response_handler' : server_response_handler
					});
				} else {
					$.post(server_url, server_data, function(r) {
						server_response_handler(r);
					});
				}
			}
		}
		var popup = edit.parents('#dialog_popup_content');
		if (validate(popup) === false) {
			return;
		}

		bitem.find('[name=ispublished]').val(1);

		var items = {};
		for ( var i in config.fields) {
			var field = config.fields[i];
			items[field.name] = edit.find('[name=' + field.name + ']').val();
		}

		config.edit_save_handler.call(container, {
			'bitem' : bitem,
			'published' : true,
			'edit' : edit,
			'success' : success,
			'items' : items
		});
	}

	function add_save_handler(edit) {
		function add_property(bitem, name, value) {
			var input = $('<input type="hidden" />');
			input.attr('name', name);
			input.val(value);
			input.addClass('saved');
			bitem.prepend(input);

			input = $('<input type="hidden" />');
			input.attr('name', name);
			input.val(value);
			input.addClass('published');
			bitem.prepend(input);
		}

		function success(fields) {
			if (!config.is_file) {
				hide_editor(container);
				show_message(container, 'Published');
			}

			var bitem = $('<div class="bitem"></div>');
			container.find('>div.items').append(bitem);

			if (config.renderer) {
				config.renderer({
					'bitem': bitem,
					'published': true,
					'edit': edit,
					'items': fields
				});
			}

			for (var name in items) {
				add_property(bitem, name, fields[name]);
			}

			brochure_change();

			var server_url, server_data = {
				type: config.type,
				provider_id: $('#provider_id').val()
			};

			var value_id;
			server_url = publish_url;
			value_id = edit.find('[name=value_id].published').val();

			if (value_id && value_id != '') {
				server_data.id = value_id;
			}

			if (config.fields.length == 1) {
				for (var field_key in fields) {
				}
				server_data.value = fields[field_key];
			}
			else {
				server_data.value = $.toJSON(fields);
			}

			server_data.owner = $('#user_id').val();

      if (config.is_file) {
        form = edit.find('form');
        form.attr('action', server_url);
        form.find('input[name=display_order]')[0].value = server_data.display_order;
        form.find('input[name=id]')[0].value = server_data.id;
        form.ajaxForm(function() {
          location.reload(true);
        });
        form.submit();
      } else {
  			if (config.server_handler) {
	  			config.server_handler({
		  			'url': server_url,
			  		'server_data': server_data,
				  	'values': fields
  				});
	  		}
		  	else {
			  	$.post(server_url, server_data, function(response) {
				  	var response = $.evalJSON(response);

					  bitem.html(response.html);
  					brochure_change();
	  			});
		  	}
      }
		}
		var popup = edit.parents('#dialog_popup_content');
		if (validate(popup) === false) {
			return;
		}

		var items = {};
		for (var i in config.fields) {
			var field = config.fields[i];
			items[field.name] = edit.find('[name=' + field.name + ']').val();
		}

		config.add_save_handler.call(container, {
			'published': true,
			'edit': edit,
			'success': success,
			'add_property': add_property,
			'items': items
		});
	}

	function edit_handler(from_published) {
		var input_class = from_published === true ? 'published' : 'saved';
		var bitem = $(this).parents('.bitem');
		var edit = create_editor({
			'fields': config.fields,
			'container': container,
			'instructions': config.instructions,
			'is_file': config.is_file,
			'file_link': bitem.find('input[name=file_link].current').val(),
			'type': config.type
		});
		var main = $(this).parents('.item');
		var popup = setup_popup(main.find('.field_name').text(), null, edit);

		for (var i in config.fields) {
			var name = config.fields[i].name;
			var value = bitem.find('[name=' + name + '].'+input_class).val();
			edit.find('[name=' + name + '][type!=hidden]').val(value);
		}
		if (config.is_file && input_class == 'published') {
			edit.find('[name=file_from]').val('published');
		}

		if (config.edit_renderer) { ///...
			config.edit_renderer.call(container, {
				'edit': edit,
				'add': false,
				'bitem': bitem
			});
		}

		show_editor(bitem);
	}

	container.find('.add_file a').click(function() {
		add_handler.call(container);
	});

	container.find('a.edit-field-btn').live('click', edit_handler);
};

jQuery.fn.make_editable = function(config, edit_handler, save_handler, cancel_handler, publish_handler) {
	var main = $(this);
	
	var default_config = {
		'fields': new Array({}),
		'actions': {
			'del': false
		}
	};

	var default_field = {
		'name': 'title',
		'type': main.hasClass('text-area') ? 'textarea' : 'input',
		'required': typeof config.parent_field === 'undefined'
	};

	config = $.extend(default_config, config);
	for (var i in config.fields) {
		config.fields[i] = $.extend({}, default_field, config.fields[i]);
	}

	function hide_editor() {
		$.modal.close();
		$('#dialog_popup_content .l-content').empty();
	}
	
	function showHistory(action, main) {
		var link = $(this);
		var dialogPopup = $('#simplemodal-container .modal-dialog-popup');
		var historyBox = $('#dialog_popup_content .right-box');
		var rWidth = parseInt(historyBox.css('width'));
		var rPaddingLeft = parseInt(historyBox.css('padding-left'));
		if(!link.hasClass('to-hide')) {
			link.addClass('to-hide');
			dialogPopup.width(dialogPopup.width() + rWidth + rPaddingLeft + 16);
			initHistory();
			link.text('Hide Version History');
		}
		else {
			link.removeClass('to-hide');
			dialogPopup.width(dialogPopup.width() - rWidth - 25);
			historyBox.hide();
			link.text('Show Version History');
		}
		$(window).trigger('resize.simplemodal');
	}
	var historyLoaded = false;
	var historyCount = 0;
	function initHistory(e){
		$('#dialog_popup_content .right-box').show();
		var value_id = main.find('[name=value_id].published').val();
		var solution_id = $('#solution_id').val();
		var dataInfo = [];
		var listOfVersion = $('.right-content-box .history-list ol');
		var sendData = {};
		if(!historyCount){
			sendData = {
					data_value_id: value_id, 
					solution_id: solution_id, 
					_:(new Date()).getTime(),
					from: 1,
					to: 6
			};
		}
		else{
			sendData = {
					data_value_id: value_id, 
					solution_id: solution_id, 
					_:(new Date()).getTime(),
					from: e.data.from,
					to: e.data.to
			};
			historyLoaded = false;
		}
		if(!historyLoaded){
			$.getJSON('/provider-directory/api/solution_data_value/history', sendData, $.proxy(function(data) {
				if(data == false){
					var listItem = $('<li>No History</li>');
					listItem.css('list-style-type','none');
					listOfVersion.append(listItem);
					$('.right-box .loading').removeClass('loading');
					
				}
				else {
					if(!historyCount){
						$.getJSON('/provider-directory/api/solution_data_value/history_count', {data_value_id: value_id, _:(new Date()).getTime(), solution_id: solution_id}, $.proxy(function(count) {
							historyCount = count;
							this.renderList(data);
						}, this));
					}
					else{
						this.renderList(data);
					}
				}
				historyLoaded = true;
			},this));
		}
		this.renderList = function (data){
			listOfVersion.empty();
			for(var i=0 ; i<data.length ; i++){
				var listItem = $('<li><a href="#" class="show-preview">' + (data[i].created_on == null ? 'unknown date' : data[i].created_on) + 
						(data[i].owner == null ? "" : ("&nbsp;by&nbsp;" + data[i].owner)) + '</a></li>');
				listItem.bind('click',{version: data[i].version, value: data[i].value, addition_value : data[i].addition_value,
					decoded_value : data[i].decoded_value, decoded_additional_value : data[i].decoded_additional_value, comment : data[i].comment, 
					created_on: data[i].created_on, html: data[i].html, count: historyCount, owner: data[i].owner}, showVersionPreview);
				listOfVersion.append(listItem);
			}
			initPaginate(historyCount, data[0].version);
			$('.loading').removeClass('loading');
		};
	}
	
	function initPaginate(count, current) {
		var jPaginate = $('#dialog_popup_content .right-box .version-paginate');
		jPaginate.empty();
		var countOfVersionPages = Math.ceil(count/5);
		for(var i=0 ; i<countOfVersionPages ; i++){
			var cur = i + 1 == Math.ceil((current + 1)/5);
			var cla = cur ? 'class="active"' : 'href="javascript:;"';
			var link = $('<a ' + cla + '>' + ((i * 5) + 1) + '&nbsp;-&nbsp;' + ((i + 1) * 5) + '</a>');
			var fr = (i * 5) + 1;
			var t = ((i + 1) * 5) + 1;
			if(!cur){
				link.bind('click', {from: fr, to: t}, initHistory);
			}
			jPaginate.append(link);
		}
		$('#dialog_popup_content .right-box .history-list ol').attr('start',(current + 1) + '');
	}
	
	function showVersionPreview(arg) {
		$('#dialog_popup_content .right-box .version-paginate').hide();
		var jVersion = $('#dialog_popup_content .right-box .history-preview');
		var owner = arg.data.owner == null ? "" : ("&nbsp;by&nbsp;" + arg.data.owner);
		jVersion.find('.version strong').text('Version ' + (arg.data.version + 1) + ' of ' + arg.data.count + ': ' );
		jVersion.find('.version span#data').text(arg.data.created_on);
		jVersion.find('.version span#name').html(' ' + owner);
		
		jVersion.find('.cancel-preview').bind('click',showVersion);
		jVersion.find('.hide-preview').bind('click',showVersion);
		jVersion.find('.replace-preview').bind('click', arg.data, replacePreview);
		
		$('#dialog_popup_content .right-box .history-preview .content-preview').html(arg.data.html);
		$('.history-list').hide();
		$('#dialog_popup_content .right-box .history-preview').show();
	}
	
	function replacePreview(e){
		var data = e.data;
		var form = $('#dialog_popup_content form')[0];
		if(form && form.elements.length){
			var elt, tag, type;
			for(var i=0 , len=form.elements.length ; i<len ; i++ ){
				elt = form.elements[i];
				tag = (elt.tagName + '').toLowerCase();
				type = (elt.type + '').toLowerCase();
				if(data[elt.name]){
					if((tag == 'input' && (type == 'text' || type == 'password'))||tag == 'textarea'){
						elt.value = data[elt.name];
					}
					else if(tag == 'input' && type == 'checkbox') {
						elt.checked = data[elt.name];
					}
					else if(tag == 'input' && type == 'radio'){
						if(elt.value == data[elt.name]){
							elt.checked = true;
						}
						else if(data[elt.name] != 1 && data[elt.name] != 0)
						{
							elt.checked = false;
						}
					}
					else if(tag == 'select') {
						var opt;
						var html = $(data.html);
						for(var j=0 ; j<elt.options.length ; j++){
							opt = elt.options[j];
							if(opt.value == data[elt.name]){
								elt.selectedIndex = j;
							}
						}
					}
					else if(tag == 'input' && type == 'radio') {
						
					}
				}
				else if(!data.value.charAt){
					if(elt.name.indexOf('/') == -1){
						if((tag == 'input' && (type == 'text' || type == 'password'))||tag == 'textarea'){
							elt.value = data.value[elt.name];
						}
						else if(tag == 'input' && type == 'checkbox') {
							elt.checked = data.value[elt.name];
						}
						else if(tag == 'select') {
							var opt;
							for(var j=0 ; j<elt.options.length ; j++){
								opt = elt.options[j];
								if(opt.value == data.value[elt.name]){
									elt.selectedIndex = j;
								}
							}
						}
					}
					else{
						var names = elt.name.split('/');
						if((tag == 'input' && (type == 'text' || type == 'password'))||tag == 'textarea'){
							elt.value = data.value[names[0]][names[1]];
						}
						else if(tag == 'input' && type == 'checkbox') {
							elt.checked = data.value[names[0]][names[1]];
						}
						else if(tag == 'select') {
							var opt;
							for(var j=0 ; j<elt.options.length ; j++){
								opt = elt.options[j];
								if(opt.value == data.value[names[0]][names[1]]){
									elt.selectedIndex = j;
								}
							}
						}
					}
				}
			}
		}
		$('div.navigation a.publish').trigger('click');
	}
	
	function showVersion() {
		$('#dialog_popup_content .right-box .version-paginate').show();
		var previewVersion = $('#dialog_popup_content .right-box .history-preview');
		var historyList = $('.history-list');
		historyList.show();
		previewVersion.hide();
	}
	
	function initAttachmets(){
		var jExisting = $('.attachment-box .existing');
		$.getJSON('/provider-directory/api/solution_data_value/attachments',{solution_id: $('#solution_id').val(), data_value_id: main.find('input[name="value_id"]').val(),
			_:(new Date()).getTime()},function(data) {
			if(data == false){
				jExisting.removeClass('loading');
				$('.attachment-box #add_file').click(addFile);
				$('.attachment-box #add_link').click(addLink);
			}
			else{
				for(var i=0 ; i<data.length ; i++){
					var desc = '';
					if(data[i].description != null){
						if(data[i].description.length > 25){
							desc = '<span class="desc-show">' + data[i].description.substring(0, 25) + '...</span><a class="desc-show-all">[+]</a>';
							desc += '<div class="all-view" style="display:none;">' + data[i].description.substring(25) + '</div>';
						}
						else{
							desc = data[i].description; 
						}
					}
					else {
						desc = '';
					}
					var urlParts = data[i].url.split('/');
					urlParts = urlParts[urlParts.length - 1] != '' ? urlParts[urlParts.length - 1] : urlParts[urlParts.length - 2];
					jExisting.append($('<div class="parent nx-clear">'+
							'<div class="first"><span class="url">' + urlParts + '</span><a href="javascript:;" class="delete-attachments"><input type="hidden" name="attachment_id" value="'+data[i].attachment_id+'"/></a></div>'+
							'<div class="second">'+ (data[i].label == null ? '' : data[i].label) +'</div>'+
							'<div class="thrid">'+ desc +'</div>'+
							'</div>'));
				}
				jExisting.removeClass('loading');
				initEvants();
				$('.attachment-box #add_file').click(addFile);
				$('.attachment-box #add_link').click(addLink);
			}
		});
	}
	
	function initEvants() {
		$('.attachment-box .delete-attachments').click(deleteAttachment);
		var jDescToggle = $('.attachment-box .desc-show-all');
		jDescToggle.click(function(e) {
			$(e.currentTarget).next('.all-view').slideToggle('fast', function(){
				if(jDescToggle.text() == '[+]'){
					jDescToggle.text('[-]');
				}
				else{
					jDescToggle.text('[+]');
				}
			});
		});
	}
	var countOfAddFile = 0;
	var uploadList = [];
	var count_of_attach = 0;
	function addFile() {
		var jBody = $('.attachment-box .items-adding'); 
		
		jBody.append($('<div class="parentItemAdd nx-clear">'+
				'<div class="firstItemAddFile"><div class="cr lt"></div><div class="cr rt"></div><div class="cr lb"></div><div class="cr rb"></div>'+
				'<input class="attachment-file" type="text" name="fileName" readonly="readonly"/></div>'+
				'<a class="browse" id="file_attach_' + countOfAddFile + '"></a>'+
				'<div class="secondItemAddFile"><div class="cr lt"></div><div class="cr rt"></div><div class="cr lb"></div><div class="cr rb"></div>'+
				'<input class="attachment-label" type="text" name="label"/></div>'+
				'<div class="thridItemAddFile"><div class="cr lt"></div><div class="cr rt"></div><div class="cr lb"></div><div class="cr rb"></div>'+
				'<input class="attachment-descr" type="text" name="description"/></div>'+
				'</div>'));
				uploadList.push( new AjaxUpload('file_attach_' + countOfAddFile, {
					action: '/provider-directory/api/solution_data_value/attachment_upload',
					name: 'file',
					autoSubmit: false,
					onChange: function (file, ext) {
						var fileInp = $(this._button).parent().find('.attachment-file');
						fileInp.val(file);
						fileInp.trigger('blur');
					},
					onSubmit : function (file, ext) {
						  this.setData({ solution_id: $('#solution_id').val(), data_value_id: main.find('[name=value_id].published').val(), 
							  label: $(this._button).parent().find('.attachment-label').val(),description:$(this._button).parent().find('.attachment-descr').val(), output: 'html'}); 
					},
					onComplete : function (arg) {
						attachItemAdd();
					}
				}));
		countOfAddFile++;
		count_of_attach++;
		jBody.find('.parentItemAdd:last').find('.attachment-file').watermark('File');
		jBody.find('.parentItemAdd:last').find('.attachment-label').watermark('Label');
		jBody.find('.parentItemAdd:last').find('.attachment-descr').watermark('Description');
	}
	
	function addLink() {
		var jBody = $('.attachment-box .items-adding');
		
		jBody.append($('<div class="parentItemAdd nx-clear">'+
				'<div class="firstItemAddLink"><div class="cr lt"></div><div class="cr rt"></div><div class="cr lb"></div><div class="cr rb"></div>'+
				'<input class="attachment-link" type="text" name="fileName"/></div>'+
				'<div class="secondItemAddFile"><div class="cr lt"></div><div class="cr rt"></div><div class="cr lb"></div><div class="cr rb"></div>'+
				'<input class="attachment-label" type="text" name="label"/></div>'+
				'<div class="thridItemAddFile"><div class="cr lt"></div><div class="cr rt"></div><div class="cr lb"></div><div class="cr rb"></div>'+
				'<input class="attachment-descr" type="text" name="description"/></div>'+
				'</div>'));
		count_of_attach++;
		jBody.find('.parentItemAdd:last').find('.attachment-link').watermark('Link');
		jBody.find('.parentItemAdd:last').find('.attachment-label').watermark('Label');
		jBody.find('.parentItemAdd:last').find('.attachment-descr').watermark('Description');
	}
	
	function deleteAttachment(e) {
		var jCurrent = $(e.currentTarget).parent('.first').find('.url');
		if(jCurrent.hasClass('toDelete')){
			jCurrent.removeClass('toDelete');
			count_of_attach--;
		}
		else{
			jCurrent.addClass('toDelete');
			count_of_attach++;
		}
	}
	
	function show_editor() {
		countOfAddFile = 0;
		var popupOptions = {
			close : true,
			closeHTML: null,
			closeClass: 'cancel',
			escClose : true,
			overlayCss : { backgroundColor : 'black' },
			onShow: function (dialog) {
				var popup = dialog.data;
				var att = popup.find('.attachment-box').size();
				dialog.container.css('width', '');
				historyLoaded = false;
				historyCount = 0;
				popup.find('.show-history').click(showHistory);
				if(att){ initAttachmets(); }
				popup.find('.publish').click(function() {
					if(att){
						saveWithAttachments();
					}
					else{
						save_handler();
					}
					return false;
				});
				popup.find('form').submit(function() {
					if(att){
						saveWithAttachments();
					}
					else{
						save_handler();
					}
					return false;
				});
			},
			onClose: function (dialog) {
				config.cancel_handler.call(main);
			}
		};
		$('#dialog_popup').width(636);
		$('#dialog_popup').modal(popupOptions);
	}

	function validate(popup) {
		var errors = [];
		if (!popup.hasClass('validation-in-progress')) {
			popup.find('.edit-layout .error-field').removeClass('error-field');
			popup.find('.edit-layout .input-wrap.error').removeClass('error');
			popup.find('.edit-layout .checked').removeClass('checked');
			popup.addClass('validation-in-progress');
		}
		for (var i in config.fields) {
			var field = config.fields[i];
			var input = popup.find('.edit-layout [name=' + field.name + ']:not(.checked):visible');
			var value = input.val();
			
			if(field.type == 'radio'){
				if(!input.filter(':checked').size()){
					value = '';
				}
			}
			
			if (!input.size()) {
				continue;
			}

			if (typeof(value) == String && $.trim(value).length == 0) {
				if (field.required) {
					errors.push({input:input, message:((field.label? '<strong>' + field.label + ':</strong> ': '') + 'This field cannot be empty.')});
					input.addClass('error-field');
					input.parent('.input-wrap').addClass('error');
				}
				continue;
			}

			if (!field.validator) {
				continue;
			}

			for (var validator_index in field.validator) {
				var validator = field.validator[validator_index];

				if (typeof validator[2] !== 'undefined') {
					value = validator[2](value);
					popup.find('.edit-layout [name=' + field.name + ']:not(.checked):visible').val(value);
				}

				if (validator == validators.currency) {
					value = value.replace(',', '');
					value = value.replace('$', '');
					popup.find('.edit-layout [name=' + field.name + ']:not(.checked):visible').val(value);
				}

				if (value.search(new RegExp(validator[0])) == -1) {
					input.addClass('error-field');
					input.parent('.input-wrap').addClass('error');
					errors.push({input:input, message:((field.label? '<strong>' + field.label + ':</strong> ': '') + validator[1] + '.')});
					break;
				}
			}
			input.addClass('checked');
		}

		popup.removeClass('validation-in-progress');
		var error_input = popup.find('.edit-layout .error-field:first');
		if (error_input.size()) {
			error_input.focus();
			show_error(popup, errors);
			return false;
		}
		return true;
	}
	
	if (!config.cancel_handler) {
		config.cancel_handler = function() {
			hide_editor();
		};
	}

	var mode = $('#mode').val();

	for (var i in config.fields) {
		var field = config.fields[i];
		if (field.required !== false) {
			if (mode == 'edit') {
				main.find('.sol-subtitle .left-cont .tit_tooltip_holder .tit_tooltip').append('<font color="red">*</font>');
				break;
			}
		}
	}

	if (!edit_handler) {
		function edit_handler(from_published) {
			//todo: need to fink abaut delete saved class
			var input_class = (config.actions.ffc_verification !== true) ? 'published' : 'verification';
			var edit = create_editor({
				'fields': config.fields,
				'instructions': config.instructions,
				'actions': config.actions,
				'container': main
			}, config.fields.length == 1);
			
			var popup = setup_popup(main.find('.field_name').text(), null, edit);

			var values = {};
			for (var i in config.fields)
			{
				
				var name = config.fields[i].name;
				if (config.fields[i].type == 'checkbox') {
					edit.find('[name=' + name + '][type!=hidden]').attr('checked', main.find('[name=' + name + '].' + input_class).val() == 1);
				}
				else if (config.fields[i].type == 'radio') {
					var value = main.find('[name=' + name + '].' + input_class).val();
					edit.find('[name=' + name + '][type!=hidden][value=' + value + ']').attr('checked', 'checked');
				}
				else {
					if (main.find('[name=field_type]').val() == 'List' && name == 'value') {
						var value = main.find('[name=' + name + '].' + input_class).val();
						if (value) {
							value = value.split(',');
							values[name] = value;
							edit.find('[name=' + name + '][type!=hidden]').val(value);
						}
					} else {
						var value = main.find('[name=' + name + '].' + input_class).val();
						if (value) {
							value = value.replace(/<br \/>/g, '\n');
							edit.find('[name=' + name + '][type!=hidden]').val(value);
							values[name] = value;
						}
					}
				}
			}

			if (config.edit_renderer) {
				config.edit_renderer.call(main, main.find('.edit-layout'), values); ///...
			}
			show_editor();
		}
	}

	if (!save_handler) {
		save_handler = function() {
			var popup = $('#dialog_popup_content');
			var edit = popup.find('.edit-layout');
			var fields = {};
			if (validate(popup) == false) {
				return;
			}
			var dataChanged = false;
			for (var i in config.fields) {
				
				var name = config.fields[i].name;
				var input = edit.find('[type!=hidden][name=' + name + ']');
				if (input.size() == 2) {
					input.each(function() {
						if ($(this).attr('checked')) {
							input = $(this);
						}
					});
				}
				var value;
				if (config.fields[i].type == 'checkbox') {
					value = input.attr('checked') == true ? 1 : 0;
				}
				else if(config.fields[i].type == 'radio'){
					if(input.length == 2){
						return false;
					}
					else{
						value = input.val();
					}
				}
				else {
					value = input.val();
					if (!$.isArray(value)) {
						value = value.replace(/\n/g, '<br />');
					}
				}
				
				if(!dataChanged && checkChanges(name, value)){
					dataChanged = true;
				}
				
				if(config.actions.ffc_verification !== true) {
					if (!main.find('input[name=' + name + '].published').size()) {
						main.prepend('<input type="hidden" name="' + name + '" class="published" />');
					}
					main.find('[name=' + name + '].published').val(value);
				}
				else {
					if (!main.find('[name=' + name + '].verification').size()) {
						main.prepend('<input type="hidden" name="' + name + '" class="verification" />');
					}
					main.find('[name=' + name + '].verification').val(value);
				}
				fields[name] = value;
			}

			var server_url, server_data = {};

			if (config.type) {
				server_data.type = config.type;
			}
			else if (config.field_uuid) {
				server_data.field_uuid = config.field_uuid;
			}

			server_data.solution_id = $('#solution_id').val();
			server_data.provider_id = $('#provider_id').val();

			var value_id;
			if (config.parent_field) {
				server_url = save_feedback_url;
				server_data.data_value_id = config.parent_field.find('[name=value_id].published').val();
			}
			else {
				server_url = publish_url;
				server_data.id = main.find('input[name="value_id"].published').val();
			}
			
			

			server_data.owner = $('#user_id').val();

			if (config.fields.length == 1) {
				for (var field_key in fields) { }
				if (!$.isArray(fields[field_key])) {
					server_data.value = fields[field_key];
				}
				else {
					server_data.value = $.toJSON(fields[field_key]);
				}
			}
			else {
				for (var i in fields) {
					var matched = i.match(/^(.*)\/(.*)$/);
					if (matched) {
						if (typeof fields[matched[1]] == 'undefined') {
							fields[matched[1]] = {};
						}
						fields[matched[1]][matched[2]] = fields[i];
						delete fields[i];
					}
				}

				server_data.value = $.toJSON(fields);
			}
			
			var onSuccess = function(r) {
				var response = $.evalJSON(r);
				main.find('.edit-text').html(response.html);
				main.find('.timestamps').html(response.timestamps_html);
				if (response.owner_published_html) {
					main.find('.owner-published').html(response.owner_published_html);
				}
				if (response.owner_saved_html) {
					main.find('.owner-saved').html(response.owner_saved_html);
				}
				hide_editor();
				show_message(main, 'Published');
				if (config.renderer) {
					config.renderer.call(main, fields);
				}
				main.find('.ch_active_icon').html('<a href="#"><img src="/img/provider/notverified-ico.gif" alt="Not Yet Verified" width="12" height="12"></a>');
				
				if(!main.find('[name=value_id].published').length) {
					main.find('.no_info').remove();
					main.prepend($('<input type="hidden" value="'+ response.id +'" name="value_id" class="published">'));
				}
			};
			
			if(config.actions.ffc_verification === true) {
				server_data = {
					data_value_id: server_data.id,
					solution_id: server_data.solution_id,
					additional_value: fields.value,
					comment: fields.comment,
					code: fields.code,
					rating: fields.rating
				};
				onSuccess = function(r) {
					hide_editor();
					var response = $.evalJSON(r);
					main.find('.profile_columns:eq(0) ~ *').remove();
					main.append(response.html);
					addEditAction();
					show_message(main, 'FFC Verification data changed');
				};
				server_url = ffc_verification_url;
			}
			if(dataChanged){
				$.ajax({type: 'POST', url: server_url, data: server_data,
					success: onSuccess,
					error: function() {
						hide_editor();
						show_message(main, '<font color="red">We apologize but the system was unable to process your request. Please try again. Meanwhile, the support team has been notified about this issue.</font>', 20);
				}});
			}
			else{
				hide_editor();
			}
		};
	}
	function checkChanges(name, value) {
		if(main.find('[name=' + name + '][type=hidden]').val() != value) {
			return true;
		}
		return false;
	}
	function saveWithAttachments() {
		if(count_of_attach == 0){
			attachItemAdd(true);
			return false;
		}
		$('#simplemodal-container').css('z-index', '1000');
		$('#simplemodal-container').append($('<div id="attachInProgress" style="width: 128px; height: 15px; position: absolute; z-index: 1003; top: 50%; left: 50%; margin-left: -64px;">'+
				'<img src="/img/loadingVer.gif" alt="loading"/></div>'));
		var attach = $('#simplemodal-container .items-adding');
		var solutionId =$('#solution_id').val();
		var data_value_Id = main.find('input[name="value_id"]').val();
		if(attach.size() > 0){
			var listLink = attach.find('.parentItemAdd:has(.firstItemAddLink)');
			listLink.each(function(ind, elm){
				var url = $(elm).find('.attachment-link').val();
				if(url == ''){
					attachItemAdd();
				}
				else{
					$.getJSON('/provider-directory/api/solution_data_value/attachment_add', {
						solution_id: solutionId, 
						data_value_id: data_value_Id, 
						url: url,
						label: $(elm).find('.attachment-label').val(),
						description: $(elm).find('.attachment-descr').val(),
						_:(new Date()).getTime() }, function(data) {
							attachItemAdd();
						});
				}
			});
		}
		var attachToDelete = $('#simplemodal-container .toDelete');
		if(attachToDelete.size() > 0){
			attachToDelete.each(function (ind, elm){
				var id = $(elm).next('.delete-attachments').find('input[name="attachment_id"]').val();
				$.getJSON('/provider-directory/api/solution_data_value/attachment_delete', 
						{
							solution_id: solutionId, 
							data_value_id: data_value_Id,
							attachment_id: id,
							_:(new Date()).getTime() 
						}, 
						function() {
							attachItemAdd();
						});
			});
		}
		if(uploadList.length > 0){
			for(var i=0, len=uploadList.length ; i<len ; i++ ){
				if(this.edit.find('#file_attach_' + i).parent('.parentItemAdd').find('.attachment-file').val() != ''){
					uploadList[i].submit();
				}
				else{
					attachItemAdd();
				}
			}
		}
		
	}
	function attachItemAdd(isNoAttach) {
		if(isNoAttach){
			save_handler();
			return false;
		}
		if(count_of_attach > 0){
			count_of_attach--;
		}
		if(count_of_attach == 0){
			$.ajax({
				url:'/provider-directory/api/solution_data_value/attachments',
				data: {
					solution_id: $('#solution_id').val(), 
					data_value_id: main.find('input[name="value_id"]').val(),
					_:(new Date()).getTime(), 
					output: 'html'
				},
				success:function(data) {
					main.find('.field_value .edit-text ~ *').remove();
					main.find('.field_value .edit-text').after($(data));
					save_handler();
				}
			});
		}
	}
	var edit_btn_class = (config.edit_btn) ? config.edit_btn : '.edit-field-btn';
	function addEditAction() {
		main.find(edit_btn_class).click(function() {
			if (!main.find('.edit-layout').size()) {
				edit_handler.call(main);
			}
			return false;
		});
	}
	addEditAction();
};

jQuery.fn.change_status = function(config) {
	var default_config = {
		'append_tag': 'div',
		'append_class': 'choose_icons',
		'active_class': 'ch_active_icon',
		'append_action': 'prepend'
	};
	config = $.extend(default_config, config);

	$.each(this, function() {
		var cont = $(this).parent();
		var current_status;
		var check;
		var timeout_id;

		var statuses = {
			'verified': {
				'img': '/img/provider/verified-ico.gif',
				'alt': 'Verify'
			},
			'unverified': {
				'img': '/img/provider/unverify-ico.gif',
				'alt': 'Unverified'
			},
			'notverified': {
				'img': '/img/provider/notverified-ico.gif',
				'alt': 'Not Yet Verified'
			}
		};
		if (config.icons) {
			for (var status in statuses) {
				if (config.icons[status]) {
					statuses[status].img = config.icons[status];
				}
			}
		}

		$(cont).mouseover(function() {
			if (timeout_id !== undefined) {
				clearTimeout(timeout_id);
				timeout_id = undefined;
				return;
			}

			cont.find('.' + config.append_class).remove();

			var choose_icons = $('<' + config.append_tag + ' class="' + config.append_class + '"></' + config.append_tag + '>').append('<strong>Choose: </strong>');
			var current_img = cont.find('.' + config.active_class + ' img').attr('src');
			for (var i in statuses) {
				(function() {
					var status = statuses[i];
					var status_name = i;
					if (current_img == status.img) {
						return;
					}

					var choose = $('<a href="#"><img  alt="' + status.alt + '" title="' + status.alt + '" src="' + status.img + '"/></a>');
					choose.click(function() {
						var action = cont.attr('action');
						var main = cont.parent().parent().parent();
						var ffc = main.parent().find('[id=' + main.attr('id') + '-ffc]');

						var data_value_id = main.find('[name=value_id].published').val();
						var feedback = ffc.find('[name=value]').val();

						var verification_code = 0;
						if (status_name == 'verified') {
							verification_code = 1;
						} else if (status_name == 'unverified') {
							verification_code = 2;
						}

						var solution_id = $('#solution_id').val();
						var provider_id = $('#provider_id').val();

						var owner = $('#user_id').val();

            if(action){
              var action_url = action;

              switch(verification_code){
                case 0:
                  action_url += 'not_yet_verified/';
                  break;
                case 1:
                  action_url += 'verify/';
                  break;
                case 2:
                  action_url += 'unverified/';
                  break;
              }

              if(provider_id){
                action_url += 'provider_profile/' + provider_id;
              }

              if(solution_id){
                action_url += 'solution_profile/' + solution_id;
              }

              $.ajax({
                type: "GET",
                url: action_url,
                success: function() {
                  cont.find('.' + config.active_class + ' img').attr({
                    'src': status.img,
                    'title': status.alt,
                    'alt': status.alt
                  });
                }
              });

            }else{
              $.ajax({
                type: "POST",
                url: save_verification_code_url,
                data: {data_value_id: data_value_id, value: verification_code, owner: owner, solution_id: solution_id, provider_id: provider_id},
                success: function() {
                  cont.find('.' + config.active_class + ' img').attr({
                    'src': status.img,
                    'title': status.alt,
                    'alt': status.alt
                  });
                }
              });
            }

						choose_icons.remove();
						return false;
					});
					choose_icons.append(choose);
				})();
			}

			cont[config.append_action](choose_icons);
		});

		$(cont).mouseout(function() {
			timeout_id = setTimeout(function() {
				cont.find('.' + config.append_class).remove();
				timeout_id = undefined;
			}, 400);
		});
	});
};

function help_block(container) {
	container = $(container);
	var faq_head = container.find('>div:eq(0)');
	var faq_questions = container.find('>div:eq(1)');
	var faq_answers = container.find('>div:eq(2)');
	var faq_active = false;

	function collapse() {
		clear_selection();
		faq_head.find('.plus_minus a:first').show();
		faq_head.find('.plus_minus a:last').hide();
		faq_questions.slideUp();
		faq_active = false;
		return false;
	}

	function expand() {
		clear_selection();
		faq_head.find('.plus_minus a:first').hide();
		faq_head.find('.plus_minus a:last').show();
		faq_questions.slideDown();
		faq_active = true;
		return false;
	}

	function toggle() {
		return faq_active ? collapse() : expand();
	}

	function clear_selection() {
		faq_questions.find('li span').remove();
		faq_questions.find('li a').show();
		faq_answers.find('>div').hide();
	}

	function select_item() {
		var el = $(this);
		clear_selection();
		el.hide();
		var span = $('<span class="faq_active"></span>').html(el.html());
		el.hide().parent().append(span);
		faq_answers.find('.faq_item_' + el.attr('href').match(/#(\d+)$/)[1]).slideDown();
		return false;
	}

	faq_questions.hide();
	faq_head.find('.plus_minus a:last').hide();
	clear_selection();
	faq_head.find('.title').click(toggle);
	faq_head.find('.plus_minus a:first').click(expand);
	faq_head.find('.plus_minus a:last').click(collapse);
	faq_questions.find('li a').click(select_item);
}

function profile_set_verified(type, id, verified) {
  var url = '/provider-directory/' + (verified ? 'verify' : 'unverified') + '/' + type + '/' + id;
  $.ajax({type: 'GET', url: url, success: function() {
    if (verified) {
      $('.glob_ch_active_icon').html('<img src="/img/provider/verified_seal.gif" alt="Verified" height="30" width="91" style="position:relative;top:10px;">');
    } else {
      $('.glob_ch_active_icon').html('<img src="/img/blank.gif" height="30" width="91" style="position:relative;top:10px;">');
    }
  }});
}


