// velocidade das animacoes dos feedbacks
var FEEDBACK_SPEED = 400;
// duração da mensagem na tela
var FEEDBACK_DURATION = 6000;

String.prototype.nl2br = function() {
	return this.split("\r\n").join('<br />');
};

String.prototype.getUrlParams = function() {
    var vars = {}, hash;
    if( this.indexOf('?') < 0 ) return {};
    var queryString = this.slice(this.indexOf('?') + 1);
    if( !queryString.length ) return {};
    var hashes = queryString.split('&');
    if( queryString.indexOf('?') +1 ) {
    	queryString = queryString.replace('/#([.]*)/i', '');
    }
    for(var i = 0; i < hashes.length; i++) {
        hash = hashes[i].split('=');
        vars[hash[0]] = decodeURIComponent(hash[1]);
        //vars[hash[0]] = (hash[1]);
    }
    return vars;
};

String.prototype.alphaNumeric = function() {
	var 
		str = this,
		regexp,
		translate = {
			'[áãàä]': 'a',
			'[ç]': 'c',
			'[éêèë]': 'e',
			'[íìï]': 'i',
			'[õóòöô]': 'o',
			'[úüù]': 'u'
	};
	
	for(a in translate) {
		regexp = new RegExp(a, ['i']);
		str = str.replace(regexp, translate[a]);
	}
	
	str = str.replace(/[^0-9A-Z]/i, '');
	return str;
};

String.prototype.toRegexp = function() {
	var 
		str = this,
		regexp,
		translate = [
			'[áãàäa]',
			'[çc]',
			'[éêèëe]',
			'[íìïi]',
			'[õóòöôo]',
			'[úüùu]'
		];
	for(a in translate) {
		regexp = new RegExp(translate[a], ['i']);
		str = str.replace(regexp, translate[a]);
	}
	return str;
};

$.concatValues = function(a, delimiter) {
	delimiter = delimiter || '';
	if(typeof a == 'object') {
		return $(a).map(function(){
			return $(this).val();
		}).get().join(delimiter);
	} else if(typeof a == 'string') {
		a = arguments;
		return a.join(delimiter);
	}
};

$.scrollTo = function(where) {
	var $scrollTarget = $(where);
	var targetOffset = $($scrollTarget).offset();
	
	if(!targetOffset.top) return;
	targetOffset = targetOffset.top;
	
	var scrollElem = document.body;
	if($.browser.safari)
		scrollElem = 'body'
	else
		scrollElem = 'html';
	
	if( $(scrollElem).scrollTop() != targetOffset ) {
		$(scrollElem).animate({scrollTop: targetOffset}, 800, 'easeInOutExpo');
	}
};

$.fn.loadHtml = function(url, params, callback) {
	$(this).load(url, params, callback);
};

$.fn.clearFeedbackBox = function(parentSelector) {
	$(this).showFeedbackBox(null, parentSelector);
};

$.fn.showFeedbackBox = function(feedback, parentSelector) {
	if(typeof parentSelector == 'string') {
		var container = $(this).closest(parentSelector);
	} else if(parentSelector) {
		var container = $(parentSelector);
	} else {
		var container = $(this);
	}
	if(!container) return false;
	
	if(feedback) {
		if( container.find('.box-feedback').length > 0 ) {
			container.find('.box-feedback').remove();
		}
		
		var fd = $(document.createElement('div')).appendTo(container);
		
		fd.hide().removeClass()
			.addClass('box-feedback icon ' + feedback.type)
			.html(feedback.message);
		fd.fadeIn(200, function(){ $(this).css('display', ''); });
	} else {
		if(container.find('.box-feedback').length > 0) {
			container
				.find('.box-feedback')
				.hide().remove();
		}
	}
	return this;
};

$.fn.disable = function() {
	return $(this).attr('disabled', true).addClass('disabled');
};

$.fn.enable = function() {
	return $(this).removeAttr('disabled').removeClass('disabled');
};

$.fn.disableClick = function(delay) {
	// funcao que PARA TUDO
	var self = this,
		handlerPreventClick = function(e) {
			e.stopImmediatePropagation();
			e.preventDefault();
		};

	// adiciona a funcao no topo da stack de handlers
	$(this).bindIntoStack(0, 'click.disable', handlerPreventClick);
	
	if(delay) {
		// em segundos
		delay = parseInt(delay) * 1000;
		
		var timeoutId = setTimeout(function(){
			$.fn.enableClick.apply(self);
		}, delay);
		
		$(self).data('disableClick', {
			timeout: timeoutId,
			handler: handlerPreventClick
		});
	}
};

