// Variaveis globais aletórias
var $wnd = $(window),
	$doc = $(document);

// Anti firebug desativado
if (console === undefined){
	var console = {
		log: function(d){},
		error: function(d){},
		info: function(d){}
	};
}
onerror = function(msg, file, line){
	console.error(msg+" on file "+file+":"+line);
	return true;
};


function count(obj){
	var count=0;
	for (var i in obj) count++;
	return count;
}

// Coisas a se remover
function plusGetElementById(id){
	if (document.getElementById){
		return (document.getElementById(id));
	}else if (document.all){
		return (document.all[id]);
	}else{
		if (navigator.appname.indexOf("Netscape") != -1 && parseInt(navigator.appversion == 4)){
			return (document.layers[id]);
		}
	}
}
function openWithSelfMain(url,name,width,height,returnwindow){
	var options = "width=" + width + ",height=" + height + ",toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no";
	var new_window = window.open(url, name, options);
	window.self.name = "main";
	new_window.focus();
	if (returnwindow != null){
	   return new_window;
	}
}
function appendSelectOption(selectMenuId, optionName, optionValue){
	var selectMenu = plusGetElementById(selectMenuId);
	var newoption = new Option(optionName, optionValue);
	newoption.selected = true;
	selectMenu.options[selectMenu.options.length] = newoption;
}
function disableElement(target){
	var targetDom = plusGetElementById(target);
	if (targetDom.disabled != true) {
		targetDom.disabled = true;
	} else {
		targetDom.disabled = false;
	}
}
function plusCheckAll(formname, switchid){
	var ele = document.forms[formname].elements;
	var switch_cbox = plusGetElementById(switchid);
	for (var i = 0; i < ele.length; i++) {
		var e = ele[i];
		if (e.name != switch_cbox.name && e.type == 'checkbox'){
			e.checked = switch_cbox.checked;
		}
	}
}
function plusCheckGroup(formname, switchid, groupid){
	var ele = document.forms[formname].elements;
	var switch_cbox = plusGetElementById(switchid);
	for (var i = 0; i < ele.length; i++){
		var e = ele[i];
		if (e.type == 'checkbox' && e.id == groupid){
			e.checked = switch_cbox.checked;
			e.click(); e.click();  // Click to ativar subgroups. Twice so we
									// don't reverse effect
		}
	}
}
function plusCheckAllElements(elementIds, switchId){
	var switch_cbox = plusGetElementById(switchId);
	for (var i = 0; i < elementIds.length; i++){
		var e = plusGetElementById(elementIds[i]);
		if (e.name != switch_cbox.name && e.type == 'checkbox'){
			e.checked = switch_cbox.checked;
		}
	}
}
function plusInsertText(domobj, text){
	if(domobj.selectionEnd){
		var str1=domobj.value.substring(0, domobj.selectionStart);
		var str2=domobj.value.substring(domobj.selectionEnd, domobj.value.length);
		domobj.value = str1 + text + str2;
		domobj.selectionEnd = domobj.selectionStart;
		domobj.blur();	
	}else if (domobj.createTextRange && domobj.caretPos){
  		var caretPos = domobj.caretPos;
		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;  
	}else if (domobj.getSelection && domobj.caretPos){
		var caretPos = domobj.caretPos;
		caretPos.text = caretPos.text.charat(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
	}else{
		domobj.value = domobj.value + text;
  	}
}
function showImgSelected(imgId, selectId, imgDir, extra, plusUrl){
	plusUrl = plusUrl || "./";
	imgDom = plusGetElementById(imgId);
	selectDom = plusGetElementById(selectId);
	if (selectDom.options[selectDom.selectedIndex].value != ""){
		imgDom.src = plusUrl + "/"+ imgDir + "/" + selectDom.options[selectDom.selectedIndex].value + extra;
	}else{
        imgDom.src = plusUrl + "/imagens/blank.gif";
	}
}
function getSelect(id){
	if (window.getSelection){
		ele = document.getElementById(id);
		var selection = ele.value.substring(ele.selectionStart, ele.selectionEnd);
	}else if (document.getSelection){
		var selection = document.getSelection();
	}else if (document.selection){
		var selection = document.selection.createRange().text;
	}else{
		var selection = null;
	}
	return selection;
}
function valida_tecla(campo, event){
	var key, tecla, BACKSPACE = 8;
	CheckTAB=true;
	if(navigator.appName.indexOf("Netscape")!= -1){
		tecla = event.which;
	}else{
		tecla = event.keyCode;
	}
	key = String.fromCharCode(tecla);
	if (tecla == 13) return false;
	if (tecla == BACKSPACE) return true;
	return (isNum(key));
}
function isNum(caractere){ 
	var strValidos = '0123456789'; 
	if (strValidos.indexOf(caractere) == -1) return false; 
	return true; 
}
function mascara_data(el){
	var mydata = el.value;

	if (mydata.length == 2){
		mydata = mydata + '/';
		el.value = mydata;
	}
	if (mydata.length == 5){
		mydata = mydata + '/';
		el.value = mydata;
	}
	if (mydata.length == 10){
		if(!verifica_data(mydata)){
			el.value='';
		}
	}
}
function verifica_data(data){
	var situacao = '';
	if (data.length == 0) return true;
	if (data.length != 10){
		situacao = 'falsa';
	}else{
		mes = (data.substring(3,5));
	
		// verifica se o mes e valido
		if (mes < 1 || mes > 12){
			situacao = 'falsa';
		}else{
			dia = (data.substring(0,2));
			// Verifica se o dia é válido para cada mês, exceto fevereiro.
			if (dia < 1 || dia > 31 || (dia > 30 && (mes == 4 || mes == 6 || mes == 9 || mes == 11))){
				situacao = 'falsa';
			}
			// Verifica se o dia é válido para o mês de fevereiro.
			if (mes == 2 && (dia < 1 || dia > 29 || (dia > 28 && (parseInt(ano/4) != ano/4)))){
				situacao = 'falsa';
			}
		}
	}
	if (situacao == 'falsa'){
		alert('Data inválida!');
		return false;
	}
	return true;
}
function mascara_inscricaoestadual(el){
	var mydata = '';
	mydata = mydata + el.value;
	if (mydata.length == 13){
		mydata = mydata + '-';
		el.value = mydata;
	}
}
function mascara_integer(campo, teclapres){
	var tecla = 0;
    if(navigator.appName.indexOf("Netscape")!= -1){
   		tecla = teclapres.which;
   	}else{
		tecla = teclapres.keyCode;
	}
	// Falta o caractere ',' (vírgula) do teclado numérico.
	if ((tecla >= 48 && tecla <= 57) || (tecla >= 96 && tecla <= 105)
	      || tecla == 8 || tecla == 9 || tecla == 13
	      || tecla == 37 || tecla == 39
	      || tecla == 45 || tecla == 46 || tecla == 35 || tecla == 36
	      || ((tecla == 67 || tecla == 86) && teclapres.ctrlKey)){
		return true;
	}
	return false;
}
function mascara_rg(el){
	var mydata = '';
	mydata = mydata + el.value;
	if (mydata.length == 2 || mydata.length == 1){
		mydata = mydata.toUpperCase();
		el.value = mydata;
	}
	if (mydata.length == 2){
		mydata = mydata + '-';
		el.value = mydata;
	}
	if (mydata.length == 5){
		mydata = mydata + '.';
		el.value = mydata;
	}
	if (mydata.length == 9){
		mydata = mydata + '.';
		el.value = mydata;
	}
}

/**
 * Menu
 */
(function($){
	var opts = {};

	$.fn.dropdownmenu = function(settings){
		opts.settings = $.extend({}, $.fn.dropdownmenu.defaults, settings);
		return this.each(function(){
			var $this = $(this);
			$.fn.dropdownmenu.init($this, opts.settings);
		});
	};
	
	$.fn.dropdownmenu.init = function(menuroot, o){
		var ultags = jQuery("ul", menuroot);
		menuroot.addClass("menuroot");
		menuroot.children("li").addClass("menuroot");
		menuroot.children("li").children("a").addClass("menuroot");
		menuroot.children("li:last-child").addClass("ultimo");
		
		jQuery.each(ultags, function(i, elem){
			var ultag = jQuery(this);
			ultag.prev("a").addClass("submenu");
			ultag.parent("li").addClass("submenu");
			
			switch (o.childGrowDirection){
				default:
				case 2:
					if (ultag.parent().parent().get(0)==menuroot.get(0)){
						ultag.css("left", ultag.parent().width()+"px");
					}else{
						ultag.css("left", jQuery("a", ultags[i-1]).width()+"px");
						ultag.css("display", "none");
					}
					break;
				case 3:
					if (ultag.parent().parent().get(0)==menuroot.get(0)){
						ultag.css("top", ultag.parent().height()+"px");
						ultag.css("left", "0px");
					}else{
						ultag.css("left", ultag.prev("a").width()+"px");
						ultag.css("display", "none");
					}
					break;
			}
			
			ultag.parent().mouseover(function(){
				ultag.css("display", "block");
				ultag.prev("a").addClass("active");
				ultag.parent("li").addClass("active"); 
			});
			ultag.parent().mouseout(function(){
				ultag.css("display", "none");
				ultag.prev("a").removeClass("active");
				ultag.parent("li").removeClass("active"); 
			});
		});
		
		jQuery.each(ultags, function(i, elem){
			var ultag = jQuery(this);
			ultag.css("visibility", "visible");
			ultag.css("display", "none");
		});
	};
	$.fn.dropdownmenu.defaults = {
		childGrowDirection:	2
	};
})(jQuery);

/**
 * PopUp
 */
function plusPopUp(url, o){
	function _convbool(b){
		return b ? 'yes' : 'no'; 
	}
	if (o === null) o = new Array();
	o.dontreturn = o.dontreturn || false; 
	o.window = o.window || 'plusPopUp';
	o.toolbar = _convbool(o.toolbar || false); 
	o.location = _convbool(o.location || false); 
	o.status = _convbool(o.status || false); 
	o.menubar = _convbool(o.menubar || false); 
	o.scrollbars = _convbool(o.scrollbars || false); 
	o.resizable = _convbool(o.resizable || false); 
	o.width = o.width || '400';
	o.height = o.height || '300';
	o.centerScreen = o.centerScreen || false;
	if (o.centerScreen){
		o.left = (screen.width/2)-(o.width/2);
		o.top = (screen.height/2)-(o.height/2);
	}
	o.maximized = o.maximized || false;
	if (o.maximized){
		o.left = 0;
		o.top = 0;
		o.width = window.screen.availWidth;
		o.height = window.screen.availHeight; 
	}
	o.left = o.left || '100';
	o.top = o.top || '100';
	o.extra = o.extra ? ","+o.extra : '';
	
	var janela = window.open(url, o.window,
				'toolbar='+o.toolbar+
				',location='+o.location+
				',status='+o.status+
				',menubar='+o.menubar+
				',scrollbars='+o.scrollbars+
				',resizable='+o.resizable+
				',width='+o.width+
				',height='+o.height+
				',top='+o.top+
				',left='+o.left+
				o.extra);
	if (!o.dontreturn)
		return janela;
}

/* Open and Collapse form elements */
function toogleSession(elemento){
	var el = $(elemento).parent().next(); 
	while(true){
		if(el.find(".fim_form_title").length == 0) {
			el.toggle();
			el = el.next();
		}else {
			break;
		}
	}
}

/**
 * Cookies
 */
jQuery.cookie = function(name, value, options){
    if (typeof value != 'undefined'){ // name and value given, set cookie
        options = options || {};
        if (value === null){
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)){
            var date;
            if (typeof options.expires == 'number'){
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 86400000)); // 24*60*60*1000
            }else{
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    }else{ // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != ''){
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++){
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')){
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};

/**
 * Util
 */
function strtr(str, from, to) {
	var fr = '', i = 0, j = 0, lenStr = 0, lenFrom = 0;
	var tmpFrom = [], tmpTo = [], ret = '', match = false;
	
	if (typeof from === 'object'){
		this.krsort(from);
		for (fr in from){
			tmpFrom.push(fr);
			tmpTo.push(from[fr]);
		}
		from = tmpFrom;
		to = tmpTo;
	}
	
	lenStr  = str.length;
	lenFrom = from.length;
	for (i = 0; i < lenStr; i++){
		match = false;
		for (j = 0; j < lenFrom; j++){
			if (str.substr(i, from[j].length) == from[j]){
				match = true;
				i = (i + from[j].length)-1;
				break;
			}
		}
		if (false !== match){
			ret += to[j];
		}else{
			ret += str[i];
		}
	}
	return ret;
}

/**
 * Ajax dependency
 */
function makeAjaxDependency(){
	var origins = this.origins, target = this.target, paramnames = this.paramnames;
	var path = target.attr("plus_dependencypath");
	var mode = target.attr("plus_dependencymode") || "recursive";
	var showloading = target.attr("plus_dependencyshowloading") == "yes" ? true : false;
	var self = target.attr("plus_dependencyself") == "yes" ? true : false;
	var type = target.get(0).nodeName;
	
	origins.each(function(i, el){
		var $this = $(this);
		var tag = $this.get(0).nodeName.toUpperCase();
		
		if ($.inArray(tag, ["INPUT", "SELECT", "TEXTAREA"]) < 0){
			$this.unbind("DOMNodeInserted DOMNodeRemoved");
			
			var func = $.proxy(makeAjaxDependency, {origins: origins, target: target, paramnames: paramnames});
			
			(function($this, func){
				setTimeout(function(){
					$this.bind("DOMNodeInserted DOMNodeRemoved", func);
				}, 1000);
			})($this, func);
		}
	});
	
	var rdata = {}, currentval = "";
	for (i in paramnames) rdata[paramnames[i]] = origins.eq(parseInt(i)).val();
	
	if (showloading){
		if (type == 'SELECT'){
			currentval = target.attr("plus_defaultvalue") || target.val();
			target.attr("plus_defaultvalue", "");
			target.empty();
			var option = document.createElement("option");
			option.innerHTML = "Carregando...";
			option.selected = "selected";
			target.append(option);
		}else if (type == 'INPUT'){
			currentval = target.val();
			target.val("Carregando...");
		}else{
			currentval = target.html();
			target.html("Carregando...");
		}
	}
	if (self){
		rdata["_self"] = currentval;
	}
	
	$.getJSON(path, rdata, function(resposta){
		if (type == 'SELECT'){
			target.empty();
			var optionSelected = null, optionCurrent = null;
			
			$.each(resposta.data, function(i, item){
				(!item) && (item = {});
				(!item.value) && (item.value = '');
				var option = document.createElement("option");
				option.value = item.value;
				option.innerHTML = item.label;
				target.append(option);
				
				if (item.value == currentval){
					optionCurrent = option;
				}
				if (item.selected){
					optionSelected = option;
				}
			});
			
			if (optionSelected){
				optionSelected.selected = "selected";
			}else if (optionCurrent){
				optionCurrent.selected = "selected";
			}
		}else if (type == 'INPUT'){
			target.val(resposta.data);
		}else{
			target.html(resposta.data);
		}
		
		if (mode == "recursive") target.change();
	});
}

function loadAjaxDependency(){
	var onreadyfuncs = [];
	$("[plus_dependsof]").each(function(i, el){
		var $target = $(this);
		
		if ($target.data("dependencymade") == true) return;
		
		var origins = $target.attr("plus_dependsof").split(",");
		var paramnames = [];
		
		for (i in origins){
			if (origins.hasOwnProperty(i) && i != 'hasOwnProperty') {
				var o = origins[i].split("\|");
				origins[i] = document.getElementById(o[0]);
				paramnames.push(o[1] !== undefined ? o[1] : o[0]);
			}
		}
		
		var $origins = $(origins);
		var func = $.proxy(makeAjaxDependency, {origins: $origins, target: $target, paramnames: paramnames});
		$origins.each(function(i, el){
			if (!el) return;
			var $this = $(this);
			var tag = $this.get(0).nodeName.toUpperCase();
			
			if ($.inArray(tag, ["INPUT", "SELECT", "TEXTAREA"]) >= 0){
				$this.change(func);
			}else{
				$this.bind("DOMNodeInserted DOMNodeRemoved", func);
			}
		});
		if ($target.attr("plus_dependencyonready") == "yes") onreadyfuncs.push(func);
		
		$target.data("dependencymade", true);
	});
	for (i in onreadyfuncs) onreadyfuncs[i]();
}

/**
 * TinyMCE
 */
function tinymce_browser(field_name, url, type, win){
	if(type == "image"){
		tinyMCE.activeEditor.windowManager.open({
			file: plus_url+"/browser_image.php",
			width: 550,
			height: 380,
			resizable: "yes",
			inline: "yes",
			close_previous: "no"
		},{
			win: win,
			input: field_name
		});
	}else if(type == "media"){
		tinyMCE.activeEditor.windowManager.open({
			file: plus_url+"/modulos/conteudo/admin/browser_media.php",
			width: 550,
			height: 380,
			resizable: "yes",
			inline: "yes",
			close_previous: "no"
		},{
			win: win,
			input: field_name
		});
	}else if(type == "file"){
		tinyMCE.activeEditor.windowManager.open({
			file: plus_url+"/modulos/conteudo/admin/browser_files.php",
			title: "Gerenciador de imagens",
			width: 550,
			height: 380,
			resizable: "yes",
			inline: "yes",
			close_previous: "no"
		},{
			win: win,
			input: field_name
		});
	}
	return false;
}

/**
 * PlusModal
 */
function plusModal(urlmodal, action, options) {
	 if (!$.nyroModalManual) {
		 console.error('Nyro modal não encontrada. Você incluiu o arquivo?');
		 return false;
	 }
	 
	 if (typeof action == 'function') endRemove = action; 
	 else endRemove = function() { atualizaComponentes(action); };
	 
	 options = $.extend(true, {url: urlmodal, endRemove: endRemove}, options);
	 
	 return $.nyroModalManual(options);
}
 
function atualizaComponentes(actions){
	if (actions == null) return;
	for (var i in actions){
		var a = actions[i];
		// TODO: type (json/html)
		var obj = $(a.elem);
		atualizaRequest(a.url, obj);
	}
}
function atualizaRequest(url, obj, params){
	if (params === undefined) params = {};
	jQuery.get(url, params, function(r){
		var type = obj.get(0).nodeName;
		if (type == 'SELECT'){
			r = eval("("+r+")");
			var oldvalue = obj.val();
			obj.empty();
			$.each(r.data, function(i, item){
				var option = document.createElement("option");
				option.value = item.value;
				option.innerHTML = item.text;
				obj.append(option);
			});
			obj.val(oldvalue);
		}else if (type == 'INPUT'){
			r = eval("("+r+")");
			obj.val(r.data.value);
		}else{
			obj.html(r);
		}
	});
}

function PlusAtualiza(){
	this.grupos	= new Array(); // PlusAtualizaGrupo
}
PlusAtualiza.prototype = {
	addGrupo: function(nome){
		if (nome == "") return false;
		if (this.getGrupo(nome) != null) return false;
		var item = new PlusAtualizaGrupo(nome);
		this.grupos.push(item);
		return item;
	},
	getGrupo: function(nome){
		if (nome == "") return null;
		var g = this.grupos;
		for(var i in g){
			if (g[i].nome == nome) return g[i];
		}
		return null;
	},
	executeGrupo: function(nome, params){
		params = params || null;
		var grupo = this.getGrupo(nome);
		if (grupo != null){
			grupo.execute(params);
		}
	}
};

function PlusAtualizaGrupo(nome){
	this.nome	= nome;
	this.lista	= new Array(); // Object {elem, url}
}
PlusAtualizaGrupo.prototype = {
	addItem: function(action){
		this.lista.push(action);
	},
	execute: function(params){
		if (params != undefined && params != null){
			var cLista = new Array();
			for (var i in this.lista){
				var item = this.lista[i];
				var cItem = {};
				jQuery.each(item, function(j, val){
					cItem[j] = changeParams(val);
				});
				cLista.push(cItem);
			}
			atualizaComponentes(cLista);
		}else{
			atualizaComponentes(this.lista);
		}
		
		function changeParams(p){
			for (var i in params)
				p = p.replace(eval("/<@"+i+">/g"), params[i]);
			return p;
		}
	}
};

var plusAtualiza = new PlusAtualiza();

/**
 * Dialog
 */
function plusDialog(title, content, buttons){
	return $('<div>').attr("title", title).html(content).dialog({
		bgiframe: false,
		resizable: false,
		width: "auto",
		maxWidth: 500,
		modal: true,
		zIndex: 3000,
		overlay: {
			backgroundColor: '#000',
			opacity: 0.5
		},
		buttons: buttons
	});
}
function plusYNDialog(title, content, callback){
	plusDialog(title, content, {
		'Sim': function(){
			$(this).dialog('close');
			if (callback !== undefined){
				if (typeof(callback) == "function") callback();
				else window.location = callback;
			}
		},
		'Não': function(){
			$(this).dialog('close');
		}
	});
}
function plusOKDialog(title, content, callback){
	plusDialog(title, content, {
		'OK': function(){
			$(this).dialog('close');
			if (callback !== undefined){
				if (typeof(callback) == "function") callback();
				else window.location = callback;
			}
		}
	});
}

/**
 * SEO
 */
function seoTitle(title){
	title = jQuery.trim(title.toLowerCase());
	title = title.replace(/[ ]+/g, ' ');
	title = strtr(title, "áàãâéêíóôõúüçÁÀÃÂÉÊÍÓÔÕÚÜÇ '&\"-", "aaaaeeiooouucAAAAEEIOOOUUC_____");
	title = title.replace(/\W/g, '');
	title = title.replace(/_/g, '-');
	return title;
}
function removeAcento(str){
	return strtr(str, "áàãâéêíóôõúüçÁÀÃÂÉÊÍÓÔÕÚÜÇ", "aaaaeeiooouucAAAAEEIOOOUUC");;
}

/**
 * Configurações do jQuery
 */
jQuery.ajaxSetup({
	error: function(XMLHttpRequest, textStatus, errorThrown){
		console.error('Erro ao processar requisição:', textStatus, errorThrown);
	}
});

/**
 * Plus Object
 */
var plus = new Object();

plus.tema = {};
plus.modulos = {};
plus.fn = {
	is: function (type, variable) {
		switch (type) {
		case 'object':
				return typeof variable == 'object';
		case 'function':
			return jQuery.isFunction(variable);
		}
		
		console.error("Tipo inválido informado para plus.fn.is:" + type);
	},
	sanitize: function sanitize (selector) {
		if (this.is('object', selector)) return selector;
		else return selector.replace(/(\[|\]|\:|\(|\))/g, '\\$1').toString();
	},
	// @todo Retirar esta função e pegar timestamp direto do banco.
	parseDate: function parse_date(string, format) {
		format = format || 'mysql';
		switch(format) {
		case 'mysql':
		    var parts = String(string).split(/[- :]/);
		    return new Date(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5], 0);  
		default:
			console.error("Formato de data inválido informado para plus.fn.parseDate:" + type);
			return false;
		}
	},
	priceFormat: function price_format(number) {
		return number.toString().replace('.', ',');
	}
};

