/*globals PROGULUS, YAHOO */
'use strict';

PROGULUS.SongInfo = (function () {
	var Y = YAHOO.util,
	URL = {
		data : 'songinfo.inc.php',
		submit: 'editor.submit.php'
	},
	CLASSES = {
		DIALOG_PREINIT: 'hidden',
		HIDDEN: 'hidden',
		LOADING: 'searchloading'
	},
	elements = {
		btn_reload: null,
		btn_save: null,
		debug: null,
		editorContainer : null,
		editorForm: null,
		editorFormContent: null,
		fs_artist: null,
		fs_album: null,
		fs_tracks: null,
		fs_song: null,
		ID : {
			btn_reload: 'reloadsong',
			btn_save: 'savechanges',
			debug: 'editordebug',
			editorContainer: 'editorcontainer',
			editorForm: 'editorform',
			editorFormContent: 'editorformcontent',
			fs_artist: 'fs_artist',
			fs_album: 'fs_album',
			fs_tracks: 'fs_tracks',
			fs_song: 'fs_song',
			dlg_saving: 'dlgSubmitting'
		}
	},
	dialogs = {
		saving: null
	},
	// functions
	init, loadSong, enableEditField, submitChange, handleFieldChange, html2ent, handleFieldBlur;
	
	init = function () {
		elements.btn_reload = Y.Dom.get(elements.ID.btn_reload);
		elements.btn_save = Y.Dom.get(elements.ID.btn_save);
		
		elements.editorContainer = Y.Dom.get(elements.ID.editorContainer);
		elements.editorFormContent = Y.Dom.get(elements.ID.editorFormContent);
		elements.editorForm = Y.Dom.get(elements.ID.editorForm);
		elements.debug = Y.Dom.get(elements.ID.debug);

		var i, iLen, tabs, href, tabView = new YAHOO.widget.TabView('editortabs'), 
		matchsong = /songid/i, matchalbum = /album/i; 
		tabs = tabView.getAttributeConfig('tabs').value;
		if (location.hash !== "") {
			for (i = 0, iLen = tabs.length; i < iLen; i += 1) {
				href = tabs[i].getAttributeConfig('href').value;
				if (href === location.hash) {
					tabView.selectTab(i);
				} else {
					tabView.deselectTab(i);
				}
			}
		} else {
			if (location.search.match(matchsong)) {
				tabView.deselectTab(0);
				tabView.deselectTab(1);
				tabView.selectTab(2);
			} else if (location.search.match(matchalbum)) {
				tabView.deselectTab(0);
				tabView.selectTab(1);
				tabView.deselectTab(2);
			} else {
				tabView.selectTab(0);
				tabView.deselectTab(1);
				tabView.deselectTab(2);
			} 

		}
		
		if (elements.btn_reload !== null) {	
//			Y.Event.addListener(elements.btn_reload, 'click', loadSong);
			Y.Event.addListener(elements.editorContainer, 'click', enableEditField);
			Y.Event.addListener(elements.btn_save, 'click', submitChange);
			Y.Event.addListener(elements.editorForm, 'submit', submitChange);
		
			Y.Dom.removeClass(elements.ID.dlg_saving, CLASSES.DIALOG_PREINIT);
			dialogs.saving = new YAHOO.widget.Dialog(elements.ID.dlg_saving, {
				width: '30em',
				fixedcenter: true,
				visible: false,
				constraintoviewport: true,
				draggable: true
			});
			dialogs.saving.render();
		}

	};
	
	loadSong = function () {
		Y.Connect.asyncRequest('GET', URL.data,  {
			success: function (o) {
				elements.editorForm.reset();
				elements.editorFormContent.innerHTML = o.responseText;
				elements.debug.innerHTML = "";
			},
			failure: function (o) {
				elements.editorFormContent.innerHTML = o.responseText || o.statusText;
			},
			cache: false,
			timeout: 30000
		});
	};
	
	enableEditField = function (ev) {
		var elTarget = Y.Event.getTarget(ev), elField;
		while (elTarget.id !== elements.ID.editorContainer) {
			if (elTarget.nodeName.toUpperCase() === 'DIV' && elTarget.className === 'value') {
				elField = Y.Dom.getNextSibling(Y.Dom.get(elTarget));
				elField.value = html2ent(elTarget.innerHTML);
				Y.Dom.addClass(elTarget, 'hidden');
				Y.Dom.removeClass(elField, 'hidden');
				elField.disabled = false;
				Y.Event.addListener(elField, "change", handleFieldChange);
				Y.Event.addListener(elField, "blur", handleFieldBlur);
				elField.focus();
				break;
			}
			else {
				elTarget = elTarget.parentNode;
			}
		}
	};
	
	html2ent = function (str) {
		str = str.replace(/&amp;/, '&');
		str = str.replace(/&lt;/, '<');
		str = str.replace(/&gt;/, '>');
		return str;
	};
	
	handleFieldChange = function (ev) {
		var el = Y.Dom.get(elements.ID.btn_save);
		if (el !== null) {
			el.disabled = false;
		}
		Y.Event.removeListener(ev.target, "change");	
	};
	
	handleFieldBlur = function (ev) {
		var el = ev.target, el2 = Y.Dom.getPreviousSibling(el);
		if (el.value === html2ent(el2.innerHTML)) {
			el.disabled = true;
			Y.Dom.addClass(el, "hidden");
			Y.Dom.removeClass(el2, "hidden");
		}
		Y.Event.removeListener(ev.target, "blur");	
	};
	
	submitChange = function (ev) {
		Y.Event.preventDefault(ev);
		if (elements.btn_reload === null) {
			return;
		}
		dialogs.saving.show();
		Y.Event.removeListener(elements.editorForm);
		Y.Connect.setForm(elements.editorForm);
		Y.Connect.asyncRequest('POST', URL.submit, {
			success: function (o) {
				elements.debug.innerHTML = o.responseText;
				Y.Event.addListener(elements.editorForm, 'submit', submitChange);
				dialogs.saving.hide();
			},
			failure: function (o) {
				elements.debug.innerHTML = o.responseText || o.statusText;
				Y.Event.addListener(elements.editor, 'submit', submitChange);
				dialogs.saving.hide();
			},
			cache: false,
			timeout: 60000
		});
	};
	
	Y.Event.onDOMReady(init);
}());

