/**
 * Core Design "Tasty" Monials plugin for Joomla! 1.5
 */

(function($) {
	$.cdtastymonials = {
		
		/**
		 * Init application
		 * 
		 * @return void
		 */
		initiator: function() {
		
			cdtastymonials = this;
			
			cdtastymonials.themeButton($('div.cdtastymonials'));
			
			tastymonials = $('div.cdtastymonials'),
			form_cont = tastymonials.find('div.submit_new'),
			form = form_cont.find('form[name="submit_new"]'),
			toggle_interval = 500;
			
			// show/hide additional info box
			tastymonials.find('div.additional_info a').click(function(e) {
				e.preventDefault();
				$(this).parent('div').next('div.content').slideToggle(toggle_interval);
			});
			
			// hide/show form
			form_cont.find('button:first')
			.click(
				function(e) {
					if (cdtastymonials.getParam('disableGuests') && cdtastymonials.getParam('imGuest')) {
						alert(cdtastymonials.lang('LOGIN_FIRST'));
						return false;
					};
					
					form_cont.find('button:first').parent('div').slideUp(toggle_interval);
					form.show(toggle_interval, function() { $(this).find('input:first').focus(); });
				}
			);
			
			// cancel button
			form
				.find('button.cancel')
				.click(
					function() {
						form_cont.find('button:first').parent('div').slideDown(toggle_interval);
						form.hide(toggle_interval);
						
						// clean
						cdtastymonials.cleanBox(form);
					}
				);
			
			// reset button
			form.find('button.reset').click( function() {
				// clean
				cdtastymonials.cleanBox(form);
				
				// focus
				form_cont.find('input:first').focus();
			});
			
			form.submit(
				function(e) {
					e.preventDefault();
					
					var formvalues = $(this).find('input[name="firstname"], input[name="lastname"], input[name="email"], textarea[name="text"], input[name="tastymonials_mathguard_answer"]');
					
					if ($(formvalues[0]).val() === '') {
						$(formvalues[0]).focus();
						return false;
					}
					if ($(formvalues[1]).val() === '') {
						$(formvalues[1]).focus();
						return false;
					}
					if ($(formvalues[2]).val() === '' || cdtastymonials.validateEmail($(formvalues[2]).val()) === false) {
						$(formvalues[2]).focus();
						return false;
					}
					if ($(formvalues[3]).val() === '') {
						$(formvalues[3]).focus();
						return false;
					}
					
					// text_minlength
					if (cdtastymonials.getParam('text_minlength') > 0) {
						if ($(formvalues[3]).val().length < cdtastymonials.getParam('text_minlength')) {
							alert(cdtastymonials.lang('TEXT_TOO_SHORT'));
							$(formvalues[3]).focus();
							return false;
						}
					}
					
					// text_maxlength
					if (cdtastymonials.getParam('text_maxlength') > 0) {
						if ($(formvalues[3]).val().length > cdtastymonials.getParam('text_maxlength')) {
							alert(cdtastymonials.lang('TEXT_TOO_LONG'));
							$(formvalues[3]).focus();
							return false;
						}
					}
					
					if ($(formvalues[4]).is ('input') && $(formvalues[4]).val() === '') {
						$(formvalues[4]).focus();
						return false;
					}
					
					$.ajax({
						type: 'POST',
						data: $(this).serialize(),
						cache: false,
						async: false,
						beforeSend: function() {
							form.find('button[type="submit"]').addClass('ui-state-disabled').attr('disabled', true);
						},
						success: function(msg) {
							
							if (cdtastymonials.strpos(msg, '0|') === false) {
								cdtastymonials.successBox(msg, form);
								cdtastymonials.resetAddNewForm(); // reset form
							} else {
								cdtastymonials.errorBox(cdtastymonials.str_replace('0|', '', msg), form);
							}
						},
						complete: function() {
							form.find('button[type="submit"]').removeClass('ui-state-disabled').attr('disabled', false);
						}
					});
					
					return false;
				}
			);
			
			// action buttons
			cdtastymonials.actionButtons();
		},
		
		/**
		 * Validate e-mail
		 * 
		 * @param email
		 * @return boolean
		 */
		validateEmail: function(email) {
			var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
			if (!filter.test(email)) return false;
			return true;
		},
		
		/**
		 * Action buttons
		 * 
		 * @return void
		 */
		actionButtons: function() {
			var buttons_container = tastymonials.find('div.actionbuttons'),
			buttons = buttons_container.find('button'),
			token = buttons_container.find('input:hidden:last[value="1"]').attr('name');
			
			buttons.click(function(e) {
				e.preventDefault();
				
				button = $(this);
				var id = button.parent('div.actionbuttons').find('input[name="id"]');
				
				if ($(this).hasClass('delete')) {
					// delete item
					var really = confirm(cdtastymonials.lang('CONFIRMATION'));
					if (!really) return false;
					
					$.ajax({
						type: 'POST',
						data: 'cdtastymonials_task=deleteItem&testimonial_id=' + id.val() + '&' + token + '=1',
						cache: false,
						async: false,
						beforeSend: function() {
							button.addClass('ui-state-disabled').attr('disabled' , true);
						},
						success: function(msg) {
							if (msg == 1) {
								cdtastymonials.hideTestimonialBox(id);
							} else {
								alert(msg);
							}
						},
						complete: function() {
							button.removeClass('ui-state-disabled').attr('disabled' , false);
						}
					});
				} else if ($(this).hasClass('approve')) {
					// approve item
					$.ajax({
						type: 'POST',
						data: 'cdtastymonials_task=approveItem&testimonial_id=' + id.val() + '&' + token + '=1',
						cache: false,
						async: false,
						beforeSend: function() {
							button.addClass('ui-state-disabled').attr('disabled' , true);
						},
						success: function(msg) {
							if (msg == 1) {
								cdtastymonials.hideTestimonialBox(id);
							} else {
								alert(msg);
							}
						},
						complete: function() {
							button.removeClass('ui-state-disabled').attr('disabled' , false);
						}
					});
				}
			});
		},
		
		/**
		 * Hide and remove Testimonial box based on ID
		 * 
		 * @param id
		 * @return boolean
		 */
		hideTestimonialBox: function(id) {
			var container = id.parent('div.actionbuttons').closest('div.container');
			container.slideUp( toggle_interval, function() {
				var needapprove = $(this).parent('div.needapprove');
				
				$(this).remove();
				
				if (needapprove.find('div.container').length === 0) {
					needapprove.append(cdtastymonials.lang('NO_APPROVE'));
				}
			});
		},
		
		/**
		 * Get language
		 * 
		 * @return string
		 */
		lang: function(string, def) {
			var lang = eval('cdtastymonials.language.CDTASTYMONIALS_' + string);
			if (typeof(lang) === 'string') return lang;
			return def || '';
		},
		
		/**
		 * Get Param
		 * 
		 * @return mixed
		 */
		getParam: function(param, def) {
			var output = eval('cdtastymonials.settings.' + param);
			if (typeof(output) !== 'undefined') return output;
			return def || null;
		},
		
		/**
		 * Open add new form
		 * 
		 * @return void
		 */
		openAddNewForm: function() {
			form_cont.find('button:first').click();
		},
		
		/**
		 * Reset Add new form
		 * 
		 * @return void
		 */
		resetAddNewForm: function() {
			form.find('input:visible, textarea').each(function() {
				$(this).val('');
			});
			form.find('select[name="rating"]').val('5');
		},
		
		/**
		 * PHP strpos function
		 * Finds position of first occurrence of a string within another.
		 */
		strpos: function(haystack, needle, offset) {
		    var i = (haystack+'').indexOf(needle, (offset ? offset : 0));
		    return i === -1 ? false : i;
		},
		
		/**
		 * PHP str_replace function - modified by Core Design
		 * Replaces all occurrences of search in haystack with replace.
		 */
		str_replace: function(search, replace, subject) {
		    var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0,
		            f = [].concat(search),
		            r = [].concat(replace),
		            s = subject,
		            ra = r instanceof Array, sa = s instanceof Array;
		    s = [].concat(s);

		    for (i=0, sl=s.length; i < sl; i++) {
		        if (s[i] === '') {
		            continue;
		        }
		        for (j=0, fl=f.length; j < fl; j++) {
		            temp = s[i]+'';
		            repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
		            s[i] = (temp).split(f[j]).join(repl);
		        }
		    }
		    return sa ? s : s[0];
		},
		
		/**
		 * Clean previous msg box
		 * 
		 * @param cont
		 * @return boolean
		 */
		cleanBox: function(cont) {
			if (typeof(cont) === 'undefined') return false;
			
			// clean previous messages
			if (cont.next('div.ui-widget').length > 0) cont.next('div.ui-widget').slideUp(toggle_interval);
			
			return true;
		},
		
		/**
		 * Success box
		 * 
		 * @param msg
		 * @param cont
		 * @return boolean
		 */
		successBox: function(msg, cont) {
			if (typeof(cont) === 'undefined') return false;
			msg = msg || '';
			
			cdtastymonials.cleanBox(cont); // clean
			
			var tmpl = ''
				+ '<div class="ui-widget">'
					+ '<div class="ui-state ui-state-highlight ui-corner-all">'
						+ '<p><span class="ui-icon ui-icon-info"/>' + msg + '</p>'
					+ '</div>'
				+ '</div>';
			
			cont.after(tmpl).next('div.ui-widget').slideDown();
			return true;
		},
		
		/**
		 * Error box
		 * 
		 * @param msg
		 * @param cont
		 * @return boolean
		 */
		errorBox: function(msg, cont) {
			if (typeof(cont) === 'undefined') return false;
			msg = msg || '';
			
			cdtastymonials.cleanBox(cont); // clean
			
			var tmpl = ''
				+ '<div class="ui-widget">'
					+ '<div class="ui-state ui-state-error ui-corner-all">'
						+ '<p><span class="ui-icon ui-icon-alert"/>' + msg + '</p>'
					+ '</div>'
				+ '</div>';
			
			cont.after(tmpl).next('div.ui-widget').slideDown();
			return true;
		},
		
		/**
		 * Theme button
		 * 
		 * @param elemements
		 * @return void
		 */
		themeButton: function(elements) {
			elements.each(function() {
				$(this).find('button')
					.addClass('ui-state-default ui-corner-all')
					.hover(
						function() {
							$(this).addClass('ui-state-hover');
						},
						function() {
							$(this).removeClass('ui-state-hover');
						}
					);
			});
		}
		
	};
})(jQuery);