/**
 * @author Heitor Salazar
 * 
 * @todo adicionar validação interna dos campos
 * @uses jquery, jquery.maskedinput, jquery.ui, jquery.ui.tabs
 */
plus.form = (function (functions) {
	var defaults = {
		meioMask: {
			attr: 'data-mask',
			autoTab: false
		},
		form: {},
		validation: {
			invalidHandler: invalid,
			onsubmit: false
		},
		cep: {validation: {minlength: 9}},
		cpf: {validation: {cpf: true, minlength: 14}},
		cnpj: {validation: {cnpj: true, minlength: 18}},
		email: {validation: {email: true}},
		date: {validation: {dateITA: true}},
		integer: {validation: {integer: true}},
		money: {validation: {money: true}},
		confirmOnCancel: false,
		tabs: {select: select} /* @todo Adicionar validação na troca de abas*/
	},
	instances = {},
	submitable = false, 							// Alguma força externa está nos impedindo de enviar algum formulário?
	active = undefined,
	that = function (selector, options) {
		options = $.extend({}, defaults.form, options);
		
		// Estamos adicionando um novo formulário ou selecionando um?
		if (typeof selector == "string") {
			// Singleton aleatório
			if (instances[selector]) active = instances[selector];
			// Instanciar novo formulário
			else {
				active = instances[selector] = $(selector);
				
				if (!active.length) console.error("plus.form: Objeto '" + selector + "' não encontrado.");
				
				that.mode(options.mode || 'normal');
				active.submit(submit);
				
				// Ativando validação para poder se adicionar regras
				that.validate(options.validation);
				
				// Controlar opções
				if (options.tabs) {
					active.tabbed = true;
					active.tabs($.extend({}, defaults.tabs, options.tabs));
				}
				
				if (options.confirmOnCancel) {
					active.changed = false;
					active.one('change', change);
				}
				
				// Checar posição dos rótulos
				if (options.captions) {
					switch (options.captions.position) {
						case "inside":
							active.focusin(focusin).focusout(focusout);
							break;
					}
				}
				
				// Inicializar integração com nTable
				$(selector + ' .plusNTableBreakTitle').click(function(e){
					plus.table.fold(this, e);
				});
				
				$(selector + ' .plusNTableBreakTitle').each(function(){
					plus.table.fold(this);
				});
			}
			
			return that; // Perminte o encadeamento de métodos XD
		} else {
			/**
			 * @todo Recepção genérica de muitos campos ao mesmo tempo e de
			 *       formulários
			 */
			console.warn("plus.form: Não implementado ainda: Recepção genérica de muitos campos ao mesmo tempo e de formulários.");
		}
	};
	
	// Private
	/// Formatação de inputs
	function price(selector, options) {
		var input = $(functions.sanitize(selector));
		
		input.priceFormat(options);
		
		// Para concertar um bug do meio mask que remove o valor dos elementos
		// temos que setar novamente o valor dos elementos.
		if (!input.val() && input.attr("data-label")) input.val(input.attr("data-label"));
		return that;
	}
	
	function mask(selector, options) {
		var input = $(functions.sanitize(selector));
		
		// Primeiro verificamos se a mascara foi sobrescrita para este campo
		// depois tentamos utilizar a mascara default do meioMask
		input.setMask(defaults[options.mask] && options.mask || $.extend({}, defaults.meioMask, options));
		
		// Para concertar um bug do meio mask que remove o valor dos elementos
		// temos que setar novamente o valor dos elementos.
		if (!input.val() && input.attr("data-label")) input.val(input.attr("data-label"));
		
		return that;
	}
	
	/// Validação de inputs
	that.validate = function validate(options) {
		if (options) active.validate($.extend(true, {}, defaults.validation, options));
		else if (options === undefined) return active.validate().form();
		return that;
	};
	
	that.reset = function reset() {
		return active.validate().resetForm();
	};
	
	// Eventos
	/// Submiter formulário de acordo com método pre selecionado
	function submit(event) {	
		var form = $(event.target);
		submitable = true;
		that('#' + form.attr('id')); 	// Ativa instância atual;
		
		// Formulário foi modificado, mas é para ser enviado
		active.changed = false;
		
		switch (active.mode) {
			case 'normal': 
				return form.validate().form();		// Formulário é valido?
			case 'ajax':
				// @todo adicionar função no complete do envio do formulário
				if (!form.validate().form()) return false;
				$[form.attr('method') || 'post'](form.attr('action'), form.serialize());
				return false;
			case 'unsubmittable':
				form.validate().form();
				return false;
		}
	};
	
	/// Formulário tentado ser enviado invalidamente
	function invalid (event, validator) {
		console.log('executando invalido');
		var errors = validator.errorList,
			error = undefined, tab = undefined,
			form = $(event.currentTarget);

		that('#' + form.attr('id')); 	// Ativa instância atual
		
		// Se existir abas, seleciona a aba na qual ocorreu o primeiro erro
		if (active.tabbed) {
			error = errors[0];
			fieldset = $(error.element).parents('fieldset');
			tab = parseInt(fieldset.attr('data-tab'));
			
			// Caso aba não selecionada, seleciona aba
			if (!isNaN(tab) && tab != active.tabs('option', 'selected')) active.tabs('select', tab);
		}
		
		// Chama função personalizada pelo usuário
		that.invalid[active.selector] && that.invalid[active.selector].call(this, event, validator);
	}
	
	/// Confirmação de alterações do formulário
	function beforeunload(event) {
		// Algun outro formulário foi modificado?
		for (selector in instances) {
			if (instances[selector].changed) submitable = 'changed';
		}
		
		if (submitable == 'changed') return "Descartar alterações?";
	}
	
	/// Rastrear mudanças no formulário
	function change(event) {
		var form = $(event.currentTarget);
		that('#' + form.attr('id'));
		
		active.changed = true;
	}
	
	/// Ao selecionar uma aba, modificar localização do documento.
	/// @todo ao voltar e avançar no navegador trocar de aba.
	function select (event, ui) {
		document.location = ui.tab.getAttribute('href');
	}

	
	// Para sumir os labels quando o usuário clicar no campo 
	// @todo checar também os valores padrão dos campos. (data-default)
	function focusin(event) {
		var element = undefined, label = undefined;
		
		switch (event.target.nodeName) {
			case "TEXTAREA":
				element = $(event.target);
				label = element.attr("data-label");
				if (label && label == element.text()) element.text("");
			case "INPUT":
			case "SELECT":
				element = $(event.target);
				label = element.attr("data-label");
				if (label && label == element.val()) element.val("");
				break;
		};
	}
	
	// Para fazer os labels aparecerem quando o usuario sair do campo 
	// @todo checar também os valores padrão dos campos. (data-default)
	function focusout(event) {
		var element = undefined;
		
		switch (event.target.nodeName) {
			case "TEXTAREA":
				element = $(event.target);
				if (element.attr("data-label") && !element.text()) element.text(element.attr("data-label"));
				break;
			case "INPUT":
			case "SELECT":
				element = $(event.target);
				if (element.attr("data-label") && !element.val()) element.val(element.attr("data-label"));
				break;
		};
	}
	
	// Checar se o formulario foi removido
	// @todo adicionar suporte a seletores diferentes de id
    function removed_msie(event) {
        var target = event.target;
        
        if (target.className == "wrapper") {
        	var forms = $(target).data("plus.forms");
        	removed.remove--;
        	
        	for (var i in forms) {
        		var selector = '#' + forms[i];
	        	
	        	if (instances[selector]) {
	                delete instances[selector];
	            }
        	};
        	
        	// Todos formulários removidos, não precisamos nos preocupar
    		// mais com remoções
    		if (!removed.remove) $wnd.unbind('DOMNodeRemoved', removed_msie);

        }
    }
    
    // @todo adicionar suporte a seletores diferentes de id
    function removed(event) {
        var target = event.target;
        
        if (target.nodeName.toUpperCase() == 'FORM') {
        	removed.remove--;
        	var selector = '#' + target.getAttribute('id');
        	
        	if (instances[selector]) {
                delete instances[selector];
                // Todos formulários removidos, não precisamos nos preocupar
				// mais com remoções
                if (!removed.remove) $wnd.unbind('DOMNodeRemoved', removed);
            }
        }
    }
	
	// Public
	// Comandos do formulário
	/// Comandos de abas
	that.next = function next () {
		if (active.tabbed) active.tabs('select', active.tabs('option', 'selected') + 1);
		return that;
	};
	
	that.previous = function previous () {
		if (active.tabbed) active.tabs('select', active.tabs('option', 'selected') - 1);
		return that;
	};
	
	// Deletando formulário
	that.remove = function remove_form_instance(selector) {
		return delete instances['#' + selector];
	}
	
	/// Definição de modo
	that.mode = function form_mode (mode) {
		switch (mode) {
			case 'unsubmittable': 
				submitable = false;
				break;
			case 'normal':
			case 'ajax': 
				break;
			default:
				console.error("plus.form: Modo inválido especificado para o formulário:", mode);
				return false;
		}
		
		active.mode = mode;
		return that;
	};
	
	/// Adicionar regras de validação
	that.rules = function form_rule (method, options) {
		var element = undefined;
		for (name in options) {
			element = active.find('[name=' + name + ']');
			if (element.length) element.rules(method, options[name]);
			else console.warn('plus.form.rules: Elemento não encontrado para adicionar regra: ' + name);
		}
		
		return that;
	};
	
	that.hasField = function form_has_field (name) {
		return active.find('[name=' + name + ']').length !== 0; 
	};
	
	// Bindagem de formatação e validação
	// @todo:
	// that.hora = hora;
	jQuery.each(('integer phone cep cpf time cnpj email text date').split(' '), function (i, name) {
			that[name] = function (selector, options) {
				var input = $(functions.sanitize(selector)),
					options = $.extend(true, {}, defaults[name], options);
				
				options.validation && input.rules('add', options.validation);
				if (options.mask) input = mask(input, options);
				return input;
			};
		}
	);
	
	jQuery.each(('money float').split(' '), function (i, name) {
		that[name] = function (selector, options) {
			var input = $(functions.sanitize(selector)),
				options = $.extend(true, {}, defaults[name], options);
			
			options.validation && input.rules('add', options.validation);
			options.mask && price(input, options);
			return input;
		};
	});

	that.calendar = function calendar (selector, options) {
		var input = $(functions.sanitize(selector)),
			options = $.extend(true, {selectCharsOnFocus: false}, defaults.date, options);
		
		if (options.validation)	input.datepicker(options).rules('add', options.validation);
		else input.datepicker(options);
		
		return mask(input, options);
	};
	
	that.submit = function add_submit_callback(callback) {
		return active && active.submit(callback);
	};
	
	that.invalid = function add_invalid_submit_handler(handler) {
		that.invalid[active.selector] = handler;
		return active;
	};
	
	// Inicialização
	function initialize() {
		$wnd.bind('beforeunload', beforeunload);			// Adiciona checagem de confirmação
		
		// TODO Setar corretamente locale do plus
		// $.datepicker.setDefaults($.datepicker.regional['pt-BR']);

		if ($.validator) {
			// Todo, escrever mensagens defaults
			//		$.validator.messages.accept =
			//		$.validator.messages.creditcard =
			//		$.validator.messages.date =
			//		$.validator.messages.dateISO =
			//		$.validator.messages.digits = 
			$.validator.messages.email = "Digite um email válido.";
			//		$.validator.messages.equalTo = 
			//		$.validator.messages.number = 
			//		$.validator.messages.remote = 
			$.validator.messages.required = "Campo obrigatório.";
			//		$.validator.messages.url =
		}
		
		// Verifica carregamento do meio mask
		if ($.mask) $.extend(true, defaults, $.mask.masks);		// Adiciona opções de máscara aos defaults
		else {
			// Substitui função de mascara por aviso de erro
			mask = function () {console.error("plus.form.mask: Tentativa de utilizar máscaras sem incluir o meio mask.");};
		}
		
		// Verifica carregamento dos validadores
		if ($.fn && !$.fn.validate) {
			$.fn.validate = function () {console.error('plus.form.validate: Tentativa de utilizar validação sem incluir jquery.validate!');};
		}
		
		// Integra formulário ao nyroModal
		if ($.nyroModalSettings) {
			if (!$.fn.nyroModal.settings.handleError) $.fn.nyroModal.settings.handleError = console.error;
			if ($.fn.nyroModal.settings.endFillContent) console.warn('plus.form.initialize: Função definida após mostrar conteudo do nyro modal. Modais multiplas com formulário não funcionarão corretamente.');
			
			if ($.browser.msie && $.browser.version < 9) {
				// Reescrevamos o método de remover do jquery
				plus.fn.remove = jQuery.fn.remove;
				jQuery.fn.remove = function (selector) {
					// -------------------------------------------- //
					// If this is IE, then manually trigger the DOM
					// node removed event on the given element.
					if (jQuery.browser.msie) {
						jQuery( this ).each(function(){
							jQuery( this ).trigger({
								type: "DOMNodeRemoved"
							});
						});
					}
					// -------------------------------------------- //
	
					return plus.fn.remove.call(this, selector);
				};

				$.nyroModalSettings({
					endFillContent: function bind_removed_function(modal, settings) {
						var forms = modal.wrapper.find('form');
						var attached = modal.wrapper.data('plus.forms') || [];
	
						// Adiciona checagem de remoção de formulário
						if (forms.length) {
							forms.each (function (i, element) {
								var id = element.getAttribute('id');
								if (id) attached.push(id);
							});
		
							modal.wrapper.data('plus.forms', attached);
		
							removed.remove = forms.length;
							$wnd.bind('DOMNodeRemoved', removed_msie);
						}
					}
				});

			} else {

				$.extend($.fn.nyroModal.settings, {
					endFillContent: function bind_removed_function(modal, settings) {
						var forms = modal.wrapper.find('form');
	
						// Adiciona checagem de remoção de formulário
						if (forms.length) {
							removed.remove = forms.length;
							$wnd.bind('DOMNodeRemoved', removed);
						}
					}
				});
			}
		}
	}
	
	that.category = function(selector, options){
		var input = $(functions.sanitize(selector));
//		options = $.extend(true, {}, defaults[name], options);
		
		input.find(".plusSelectCategoryCheck").each(function(){
			var check = $(this);
			check.data("categoriapai", input.find(".plusSelectCategoryCheck[data-cdcategoria="+check.attr("data-cdcategoriapai")+"]"));
			var item = check.closest(".plusSelectCategoryItem");
			item.attr("data-nivel", nivel = check.attr("data-nivel"));
			
			var opts = "";
			if (nivel > 0) opts += '<span class="categoryOpt">&#x25b2;<input type="checkbox" class="checkboxButton optP" /></span>';
			if (nivel < item.next().find(".plusSelectCategoryCheck").attr("data-nivel")) opts += ' <span class="categoryOpt">&#x25bc;<input type="checkbox" class="checkboxButton optC" /></span>';
			check.nextAll(".plusSelectCategoryOpt").html(opts);
		});
		
		input.find(".plusSelectCategoryItem").hover(function(e){
			var target = $(e.currentTarget);
			target.addClass("hover");
			refreshOpts(target.find(".plusSelectCategoryCheck"));
		},function(e){
			var target = $(e.currentTarget);
			target.removeClass("hover");
		});
		
		input.click(function(e){
			var target = $(e.target);
			if (target.attr("type") == "checkbox"){
				if (target.hasClass("optP")){
					check = target.closest(".plusSelectCategoryItem").find(".plusSelectCategoryCheck");
					markSeveral(check, "parents");
				}else if (target.hasClass("optC")){
					check = target.closest(".plusSelectCategoryItem").find(".plusSelectCategoryCheck");
					markSeveral(check, "children");
				}else{
					check = target;
				}
				refreshOpts(check);
			}else if(target.hasClass("plusSelectCategoryItem")){
				target.find(".plusSelectCategoryCheck").click();
			}else if(target.hasClass("categoryOpt")){
				target.find("input:checkbox").click();
			}
		});
		
		function refreshOpts(check){
			item = check.closest(".plusSelectCategoryItem");
			var checkP = item.find("input:checkbox.optP");
			var checkC = item.find("input:checkbox.optC");
			
			if (overallAction(overall(getParents(check), check), check)) checkP.attr("checked", "checked");
			else checkP.removeAttr("checked");
			
			if (overallAction(overall(getChildren(check), check), check)) checkC.attr("checked", "checked");
			else checkC.removeAttr("checked");
		}
		
		function markSeveral(check, dir){
			if (dir == "parents"){
				checks = getParents(check);
			}else if (dir == "children"){
				checks = getChildren(check);
			}else{
				return;
			}
			
			if (overallAction(overall(checks, check), check)){
				checks.attr("checked", "checked");
				check.attr("checked", "checked");
			}else{
				checks.removeAttr("checked");
				check.removeAttr("checked");
			}
		}
		
		function overallAction(o, check){
			if (o == 0) return true;
			else if (o == 1) return false;
			return !check.is(":checked");
		}
		
		function overall(checks, check){
			var checkr = false;
			var check1 = check.is(":checked");
			
			checks.each(function(){
				if ($(this).is(":checked") != check1){
					checkr = true;
					return false;
				}
			});
			
			if (checkr) return 2;
			return check1 ? 1 : 0;
		}
		
		function getParents(check, andSelf){
			if (andSelf === undefined) andSelf = false;
			var checks = andSelf ? $(check) : $();
			while (check = check.data("categoriapai")){
				checks = checks.add(check);
			}
			return checks;
		}
		
		function getChildren(check, andSelf){
			if (andSelf === undefined) andSelf = false;
			var nivel = check.attr("data-nivel");
			var divs = check.closest(".plusSelectCategoryItem").nextUntil("div[data-nivel='"+nivel+"']").filter(function(){
				return $(this).attr("data-nivel") > nivel;
			});
			return andSelf ? check.add(divs.find(".plusSelectCategoryCheck")) : divs.find(".plusSelectCategoryCheck");
		}
		
		return input;
	};
	
	$(initialize);
	 
	return that;
})(plus.fn);