$.fn.enableClick = function() {
	var interval;
	if( interval = $(this).data('disableClick') ) {
		clearTimeout(interval.timeout);
		$(this).data('disableClick', false);
		$(this).unbind('click.disable');
	}
};

$.fn.onEnter = function(fn){
	if(typeof fn == 'function') {
		var args = Array.prototype.slice.call(arguments);
		$(this).bind('keydown.onEnter', function(e){
			if(e.keyCode != 13) return true;
			e.preventDefault();
			fn.apply(this, args);
		});
	}
};

$.fn.clearInputFeedback = function(parentSelector) {
	$(this).showInputFeedback(null, parentSelector);
};

$.fn.showInputFeedback = function(feedback, parentSelector, tagName) {
	parentSelector = parentSelector || 'div.campo';
	tagName = tagName || 'span';

	if(typeof parentSelector == 'string') {
		var container = $(this).closest(parentSelector);
	} else {
		var container = $(parentSelector);
	}
	if(!container) return false;

	if(feedback) {
		feedback.delimited = typeof feedback.delimited == 'undefined' ? true : feedback.delimited;
		if( container.find('.input-feedback').length > 0 ) {
			container.find('.input-feedback').remove();
		}

		var fd = $(document.createElement(tagName));

		fd.html('')
			.removeClass()
			.addClass('input-feedback icon ' + feedback.type);
		if(feedback.message) {
			feedback.message = feedback.message.nl2br();
			if(feedback.delimited) fd.addClass('delimited');
			fd.html(feedback.message);
		} else {
			fd.addClass('empty');
		}
		container.append(fd);
	} else {
		if(container.find('.input-feedback').length > 0) {
			container
				.find('.input-feedback')
				.hide().remove();
		}
	}	
	return this;
};

$.fn.clearAllInputFeedbacks = function() {
	var container = $(this);
	if(container.find('.input-feedback').length > 0) {
		container
			.find('.input-feedback')
			.remove()
			.hide();
	}
	return false;
};

$.flashFeedback = function($obj) {
	var target = $('#FlashTopo');
	
	if(typeof $obj.message != "string" || $obj.message.length < 1) {
		return false;
	}
	
	$obj.fade = typeof $obj.fade == 'undefined' ? FEEDBACK_DURATION : $obj.fade;
	$obj.type = typeof $obj.type == 'undefined' ? 'info' : $obj.type;
	
	var $html = $('<div>')
		.addClass('flash-feedback')
		.addClass($obj.type)
		.html($obj.message);
	
	var $this = $(target).html($html);
	
	if($obj.fade > 0) {
		if(typeof tmMensagem != 'undefined') {
			clearTimeout(tmMensagem);
		}
		tmMensagem = setTimeout(function(){
			$(target).moveTopUp(FEEDBACK_SPEED, function(){
				$('.flash-feedback', this).remove();
			});
		}, $obj.fade);
	}
	if( parseInt($(target).css('top')) < 0 ) {
		$(target).moveTopDown(FEEDBACK_SPEED);
	}
};

$.fn.move = function(prop, m, d, c) {
	prop = prop || 'top';
	m = parseInt(m) || 0;
	
	var blockSize = 0;
	
	if(prop == 'top' || prop == 'bottom') {
		blockSize = $(this).height();
	} else if(prop == 'left' || prop == 'right') {
		blockSize = $(this).width();
	}
	
	var opt = {},
		offset = blockSize * (m * -1);
	
	if( !this.css('position').match(/^(absolute|fixed)$/) ) {
		return this;
	}
	
	opt[prop] = offset;
	return this.animate(opt, d, c);
};

$.fn.moveTopDown = function(d, c) {
	return this.move('top', 0, d, c);
};
$.fn.moveTopUp = function(d, c) {
	return this.move('top', 1, d, c);
};
$.fn.moveBottomUp = function(d, c) {
	return this.move('bottom', 0, d, c);
};
$.fn.moveBottomDown = function(d, c) {
	return this.move('bottom', 1, d, c);
};

$.fn.reverse = [].reverse;

$.fn.cShow = function() {
	$(this).removeClass('hidden');
	return this;
};

$.fn.cHide = function() {
	$(this).addClass('hidden');
	return this;
};

$.fn.cToggle = function(toggle) {
	if( typeof toggle != 'undefined' ) {
		$(this).toggleClass('hidden', toggle);
	} else {
		$(this).toggleClass('hidden');
	}
	return this;
};

function copyToClipboard(text) {
	window.prompt('Para copiar, pressione Ctrl+C, depois pressione Enter para fechar esta janela', text);
	return false;
}


