/*
 * Edit In Place
 * http://josephscott.org/code/js/eip/
 *
 * Version: 0.2.1
 * License: http://josephscott.org/code/js/eip/license.txt
 */
EditInPlace = function() { };
EditInPlace.settings = function(set) {
	var settings = {
		id: false,
		save_url: false,
		delete_url: false,
		css_class: 'eip_editable',
		css_editor: 'eip_editor',
		save_button_url: '/image/static/butt_submit_s01.gif',
		cancel_button_url: '/image/static/butt_cancel_s01.gif',
		delete_button_url: false,
		saving: 'eip_saving',
		empty: 'eip_empty',
		type: 'text',
		empty_text: 'Click To Edit',
		orig_text: false,
		function_saved: EditInPlace.defaultSaved,
		function_save_failed: EditInPlace.defaultSaveFailed,
		function_deleted: EditInPlace.defaultDeleted,
		function_delete_failed: EditInPlace.defaultDeleteFailed
	};

	for(var i in set) { settings[i] = set[i]; }

	return($H(settings));
};

EditInPlace.defaultSaved = function( str ) {
};
EditInPlace.defaultSaveFailed = function( str ) {
};

EditInPlace.defaultDeleted = function( str ) {
};
EditInPlace.defaultDeletedFailed = function( str ) {
};

EditInPlace.formField = function(set) {
	var field = '';

	set['orig_text'] = $(set['id']).innerHTML;

	if(set['type'] == 'text') {
		var size = set['orig_text'].length + 10;
		if(size >= 100) { size = 100; }
		if(set['size']) { size = set['size']; }

		field = '<span id="' + set['id'] + '_editor"><input id="'
			+ set['id'] + '_edit" class="' + set['css_editor'] + '" name="'
			+ set['id'] + '_edit" type="text" size="' + size
			+ '" value="' + set['orig_text'] + '" />';
	}
	else if(set['type'] == 'textarea') {
		var cols = 50;
		if(set['cols']) { cols = set['cols']; }
		var rows = (set['orig_text'].length / cols) + 3;
		if(set['rows']) { rows = set['rows']; }

		field = '<span id="' + set['id'] + '_editor"><textarea id="'
			+ set['id'] + '_edit" class="' + set['css_editor'] + '" name="'
			+ set['id'] + '_edit" rows="' + rows + '" cols="'
			+ cols + '">' + set['orig_text'] + '</textarea>';
	}

	//
	return(field);
};

EditInPlace.formButtons = function(set) {

	//
	var result =	'<span>&nbsp;<img id="' + set['id'] + '_save" src="'
		+ set['save_button_url'] + '" border="0" width="35" height="16" align="absbottom" vspace="1">'
		+ '<img id="' + set['id'] + '_cancel" src="' 
		+ set['cancel_button_url'] + '" border="0" width="35" height="16" align="absbottom" vspace="1">';

	//
	if ( set['delete_button_url'] && set['delete_button_url'].length > 0 ) {
		result = result + '<img id="' + set['id'] + '_delete" src="' 
				+ set['delete_button_url'] + '" border="0" width="35" height="16" align="absbottom" vspace="1">';
	}

	//
	return result + '</span>';
};

EditInPlace.setEvents = function(set) {
	Event.observe(
		set['id'],
		'mouseover',
		function() { Element.addClassName(set['id'], set['css_class']); },
		false
	);
	Event.observe(
		set['id'],
		'mouseout',
		function() { Element.removeClassName(set['id'], set['css_class']); },
		false
	);
	Event.observe(
		set['id'],
		'click',
		function() {
			Element.hide(set['id']);

			var field = EditInPlace.formField(set);
			var button = EditInPlace.formButtons(set);

			new Insertion.After(set['id'], field + button);
			Field.focus(set['id'] + '_edit');

			Event.observe(
				set['id'] + '_edit',
				'keydown',
				function() {
					if ( event && event.keyCode == 13 ) {
						EditInPlace.saveChanges(set);
					}
				},
				false
			);
			Event.observe(
				set['id'] + '_save',
				'click',
				function() { EditInPlace.saveChanges(set); },
				false
			);
			Event.observe(
				set['id'] + '_cancel',
				'click',
				function() { EditInPlace.cancelChanges(set); },
				false
			);
			if ( $( set['id'] + '_delete' ) ) {
				Event.observe(
					set['id'] + '_delete',
					'click',
					function() { EditInPlace.deleteChanges(set); },
					false
				);
			}
		},
		false
	);
};

EditInPlace.saveComplete = function(t, set) {

	//
	if ( t.responseText != '' ) {
		$(set['id']).innerHTML = t.responseText.split("|")[0];
	}
	Element.show(set['id']);
	Element.removeClassName(set['id'], set['css_class']);

	//
	if ( set['function_saved'] ) {
		set['function_saved'](t);
	}
};
EditInPlace.saveFailed = function(t, set) {
	$(set['id']).innerHTML = set['orig_text'];
	Element.show(set['id']);
	Element.removeClassName(set['id'], set['css_class']);

	//
	if ( set['function_save_failed'] ) {
		set['function_save_failed'](t);
	}
};

EditInPlace.deleteComplete = function(t, set) {

	//
	Element.remove(set['id'] + '_editor');

	//
	if ( set['function_deleted'] ) {
		set['function_deleted'](t);
	}
};
EditInPlace.deleteFailed = function(t, set) {

	//
	Element.remove(set['id'] + '_editor');

	$(set['id']).innerHTML = set['orig_text'];
	Element.show(set['id']);
	Element.removeClassName(set['id'], set['css_class']);

	//
	if ( set['function_delete_failed'] ) {
		set['function_delete_failed'](t);
	}
};

EditInPlace.saveChanges = function(set) {

	//
	var ut = $F(set['id'] + '_edit');
	var new_text = urlEncode( ut );

	//
	Element.remove(set['id'] + '_editor');

	//
	var params = 'id=' + set['id'] + '&content=' + new_text;
	var ajax_req = new Ajax.Request(
		set['save_url'],
		{
			method: 'post',
			postBody: params,
			onSuccess: function(t) { EditInPlace.saveComplete(t, set); },
			onFailure: function(t) { EditInPlace.saveFailed(t, set); }
		}
	);
};

EditInPlace.cancelChanges = function(set) {

	//
	Element.remove(set['id'] + '_editor');
	Element.removeClassName(set['id'], set['css_class']);

	//
	Element.show(set['id']);
}

EditInPlace.deleteChanges = function(set) {
	if ( false == confirm("포트폴리오 ["+$(set['id']).innerHTML+"]를 삭제하시겠습니까?") ) {
		return;
	}

	var params = 'id=' + set['id'];
	var ajax_req = new Ajax.Request(
		set['delete_url'],
		{
			method: 'post',
			postBody: params,
			onSuccess: function(t) { EditInPlace.deleteComplete(t, set); },
			onFailure: function(t) { EditInPlace.deleteFailed(t, set); }
		}
	);
}

EditInPlace.makeEditable = function(args) {
	var set = EditInPlace.settings(args);
	EditInPlace.setEvents(set);
}