plus.table = (function(){
	var that = function(){
		
		return that;
	};
	
	that.fold = function(elemento, e){
		if (e !== undefined){
			if (e.target.nodeName == "A"){
				return;
			}
		}
		var start = $(elemento);
		var closed = start.hasClass("plusNTableBreakClosed");
		
		jQuery.each(start.nextAll(), function(i, val){
			if ($(this).hasClass("plusNTableBreakEnd")) return false;
			if (closed) $(this).show();
			else $(this).hide();
		});
		
		if (closed){
			start.removeClass("plusNTableBreakClosed");
			start.find("div.plusNTableBreakLinks").show();
		}else{
			start.addClass("plusNTableBreakClosed");
			start.find("div.plusNTableBreakLinks").hide();
		}
	};
	
	that.checkAll = function(table){
		table = $("#"+table);
		var checks = $(".plusNTableCheck", table);
		var checkall = table.find(".plusNTableCheckAll");
		
		if (checkall.is(":checked"))
			checks.attr("checked", "checked");
		else
			checks.removeAttr("checked");
		
		var o = getCheckOverall(table);
		
		if (o == 0 || o == 1){
			checkall.css("opacity", 1);
		}else{
			checkall.css("opacity", 0.6);
		}
	};
	
	that.check = function(table, check){
		table = $("#"+table);
		var checkall = table.find(".plusNTableCheckAll");
		
		var o = getCheckOverall(table);
		if (o == 0){
			checkall.removeAttr("checked");
			checkall.css("opacity", 1);
		}else if (o == 1){
			checkall.attr("checked", "checked");
			checkall.css("opacity", 1);
		}else{
			checkall.attr("checked", "checked");
			checkall.css("opacity", 0.6);
		}
	};
	
	function getCheckOverall(table){
		var checks = $(".plusNTableCheck", table);
		var checkr = checks.filter(":checked");
		
		if (checkr.length == 0){
			return 0;
		}else if (checkr.length == checks.length){
			return 1;
		}else{
			return 2;
		}
	}
	
	return that;
})();

