﻿/// <reference path="jquery-1.4.1-vsdoc.js" />
/**********************************************************************
    Os seguintes arquivos devem estar inclusos nas páginas
        · jQuery 1.4
        . jQueryUI 1.8.4
************************************************************************/

var Jqr = function(jQuery)
{
	/* se o JSON não estiver definido, carrega de um arquivo externo. */
	if(!window.JSON)
	{
	    jQuery.getScript("includes/json2.js");
	}
	
	
	/*
	 * Metodo:   	desabilitaForm
	 * Objetivo: 	Evita um formulário de dar post na página
	 * Modo de uso:	$(DOM).desabilitaForm()
	 * Observacao:	-
	 */
	jQuery.fn.desabilitaForm = function()
	{
	    jQuery(this).each(function(i,obj)
	    {
	        jQuery(obj).submit(function() { return false; });
	    });
	    return this;
	};
	
	/*
	 * Metodo:   	centro
	 * Objetivo: 	Centraliza um elemento na tela.
	 * Modo de uso:	$(DOM).centro()
	 * Observacao:	-
	 */
	jQuery.fn.centro = function(tipo)
	{
		var e = this;
		
		/* se o tamanho da janela for alterada, redefine. */
		$(window).resize(centraliza_elemento);
		
		tipo = tipo || "center"
		
		switch(tipo)
		{
		    case "left": centraliza_elemento_left(); break;
		    case "center": centraliza_elemento();
		}

		function centraliza_elemento(){
			e.offset(
			{
				left:($(document).width() - e.width() )/2,
				top:($(document).height()-(e.height()+130))/2
			});
		};
		function centraliza_elemento_left(){
			e.offset(
			{
				left:($(document).width() - e.width() )/2
			});
		};
		return e;
	};
	
	/*
	 * Metodo:   	msgAviso
	 * Objetivo: 	Mostra uma dica no evento fucus.
	 * Modo de uso:	$(DOM).msgAviso([mensagem])
	 * Observacao:	Se não for passado parâmetro, mostra conforme escrito na tag title do elemento.
	 */
	jQuery.fn.msgAviso = function(msg, css)
	{
		var _css = 
		{
			backgroundColor:"#444",
			border:"1px solid #222",
			padding:"3px",
			color:"#fff",
			font:"10px tahoma",
			marginLeft:"10px",
			position:"absolute",
			minWidth:"150px"
		};
		
		jQuery.extend(_css, css || msg);
		var _div = $("<div></div>").css(_css).fadeTo(0,0).hide();
		var d = $("<div></div>");
		this.focusin(function()
		{
			var _this = $(this).addClass("avisos");
			var _msg  = (typeof(msg)=="object") ? _this.attr("title") : msg || _this.attr("title");
			var _pos  = {top:_this.offset()["top"],left:_this.offset()["left"] + _this.width()};
			
			d = _div.clone().offset(_pos).html(_msg);
			if($.trim(_msg) != "") $("body").append(d.fadeTo("normal",1));
		});
		this.focusout(function()
		{
			$(this).removeClass("avisos"); 
			$(d).fadeTo("normal", 0, function(){ $(this).remove(); });
		});
		$(window).resize(function(){ d.remove(); });
	};
	
	// monta um combo
	jQuery.fn.montaCombo = function(cf)
	{
		var c = 
		{
		    dados:[],
		    id:null,
		    nome:null,
		    selecionado:null,
		    msgPrimeiroItem:null,
		    criaHidden:true
		};
		
		jQuery.extend(c, cf);
		
		var o = $("<option></option>");
		var _this = this.html("");
		var a = c.dados || [];

		var inp = $("<input type='hidden'></input>");
        var id = _this.attr("id");
        if(c.criaHidden && a.length == 0)
        {
            _this.parent().append(inp.val("").attr("id",id));
            _this.remove();
            $("label[for*="+id+"]").hide();
        }
		else if(c.criaHidden && a.length == 1)
		{
		    var nomes = [], v, n;
			for(t in a[0]){ nomes.push(t); }
		    
		    v = (typeof(a[0]) == "object") ? a[0][c.id || nomes[0]] : a[0];
			n = (typeof(a[0]) == "object") ? a[0][c.nome || nomes[1] || nomes[0]] : a[0]; 
		    
		    _this.parent().append(inp.val(v).attr({"id":id,title:n}));
		    _this.remove();
		    $("label[for*="+id+"]").hide();
		}
		if(c.msgPrimeiroItem!=null)
		{ 
		    var vl = {}
            vl["id"] = "";
            vl[c.nome || "nome"] = c.msgPrimeiroItem;
		    a.unshift(vl);
		}
		for(var i=0;i<a.length;i++)
		{
			var nomes = [], v, n;
			for(t in a[i]){ nomes.push(t); }
			
			v = (typeof(a[i]) == "object") ? a[i][c.id || nomes[0]] : a[i];
			v = (c.msgPrimeiroItem!=null && i == 0) ? "" : v; 
			n = (typeof(a[i]) == "object") ? a[i][c.nome || nomes[1] || nomes[0]] : a[i];
			var atual = o.clone().attr({value:v,selected:(c.selecionado==v)}).html(n);
			_this.append(atual);
		}
		
		return _this;

	};
	
	// faz uma consulta a um webservice
	jQuery.webService = function(cfg)
	{
		var _cfg = 
		{
			url:document.URL,
			pars: "{}",
			showLoading: false,
			callback: function() { },
			callbackErro: function(xml, status)
			{
				if ((status == 'error') || (status == ""))
				{
					try {
						var json = eval('(' + xml.responseText + ')');
						alert(json.Message);
					}
					catch (e) { }
				} 
				else if (status == "parsererror") { alert("Erro no formato do JSON."); }
				else { alert(status); }
			}
		};
		jQuery.extend(_cfg, cfg);
		_cfg.pars = typeof(_cfg.pars) == "string" ? _cfg.pars : JSON ? JSON.stringify(_cfg.pars) : "{}";

		jQuery.ajax(
		{
	        data: _cfg.pars,
    	    url: _cfg.url,
	        type: "POST",
	        contentType: "application/json; charset=utf-8",
	        dataType: 'json',
	        cache: false,
	        global: _cfg.showLoading,
	        success: _cfg.callback,
	        error: _cfg.callbackErro,
			beforeSend: function(xml) {
				if (!this.data) xml.setRequestHeader("Content-Type", "application/json;utf-8");
			}
	    });

	    return this;
	};
	
	jQuery.fn.validacao = function(arrFuncoes)
	{
	    jQuery(this).each(function(i,obj)
	    {
	        obj.validacao = [];
	        if(typeof(arrFuncoes) == "function") arrFuncoes = [arrFuncoes];
	        try
	        {
	            for(var i=0;i<arrFuncoes.length;i++)
	            {
	                obj.validacao.push(arrFuncoes[i]);
	            }
	        }
	        catch(ex)
	        {
	            obj.validacao.push(arrFuncoes);
	        }
	    });
	    
	    return this;
	};
	
	jQuery.fn.valida = function()
	{
	    var r = [];
	    var valido = true;
	    jQuery(this).each(function(i,obj)
	    {
	        if(obj.validacao)
	        {
                for(var iFun=0;iFun<obj.validacao.length;iFun++)
                {
                    var o = obj.validacao[iFun](obj);
                    r.push(o);
                    if(!o.valido){ valido = false };
                }
            }
	    });
	    return {valido:valido,retorno:r};
	};
	
	
	jQuery.fn.msgValidacao = function(msg)
	{
	    var formataMensagens = function(arr)
	    {
	        var r = "";
	        for(var a=0;a<arr.length;a++){
	            jQuery(arr[a].obj).removeClass("erro");
	            if(!arr[a].valido){ 
	                r = r + arr[a].msg + "\n";
	                jQuery(arr[a].obj).addClass("erro");
	            }
	        }
	        return r;
	    };
	    var v = this.valida();
	    var m = formataMensagens(v.retorno);
	    if(!v.valido) alert(msg || m);
	    return v.valido;
	};
	
    jQuery.fnValida = 
    {
        txt_vazio:function(ms)
        {
            var m = ms || "Preencha o texto.";
            var f = function(obj)
            {
                if(jQuery.trim(jQuery(obj).val())=="")
                {
                    return {valido:false,msg:m,obj:obj};
                }
                else
                {
                    return {valido:true,msg:"",obj:obj};
                }
            };
            return f;
        },
        txt_maximo:function(tm, ms)
        {
            var m = ms || "O texto deve ter no máximo "+tm+" caracteres.";
            var f = function(obj)
            {
                if(jQuery.trim(jQuery(obj).val()).length>tm)
                {
                    return {valido:false,msg:m,obj:obj};
                }
                else
                {
                    return {valido:true,msg:"",obj:obj};
                }
            };
            return f;
        },
        txt_minimo:function(tm, ms)
        {
            var m = ms || "O texto deve ter no mínimo "+tm+" caracteres.";
            var f = function(obj)
            {
                if(jQuery.trim(jQuery(obj).val()).length<tm)
                {
                    return {valido:false,msg:m,obj:obj};
                }
                else
                {
                    return {valido:true,msg:"",obj:obj};
                }
            };
            return f;
        }
    };
    
    
    
    jQuery.fn.tabela = function(arr, format, col)
    {
    
        var formata = function(arr, obj)
        {
            var r = [];
            jQuery(arr).each(function(i,v)
            {
                var o = {}
                for(var i = 0;i<obj.length;i++)
                {
                    o[obj[i].atual] = v[obj[i].base];
                }
                r.push(o);
            });
            return r;
        };
        if(col)
        {
            arr = formata(arr, col || []);
        }
        var config = 
        {
            linha:{sim:"#C6E2FF",nao:"#FFFFFF"},
            colunas:[{"width":"130px","height":"25px","text-align":"center","padding":"3px"}],
            cabecalho:{backgroundColor:"#4F94CD", color:"#FFFFFF"},
            tabela:{border:"1px solid #4F94CD"}
        };
        jQuery.extend(config, format);

        if(arr.length == 0) return "";
        
        var tabela = $("<table><thead><tr></tr></thead><tbody></tbody></table>");
        var tr = $("<tr></tr>");
        var td = $("<td></td>");
        
        var preenchelinhas = function(i,v)
        {
            var l = tr.clone();
            for(var t in v){l.append(td.clone().html(v[t]));}
            tabela.children("tbody").append(l);
        };
        
        var click_cabecalho = function(e) { };
        
        // preenche a tabela    
        for(var c in arr[0]){tabela.children("thead").children("tr").append(td.clone().html(c).click(click_cabecalho));}
        $(arr).each(preenchelinhas);

        // recupera as linhas
        var thb = tabela.children("thead, tbody").children("tr");
        var tb = tabela.children("tbody").children("tr");

        // cores das linhas
        try{for(var i=0;i<tb.length;i++){$(tb[i]).css("background-color",(i%2 == 0) ? config.linha.nao : config.linha.sim);}}
        catch(ex) { }
        
        // formata a tabela
        for(var i=0;i<thb.length;i++)
        {
            $(thb[i].cells).each(function(i,v)
            {
                if(config.colunas[i]) $(v).css(config.colunas[i]);
                else $(v).css(config.colunas[0]);
            });
        }
        
        // cor do cabeçalho
        tabela.children("thead").children("tr").css(config.cabecalho);
        return this.html(tabela.css(config.tabela));
    };
    
    
    jQuery.trataData = function(d)
    {
        var digitos = function(v)
        { 
            return (v<10)?"0"+v:v; 
        };
        var formata = function(objData)
        {
            if(typeof(objData) == "object")
            {
                var di = digitos(d.getDate());
                var me = digitos(d.getMonth()+1);
                var an = d.getFullYear();
                var hr = digitos(d.getHours());
                var mn = digitos(d.getMinutes());
                return  di + "/" + me + "/" + an + " " + hr + ":"+ mn;
            }
            else
            {
                return "";
            }
        };
        
        try
        {
            d = eval("( new "+ String(d).replace(/(\/)/gi, "") + ")" );
        }
        catch(ex){ return d; }
        
        return  formata(d);
    };
    
    jQuery.alert = function (msg, tipo, titulo, callback)
    {
        // erro, sucesso, atencao
        var t = tipo || "erro";
            t = "dialog_alert dialog_" + t.toLocaleLowerCase();
        var callback = callback || jQuery.noop;
        msg = msg || "undefined";
        
        jQuery("<div></div>", {"id":"dialog-message"}).html(msg.toString()).dialog(
        {
	        modal: true,
	        resizable: false,
	        draggable: false,
	        title: titulo || "Atenção!",
	        dialogClass: t,
	        show: "",
		    buttons: {
			    Ok: function()
			    { 
			        jQuery( this ).dialog( "close" ).remove(); 
			        callback();
			    }
		    }
		});
    };
    
    jQuery.confirm = function (msg, titulo, callback)
    {
        // erro, sucesso, atencao
        t = "dialog_alert dialog_atencao";
        
        var callback = callback || jQuery.noop;

        jQuery("<div></div>", {"id":"dialog-message"}).html(msg).dialog(
        {
	        modal: true,
	        resizable: false,
	        draggable: false,
	        title: titulo || "Atenção!",
	        dialogClass: t,
	        show: "",
		    buttons: {
			    "Sim": function()
			    { 
			        jQuery( this ).dialog( "close" ).remove(); 
			        callback();
			    },
			    "Não": function()
			    {
			        jQuery( this ).dialog( "close" ).remove();
			    }
		    }
		});
    };
}
try { 
    Jqr(jQuery);
}
catch(ex){
    alert("Falha ao carregar o Jquery.");
}
window.alert = jQuery.alert;