$(function() {
	$(document)
		.ajaxSend(function(e, xhr, opt){
			var _defaults = {
				message: 'Carregando...',
				wait: 400,
				type: 'bottom',
				selector: false
			};
			
			var ld = _defaults;
			xhr.loaderId = e.timeStamp;
			
			switch(typeof opt.loader) {
				case 'boolean':
					if( !opt.loader ) { return true; }
				case 'undefined':
					opt.loader = _defaults;
				case 'object':
					ld = $.extend({}, _defaults, opt.loader);
					var loader;
					if(ld.selector && $(ld.selector).length) {
						loader = $(ld.selector)
							.attr('rel', xhr.loaderId)
							.toggleClass('loading', true);
					} else {
						loader = $('<div>')
							.addClass('loading')
							.addClass('loading-' + ld.type)
							.attr('rel', xhr.loaderId)
							.hide()
							.html('<span>' + ld.message + '</span>')
							.appendTo( $('#container') );
					}
					
					var tm = $(loader).data('loaderTimeout');
					if( tm ) clearTimeout(tm);
					
					$(loader).data('loaderTimeout', setTimeout(function(){
						$('.loading[rel=' + xhr.loaderId + ']')
							.stop().fadeIn(200, 'linear');
					}, ld.wait));
					break;
				default:
					break;
			}
		})
		.ajaxComplete(function(e, xhr, opt){
			var loader = $('.loading[rel=' + xhr.loaderId + ']');
			if( loader.length ) {
				if(typeof loader.data('loaderTimeout') == 'number') {
					clearTimeout(loader.data('loaderTimeout'));
				}
				loader.stop().hide();
			}
			if(xhr.statusText != 'success') {
				if(xhr.statusText == 'error' && xhr.status >= 300) {
					$.flashFeedback({
						message: 'Houve uma falha em sua requisição. Cód: ' + xhr.status,
						type: 'error'
					});
				}
			}
			return;
		});
	
	initFormControls = function(context) {
		$(context)
			.delegate('input[onfill]', 'keypress', function(e){
				if(!e.isDefaultPrevented()) {
					if( $(this).val().length +1 == $(this).attr('maxlength') && e.charCode != 0) {
						var t = $('#'+$(this).attr('onfill'));
						setTimeout(function(){
							t.focus();
							if(t.is('input[type=text]')) t.select();
						}, 1);
					}
				}
			})
			.delegate('input[onenter]', 'keypress', function(e) {
				var target = $('#'+$(this).attr('onenter'));
				if( e.keyCode == 13 ) {
					if( $(this).is('[validation=true]') && $(this).trigger('validate') ) {
						if( $(this).data('validationResult') ) {
							setTimeout(function(){
								target.focus();
							}, 1);
						}
					} else {
						e.preventDefault();
					}
				}
			});
		$('[press-delay]').bind('click', function(e){
			if( !$(this).data('disableClick') ) {
				$(this).disableClick($(this).attr('press-delay'));
			}
		});
		
		if($.browser.msie) {
			$('[copy-text]').remove();
		} else {
			$('[copy-text]').click(function(e){
				copyToClipboard($(this).attr('copy-text'));
				e.preventDefault();
				return;
			});
		}
		
		$('input.text:not(.ac)', context).attr('autocomplete', 'off');
		
		$('input.mask-ncartao', context).mask('9999-9999-9999-9999');
		
		$('input.mask-cep', context).mask('99999-999');
		
		$('input.mask-cpf', context).mask('999.999.999-99');
		$('input.mask-cnpj', context).mask('99.999.999/9999-99');
		
		$('input.mask-date', context).mask('99/99/9999');
		$('input.mask-telefone', context).mask('(99) 9999-9999');
		
		$('.uppercase', context).blur(function(){$(this).val($(this).val().toUpperCase());});
		$('.lowercase', context).blur(function(){$(this).val($(this).val().toLowerCase());});
		
		$('.js-hide', context).hide();
		
		$('.focus', context).focus();
	};
	
	initFormControls(document);
	
	$('a[confirmation-text]').click(function(e){
		e.preventDefault();
		var url = '/confirm?text=' + encodeURIComponent( $(this).attr('confirmation-text') );
		if( $(this).is('[confirmation-obs]') ) {
			url = url + '&obs=' + encodeURIComponent( $(this).attr('confirmation-obs') );
		}
		url = url + '&confirmUrl=' + ($(this).attr('href'));
		
		$.fancybox({
			type: 'ajax',
			href: url
		});
	});
	
	initFancybox = function(context) {
		$("a.fancybox[href]", context).fancybox({
			scrolling: 'no',
			onComplete: function(){
				var context = document.getElementById('fancybox-wrap');
				initFormControls(context);
				if(initFormTooltips)
					initFormTooltips(context);
				initFancybox(context);
			}
		});
	};
	
	initFancybox(this);
});