function Timer(){};
Timer.prototype = {
	list: new Array,
	
	out: function(name, time, func){
		this.clear(name);
		var o = setTimeout(func, time);
		this.list[name] = {o: o, type: "out"};
		return o;
	},
	interval: function(name, time, func, callnow){
		callnow = (callnow === undefined) ? false : callnow;
		this.clear(name);
		if (callnow) func();
		var o = setInterval(func, time);
		this.list[name] = {o: o, type: "interval"};
		return o;
	},
	clear: function(name){
		var item = this.list[name];
		if (item === undefined) return false;
		
		if (item.type == "out"){
			clearTimeout(item.o);
			delete this.list[name];
		}else if (item.type == "interval"){
			clearInterval(item.o);
			delete this.list[name];
		}
		return true;
	}
};
plus.timer = new Timer;

// Gerenciador de abas
plus.tabs = {
	init: function(){
		$(".plusTabs").each(function(){
			plus.tabs.make($(this));
		});
	},
	make: function(plustab){
		var tabs = plustab.children(".tabTabs").children(".tabItem");
		var contents = plustab.children(".tabContents").children(".tabContent");
		
		tabs.each(function(){
			var tab = $(this);
			var tabitem = tab.attr("plus_tabitem");
			var obj = {
				tabs: tabs,
				contents: contents,
				tab: tab,
				tabitem: tabitem,
				content: contents.filter("[plus_tabitem="+tabitem+"]"),
				path: tab.attr("plus_tabitempath") || ""
			};
			tab.click($.proxy(plus.tabs.select, obj));
		});
		
		tabs.filter(".selected:first").click();
	},
	select: function(){
		this.tabs.removeClass("selected");
		this.tab.addClass("selected");
		this.contents.removeClass("selected").hide();
		this.content.addClass("selected").show();
		
		if (this.path != ""){
			atualizaRequest(this.path, this.content);
		}
	}
};

