/*
petitsioon.ee js library
contains common routines for a site ui
Nagi OY, 2010, Kristjan Vaga
*/

/* global registry */
r = {};

/* namespace contains petitsioon.ee ui specific routines */
p = {
	input: {
		/*
		basic handler for input text field focus
		allowing to use "empty notes" as default values
		*/
		onfocus: function (e) {
			if ($(this).hasClass("empty")) {
				if (this.value == e.data) this.value = '';
				$(this).removeClass("empty");
			}
		},
		/*
		basic handler for input text field blur
		*/
		onblur: function (e) {
			if (!this.value) {
				$(this).addClass("empty");
				this.value = e.data;
			}
		},
		/*
		set field as disabled
		*/
		disable: function (field, disable) {
			field.each(function(i, v){
				$(v).attr('disabled', disable);
				if (disable) $(v).addClass('disabled');
				else $(v).removeClass('disabled');
			});
		},
		/*
		attach a text lenght limit to a textarea
		third argument specifies the element showing counter of remaining characters
		*/
		livelimit: function (field, limit) {
			if (arguments.length > 2) {
				var counter = arguments[2];
				counter.text(limit);
				field.keyup(function (e) {
					remain = limit - this.value.length;
					counter.text(remain);
					if (remain < 0) counter.addClass('error');
					else counter.removeClass('error');
				});
			}
			field.keydown(function (e) { if (this.value.length >= limit && e.which != 8) e.preventDefault(); });
		},
		/*
		helper for setting up onfocus and onblur on a input field
		*/
		setup: function (field, emptyval) {
			if (emptyval) field.data('emptyvalue', emptyval);
			if (!field.val()) field.val(emptyval);
			if (field.val() == emptyval) field.addClass('empty');
			field.bind('focus', emptyval, p.input.onfocus);
			field.bind('blur', emptyval, p.input.onblur);
		}
	},
	inplace: {
		/**/
		smalltext: function (fld, action, emptytxt) {
			var opts = (arguments.length > 2) ? $.extend(p.inplace.settings(), arguments[2]) : {};
			p.inplace.setup(fld, action, opts);
		},
		/**/
		bigtext: function (fld, action, emptytxt) {
			var opts = {
				type: 'autogrow',
				placeholder: emptytxt
			};
			opts = $.extend(p.inplace.settings(), opts);
			if (arguments.length > 2) opts = $.extend(opts, arguments[2]);
			p.inplace.setup(fld, action, opts);
		},
		/**/
		wysiwyg: function (fld, action, emptytxt) {
			var opts = {
				type: 'wysiwyg',
				placeholder: emptytxt,
				callback: function (e) {
					if ($(this).text() == '') $(this).addClass('empty');
					else $(this).removeClass('empty');
					//TODO: handle empty field value
				},
				/*onsubmit: function (e) {
					//TODO: handle empty field value
				},*/
				wysiwyg: { 
				}
			};
			opts = $.extend(p.inplace.settings(), opts);
			if (arguments.length > 2) opts = $.extend(opts, arguments[2]);
			fld.focus(function (e) {
				if ($(this).find('textarea').val() == '') $(this).find('textarea').val('<p>&nbsp;</p>');
			});
			p.inplace.setup(fld, action, opts);
		},
		/**/
		setup: function (fld, action, opts, emptytxt) {
			var val = fld.text();
			if (val == '') fld.addClass('empty');
			fld.focus(function (e) {
				//alert($(this).find('textarea, input').val());
				//if ($(this).find('textarea, input').val() == emptytext)
					//$(this).find('textarea, input').val('');
			});
			//fld.blur(function (e) { alert('blur'); });
			fld.editable(action, opts);
		},
		/**/
		settings: function () {
			return {
				indicator: 'Salvestan...',
				tooltip: 'Muutmiseks kliki siin...',
				placeholder: 'Muutmiseks kliki siin...',
				onblur: 'ignore',
				cancel: 'Katkesta',
				submit: 'Salvesta',
				onsubmit: function (e) {
					if ($(this).find('textarea, input').val() != '') {
						$(this).closest('.editable').removeClass('empty');
					}
				}
			}
		}
	},
	modal: {
		/*
		initialize modal dialog
		dlg - dialog element,
		dlgopts - override basic modal configuration
		*/
		dialog: function (dlg, dlgopts) {
			var dlgoptsfinal = p.modal.settings(dlgopts);
			dlg.dialog(dlgoptsfinal);
		},
		/*
		initialize modal with standard form
		dlg - dialog lement, btn - button label,
		callback - to call on successful post,
		frmoverride - override modal form configuration
		*/
		form: function (dlg, btn, callback, frmoverride) {
			var msg = dlg.find('.message');
			var frm = dlg.find('form');
			var frmopts = $.extend( p.form.settings(), {
				beforeSubmit: function (formdata, form, opts) {},
				success: function (data) {
					if (data.ok) {
						if (callback) callback(data);
						dlg.dialog('close');
					} else {
						p.message.error(data.message, msg);
						frm.show();
					}
				},
				error: function (xrsp) {
					p.form.handleERR(xrsp);
					frm.show();
				}
			});
			if (frmoverride) frmopts = $.extend(frmopts, frmoverride);
			//frm.ajaxForm(frmopts);
			p.form.setup(frm, null, msg, frmopts);

			var dlgopts = p.modal.fsettings(frm, msg, btn);
			p.modal.dialog(dlg, dlgopts);
		},
		/*
		get default settings for a modal
		*/
		settings: function (opts) {
			var base = {
				autoOpen: false,
				width: 350,
				modal: true
			};
			return (opts) ? $.extend(base, opts) : base;
		},
		/*
		get default settings for a modal with form
		adds buttons with form submit / reset to the configuration
		*/
		fsettings: function (frm, msg, btn) {
			var base = {
				buttons: {},
				close: function() {
					p.message.hide(msg);
					frm.trigger('reset');
					frm.show();
				}
			};
			base.buttons[btn] = function() {
				frm.trigger('submit');
				frm.hide();
				p.message.status('Laeb...', msg);
			};
			return p.modal.settings(base);
		}
	},
	form: {
		/*
		standard handler of AJAX form posts.
		protocol format for successful response
			{ok:1,message:'Just OK',redirect:'/ok.html'}
		protocol format for error condition
			{ok:0,message:'Some errors',errorfields:{fldname1:'Invalid format',fldnameN:'Value required'}}
		*/
		handleJSON: function (data, form) {
			if (data.ok <= 0) {
				p.message.error(data.message, form.data('msgfld'));
				p.form.errorfields(form, data.errorfields);
				p.form.aftersubmit(form);
			} else {
				if (data.redirect) window.location.href = data.redirect;
				else {
					p.form.errorfields(form, {});
					if (data.message) p.message.confirm(data.message, form.data('msgfld'));
					p.form.aftersubmit(form);
				}
			}
		},
		/*
		display error notifications next to form fields.
		or clear any existing notifications.
		*/
		errorfields: function (form, data) {
			form.find('dt').removeClass('error');
			if (data) {
				for(fld in data) {
					$('[name=' +fld+ ']').closest('dd').prev('dt').addClass('error');
				}
			}
		},
		/*
		default handler of failed http requests
		*/
		handleERR: function (xrsp, form) {
			p.message.error('Ootamatu tehniline viga. Proovi uuesti.', form.data('msgfld'));
			p.form.aftersubmit(form);
		},
		/*
		prepares form once submit has triggered
		*/
		beforesubmit: function (form) {
			var btn = form.data('trigger');
			if (btn && btn.hasClass('btn')) btn.addClass('loading');
			// following does not work in this stage
			// as elements are serialized already
			/*form.find('input, textarea').each(function () {
				var emptyval = $(this).data('emptyvalue');
				if (emptyval && ($(this).val() == emptyval)) $(this).val('');
			});*/
			form.find(':enabled').each(function () {
				$(this).data('active', true);
				this.disabled = true;
			});
			return true;
		},
		/*
		prepares form once it has been submitted
		*/
		aftersubmit: function (form) {
			var btn = form.data('trigger');
			if (btn && btn.hasClass('btn')) btn.removeClass('loading');
			form.find(':disabled').each(function () {
				if ($(this).data('active')) this.disabled = false;
				$(this).trigger('blur');
			});
		},
		/*
		standard settings for AJAX form initialization.
		these can be overriden with $.extend when needed
		*/
		settings: function () {
			return {
				dataType: 'json', //jQuery
				beforeSubmit: function (formdata, form, opts) { //jForm
					this.form = form;
					//p.form.beforesubmit(form);
					//for (var k in formdata) { alert(formdata[k].name + ':' + formdata[k].value); };
					//return false;
					return p.form.beforesubmit(form);
				},
				success: function (data) { p.form.handleJSON(data, this.form); }, //jQuery
				error: function (xrsp) { p.form.handleERR(xrsp, this.form); } //jQuery
				//beforeSend: function (xrsp) { this.cust = 'daa'; }, //jQuery
				//complete: function (xrsp, stat) { alert(stat); } //jQuery
			}
		},
		/*
		alternative submit function to use with secondary submit buttons
		it simply sets the passed button as the trigger
		*/
		altsubmit: function (form, trigger, opts) {
			var settings = (opts) ? $.extend(p.form.settings(), opts) : p.form.settings();
			form.data('trigger', trigger);
			form.ajaxSubmit(settings);
			//form.ajaxForm(settings);
			//form.trigger('submit', opts);
		},
		/*
		helper setting up the standard JSON posting form with a trigger
		NB! requires ajaxForm jQuery plugin to be loaded in page head
		form - form field, trigger - submit button,
		msgfld - message container element, opts - override default settings
		*/
		setup: function (form, trigger, msgfld, opts) {
			var settings = (opts) ? $.extend(p.form.settings(), opts) : p.form.settings();
			form.data('msgfld', msgfld);
			form.data('trigger', trigger);
			form.ajaxForm(settings);
			form.bind('form-pre-serialize', function (e) {
				// clear all emptyvalues before serialize
				form.find('input, textarea').each(function () {
					var emptyval = $(this).data('emptyvalue');
					if (emptyval && ($(this).val() == emptyval)) $(this).val('');
				});
			});
			if (trigger) trigger.click(function (e) {
				form.trigger('submit');
				e.preventDefault();
			});
		}
	},
	message: {
		/*
		show generic user error message.
		requires <div id="message"><div> to be present in a DOM
		*/
		error: function (msg, fld) {
			p.message.status(msg, fld);
			p.message.field(fld).addClass('error');
		},
		/*
		show generic confirmation message.
		requires <div id="message"><div> to be present in a DOM
		*/
		confirm: function (msg, fld) {
			p.message.status(msg, fld);
			p.message.field(fld).addClass('confirm');
		},
		/*
		show generic status message.
		requires <div id="message"><div> to be present in a DOM
		*/
		status: function (msg, fld) {
			p.message.hide(fld);
			if (msg) {
				p.message.field(fld).text(msg);
				p.message.field(fld).show();
				//p.message.field(fld).addClass('visible');
			}
		},
		/*
		dismiss any error or status messages currently visible.
		*/
		hide: function (fld) {
			//p.message.field(fld).removeClass('visible error confirm');
			p.message.field(fld).hide();
			p.message.field(fld).removeClass('error confirm');
		},
		field: function (fld) { return (fld) ? fld : $('#message'); }
	},
	date: {
		/*
		attach a preconfigured datepicker to a input field
		pass options object as argument to override the defaults
		*/
		setup: function (field) {
			var opts = {
				duration: '',
				firstDay: 1,
				dateFormat: 'd.mm.yy',
				dayNamesMin: ['P', 'E', 'T', 'K', 'N', 'R', 'L'],
				monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni','Juuli','August','September','Oktoober','November','Detsember']
			};
			if (arguments.length > 1) {
				opts = $.extend(opts, arguments[1]);
			}
			field.datepicker(opts);
		}
	}
};



/*$.ajaxSetup({
			dataType: 'json'
			});


$(document).ready(function() {
	$('.btn span.label').wrap('<span class="bg middle"></span>');
	$('.btn').prepend('<span class="bg left"></span><span class="bg right"></span>');
	});
*/
