(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();
		if ( height < 25 ) {
			height = 25;
		}
		var width = el.width();
		var data = $(this).metadata();
		var opts = $.extend({'content':'replace','dataType':'html', 'callback': null},data, options);
		if ( opts.url ) {
//			el.find('.block-content:eq(0)').block({message:'<h3>Loading...</h3>'});
		//	if ( el.find('.block-content:eq(0)') != undefined ) {
				var ind = $('<div class="__loading"><img src="' + __appBase + '/img/indicators/h_small.gif"/></div>');
				if ( opts.content == 'replace' ) {
					el.html(ind.attr('height', height + 'px;').attr('width', width+'px;'));
				}
				else {
					
					_setContent(el, opts, ind);
				}
				
		//	}
			if ( isFullUrl(opts.url) ) {
				var url = opts.url;
			}
			else {
				var url = __appBase + opts.url;
			}
			if ( opts.data ) {
				$.post(url, opts.data, function(data){
					if ( opts.dataType == 'json' ) {
						el.html(data.response);
					}
					else {
						el.html(data);
					}
				}, opts.dataType);
			}
			else {
				$.get(url, {}, function(data){
					ind.remove();
					if ( opts.dataType == 'json' ) {
						if ( data ) {
							_setContent(el, opts, data.response);		
						}
					}
					else {
						_setContent(el, opts, data);		
					}

					if ( $.isFunction(opts.callback) ) {
						opts.callback();
					}
						
				}, opts.dataType);
			}
		}
	});	

	return this;

	function _setContent(el, opts, content) {
		switch(opts.content) {
			case 'append':
				el.append(content);
				break;
			case 'prepend':
				el.prepend(content);
				break;
			default:
				el.html(content);
				break;
		}

		
	}
}

$.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.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;
}

$.fn.defaultText = function(options) {
        if (!this.length) {
                return this;
        }


        options = $.extend({
                text: 'Enter Text',
                cssClass: 'default'
        }, options || {});

        this.each(function(){
                var input = $(this);;
                var value = input.val();

                var text = options.text;

                if ( text == 'Enter Text' && input.attr('defaultText') != '' ) {
                        text = input.attr('defaultText');
                }

                input.focus(function(){
                        if ( input.val() == text ) {
                                input.val('');
                        }
                        input.removeClass(options.cssClass);
                });

                input.blur(function(){
                        if ( input.val() == '' ) {
                                input.val(text);
                                input.addClass(options.cssClass);
                        }
                        else {
                                input.removeClass(options.cssClass);
                        }
                });

                input.closest('form').submit(function(){
                        if ( input.val() == text ) {
                                input.val('');
                        }
                });

                input.trigger('blur');

        });
       	return this;
}

$.fn.loadingIndicator = function() {
	var ind = $('<div class="__loading"><img src="' + __appBase + '/img/indicators/h_small.gif"/></div>');
	this.each(function(){
		$(this).html(ind);
	});
}

$(document).ready(function(){
	$('.ajaxLoader').ajaxLoader();
	$('.ajaxTrigger').ajaxTrigger();
});

}(jQuery));