// Tocador de mídia
(function(parent){
	function Player(){
		var that = {
			ctrl: null
		};
		
		var displayList = {}, readyCallback = null;
		
		that.init = function(){
			top.window.playerInterfaceInit();
		};
		
		that.playerReady = function(ctrl){
			that.ctrl = ctrl;
			that.ctrl.updateDisplay = updateDisplay;
			
			switch (top.window.autoload.load){
				case "music":
					that.ctrl.loadMusic(top.window.autoload.url, top.window.autoload.text);
					break;
				case "list":
					that.ctrl.loadList(ctrl.prop.autostart);
					break;
				case "url":
					var url = top.window.autoload.url;
					if (url.indexOf(";") != -1){
						url = url.split(";", 2);
						url = {file: top.window.autoload.url, type: "sound", duration: 99999999};
					}else{
						url = top.window.autoload.url;
					}
					
					if (top.window.autoload.channel !== undefined) that.ctrl.prop.channel = top.window.autoload.channel;
					if (top.window.autoload.updatetrack !== undefined) that.ctrl.prop.updatetrack = top.window.autoload.updatetrack;
					
					that.ctrl.loadURL(url, ctrl.prop.autostart);
					that.ctrl.updateTrack();
					break;
			}
			top.window.autoload.load = false;
			
			that.ctrl.display();
			
			if (readyCallback) readyCallback();
		};
		
		that.setDisplay = function(name, func){
			displayList[name] = func;
		};
		
		function updateDisplay(name){
			if (name == undefined || name == null){
				for (var display in displayList){
					$.proxy(displayList[display], that.ctrl)();
				}
			}else if (displayList[name]){
				$.proxy(displayList[name], that.ctrl)();
			}
		}
		
		that.ready = function(func){
			readyCallback = func;
		};
		
		return that;
	}
	
	parent.player = Player();
})(plus);

