(function ($) {

function isFullUrl(s) {
	var regexp = /(ftp|http|https):\/\/?/
	return regexp.test(s);
}


$.fn.ajaxLoader = function(options) {

	this.each(function(){
		var el = $(this);
		var height = el.height();
		var width = el.width();
		var data = $(this).metadata();
		if ( options ) $.extend(data, options);
		if ( data.url ) {
			var ind = $('<div style="height:' + height + 'px;width:'+width+'px;"><img src="' + __appBase + '/img/indicators/h_small.gif"/></div>').insertAfter(this);
			el.hide();
			if ( isFullUrl(data.url) ) {
				var url = data.url;
			}
			else {
				var url = __appBase + data.url;
			}
			if ( data.data ) {
				$.post(url, data.data, function(data){
					el.html(data);
					el.fadeIn();
					ind.remove();
				});
			}
			else {
				$.get(url, function(data){
					el.html(data);
					el.fadeIn();
					ind.remove();
				});
			}
		}
	});	

	return this;
}

$.fn.contextPopdown = function(options) {
	this.each(function(){
		var offset = $(this).offset();
		var target = $(options.target).remove().appendTo("body");
		$(target).css({
			position: 'absolute',
			left: offset.left + "px",
			top: (offset.top + $(this).height())+ "px"
		});
		$(this).click(function(){
			$(options.target).toggle('slide');
		});
	});

	return this;
}

$.fn.dialogDelete = function(options) {
	options = $.extend({}, options);
	this.each(function(){
		var trigger = $(this);
		var metadata = $(this).metadata();
		if ( metadata ) {
			options = $.extend(options, metadata);
		}
		$(this).click(function() {
			$('<div class="delete-confirmation" title="Delete Confirmation">Are you sure want to delete the item?</div>').appendTo('body').dialog({
				modal: true,
				buttons: {
					'Cancel': function() {
						$(this).dialog('destroy');
					},
					'Delete': function(){
						var url = '';
						if ( options && !options.url ) {
							url = trigger.attr('href');		
						}
						else {
							url = __appBase + options.url;
						}
						$.get(url, null, function(){
							if ( options.update ) {
								$(options.update).ajaxLoader();
							}
						}); 
						$(this).dialog('destroy');
					}
				}
			});
			return false;
		});
	});

	return this;
}

$.fn.alertResponse = function(options) {
	options = $.extend({}, options);
	this.each(function(){
		var trigger = $(this);
		var metadata = $(this).metadata();
		if ( metadata ) {
			options = $.extend(options, metadata);
		}
		$(this).click(function() {
			var url = '';
			if ( options && !options.url ) {
				url = trigger.attr('href');		
			}
			else {
				url = __appBase + options.url;
			}
			$.get(url, null, function(data){
				if ( options.update ) {
					$(options.update).ajaxLoader();
				}
				alert(data);
			});
			return false;
		});
	});

	return this;
}

$.fn.ajaxDialog = function(options) {
	this.each(function(){
		var settings = $.extend({}, options);

		var trigger = $(this);
		var metadata = $(this).metadata();
		if ( metadata ) {
			settings = $.extend(settings, metadata);
		}

		var url = '';
		if ( settings && !settings.url ) {
			url = trigger.attr('href');		
		}
		else {
			url = __appBase + settings.url;
		}

		$(this).click(function() {
			$('<div title="Edit"></div>').appendTo('body').dialog($.extend({
				modal: true,
				width: '400px',
				buttons: {
					'Cancel': function() {
						$(this).dialog('destroy');
					},
					'Submit': function(){
						var dlg = $(this);
						dlg.find('form').submit();
					}
				},
				open: function() {
					var dlg = $(this);
					dlg.html('<img src="' + __appBase + '/img/indicators/h_small.gif" />');
					$.get(url, null, function(data){
						dlg.html(data.response);
						dlg.find('form').ajaxForm({dataType:'json', success: function(data){
								if ( data.status == 'success' ) {
									if ( settings.update ) {
										$(settings.update).ajaxLoader();
									}
									dlg.dialog('destroy');
								}
								else {
									dlg.html(data.response);
								} 
							},
							error: function(XMLHttpRequest, textStatus, errorThrown){
								alert('Error: ' + textStatus);
								dlg.dialog('destroy');
							}
						});
						//re-center after the form is loaded
						dlg.dialog('option', 'position', 'center');
					}, 'json'); 
				}
			}, settings));
			return false;
		});
	});

	return this;

};

$.fn.ajaxTrigger = function(options) {
	options = $.extend({bind: 'click'}, options);

	this.each(function(){
		var el = $(this);
		var metadata = $(this).metadata();
		var settings = $.extend(metadata, options);
		if ( !settings.url ) {
			settings.url = el.attr('href');
			if ( settings.url && !isFullUrl(settings.url) && __appBase != '' ) {
				settings.url = settings.url.replace(__appBase, '');
			}
		}
		if ( settings.bind && settings.update ) {
			el.bind(settings.bind, function(e) {
				if ( settings.confirm && !confirm(settings.confirm) ) {
					return false;
				}
				$(settings.update).ajaxLoader(settings);
				return false;
			});
		}
	});	

	return this;

}

$.fn.flashMessage = function(options) {
	options = $.extend({'action':'prepend', 'type':'success', 'message': '','delay': 2000, 'effect':'slow'}, options);
	
	this.each(function(){
		if ( options.action == 'prepend' ) {
			$('<div class="message '+ options.type +'">' + options.message + '</div>')
                       		.hide()
				.prependTo(this)
                                .fadeIn(options.effect);
				/*.delay(options.delay)
                                .fadeOut(options.effect, function() { 
					$(this).remove();
				});*/
		}
	});
	
	return this;
}


$(document).ready(function(){
	$('.ajaxLoader').ajaxLoader();
	$('.ajaxTrigger').ajaxTrigger();
	
	$('a._ajaxLinkRepleaceLocation').live('click', function(event){
  		button = $(this);
  		button.addClass('hidden');
  		
		$.get(button.attr("href"), function(data, textStatus){
			if(textStatus == "success"){
				$(button.attr('load_location')).replaceWith(data);
			} else {
				button.removeClass('hidden');
				alert("Sending the request failed, please try again.");
			}
		});
		event.preventDefault();
  	});
  	
  	$("select._onFormElementChange").live('change', function(){
		var formElement = $(this);
		if(formElement.attr('ajaxAction') != null && formElement.attr('ajaxAction') != undefined){
			$.ajax({
  				url: formElement.attr('ajaxAction') + '/' + formElement.val(),
  				data: null,
  				success: function(data){ $(formElement.attr('onAjaxActionSuccess')).html(data); }
			});
		}
	});
});

}(jQuery));