//plus.player = {
//	ctrl: null,
//	displayList: {},
//	onReady: $.noop,
//	
//	init: function(){
//		top.window.playerInterfaceInit();
//	},
//	ready: function(ctrl){
//		plus.player.ctrl = ctrl;
//		plus.player.ctrl.updateDisplay = plus.player.updateDisplay;
//		
//		switch (top.window.autoload.load){
//			case "music":
//				plus.player.ctrl.loadMusic(top.window.autoload.url, top.window.autoload.text);
//				break;
//			case "list":
//				plus.player.ctrl.loadList(ctrl.prop.autostart);
//				break;
//			case "url":
//				var url = top.window.autoload.url;
//				if (url.indexOf(";") != -1){
//					url = url.split(";", 2);
//					url = {file: top.window.autoload.url, type: "sound", duration: 99999999};
//				}else{
//					url = top.window.autoload.url;
//				}
//				plus.player.ctrl.loadURL(url, ctrl.prop.autostart);
//				break;
//		}
//		top.window.autoload.load = false;
//		
//		plus.player.ctrl.display();
//	},
//	setDisplay: function(name, func){
//		plus.player.displayList[name] = func;
//	},
//	updateDisplay: function(name){
//		if (name == undefined || name == null) {
//			for (var display in plus.player.displayList){
//				$.proxy(plus.player.displayList[display], plus.player.ctrl)();
//			}
//		} else if (plus.player.displayList[name]){
//			$.proxy(plus.player.displayList[name], plus.player.ctrl)();
//		}
//	}
//};

// Caret
(function(k,e,i,j){k.fn.caret=function(b,l){var a,c,f=this[0],d=k.browser.msie;if(typeof b==="object"&&typeof b.start==="number"&&typeof b.end==="number"){a=b.start;c=b.end}else if(typeof b==="number"&&typeof l==="number"){a=b;c=l}else if(typeof b==="string")if((a=f.value.indexOf(b))>-1)c=a+b[e];else a=null;else if(Object.prototype.toString.call(b)==="[object RegExp]"){b=b.exec(f.value);if(b!=null){a=b.index;c=a+b[0][e]}}if(typeof a!="undefined"){if(d){d=this[0].createTextRange();d.collapse(true);
d.moveStart("character",a);d.moveEnd("character",c-a);d.select()}else{this[0].selectionStart=a;this[0].selectionEnd=c}this[0].focus();return this}else{if(d){c=document.selection;if(this[0].tagName.toLowerCase()!="textarea"){d=this.val();a=c[i]()[j]();a.moveEnd("character",d[e]);var g=a.text==""?d[e]:d.lastIndexOf(a.text);a=c[i]()[j]();a.moveStart("character",-d[e]);var h=a.text[e]}else{a=c[i]();c=a[j]();c.moveToElementText(this[0]);c.setEndPoint("EndToEnd",a);g=c.text[e]-a.text[e];h=g+a.text[e]}}else{g=
f.selectionStart;h=f.selectionEnd}a=f.value.substring(g,h);return{start:g,end:h,text:a,replace:function(m){return f.value.substring(0,g)+m+f.value.substring(h,f.value[e])}}}}})(jQuery,"length","createRange","duplicate");

// Vamos inicializar o javascript gente!
$(function(){
	loadAjaxDependency();
	plus.tabs.init();
	
	// Adiciona funções de formatação quando existe
	if ($.mask){
		plus.format = function(){
			return $.mask.string.apply($.mask, arguments);
		};
	}
	
	setTimeout(function(){
		if (jQuery.nyroModalSettings != undefined){
			jQuery.nyroModalSettings({endShowContent: loadAjaxDependency});
		}
	}, 100);
});
