/* Calendario jQuery UI
Version: 1.3.2
By: Danilo (http://www.tidbits.com.br/click-calendario-plugin-de-jquery-para-calendarios-em-portugues)
Edited by: Pyetro SaFe - 02/07/2012 11:53
Updated: 05/04/2013 13:50 version 1.2 to 1.3.2
Changes: - Vars idCalendario, contCalendario (now in global object a.Calendario_cfgs.conf.cfgs), dateDefault bugs fixed;
- Added the buttons for Forward and Backward to change the Year and added DblClick on behalf "month/year" to change Year by typing;
- Added verification of empty or invalid value for the var dateDefault;
- Added option to open and close calendar of the focus and blur events of the target;
- Added verification of the target parameter to block null or invalid values. #document element is a invalid target; */
(function(a){a.Calendario_cfgs=a.Calendario_cfgs||{Version:'1.3.2'};a.Calendario_cfgs.conf={cfgs:{contCalendario:0,target:'',targetDay:'',targetMonth:'',targetYear:'',minDate:'',maxDate:'',dateDefault:'',left:'0',top:'30',referencePosition:this,closeClick:true,closeOnBlur:true,openOnFocus:true}};a.fn.Calendario=function(ops){var nomeMes=new Array("Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro");var hoje=new Date();var diaAtual=hoje.getDate();var mesAtual=hoje.getMonth()+1;var anoAtual=hoje.getFullYear();var dataAtual=diaAtual+'/'+mesAtual+'/'+anoAtual;var defaults=a.Calendario_cfgs.conf.cfgs;defaults.dateDefault=dataAtual;var cfgs=(ops)?a.extend({},defaults,ops):defaults;cfgs.target=(cfgs.target.length>0&&cfgs.target[0]['localName']!==null)?cfgs.target:a(this);try{if(cfgs.target.length>0&&(cfgs.target[0].tagName==undefined||typeof(cfgs.target[0].tagName)=='undefined'))throw'Erro: Parâmetro "target" não foi definido!!!';}catch(er){console.log(er);return false}var ultimo_dia=function(mes,ano){if(mes==1||mes==3||mes==5||mes==7||mes==8||mes==10||mes==12)return 31;if(mes==4||mes==6||mes==9||mes==11)return 30;if(mes==2)if(ano%400==0)return 29;if(mes==2)if(ano%100==0)return 28;if(mes==2)if(ano%4==0)return 29;else return 28};function Cria_Calendario(elm){var dataCalendario=cfgs.dateDefault;if(dataCalendario=='self'&&cfgs.target.eq(0).val()!='')dataCalendario=cfgs.target.eq(0).val();if(!/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/.test(dataCalendario))dataCalendario=dataAtual;arrData=dataCalendario.split('/');diaOriginal=parseInt(arrData[0],10);mesOriginal=parseInt(arrData[1],10)-1;anoOriginal=parseInt(arrData[2],10);var diaMinimo=0,mesMinimo=0,anoMinimo=0;if(cfgs.minDate!=''){arrData=cfgs.minDate.split('/');diaMinimo=parseInt(arrData[0],10);mesMinimo=parseInt(arrData[1],10)-1;anoMinimo=parseInt(arrData[2],10)}var diaMaximo=9999,mesMaximo=9999,anoMaximo=9999;if(cfgs.maxDate!=''){arrData=cfgs.maxDate.split('/');diaMaximo=parseInt(arrData[0],10);mesMaximo=parseInt(arrData[1],10)-1;anoMaximo=parseInt(arrData[2],10)}var idCal=a(elm).attr('id');if(idCal==''||typeof(idCal)=='undefined'||idCal==undefined){defaults.contCalendario++;a(elm).attr('id','chamada_cal_'+defaults.contCalendario)}idChamada=a(elm).attr('id');var mes=mesOriginal,ano=anoOriginal;idCalendario='cal_'+idChamada;idCalendario=idCalendario.replace('_dia','').replace('_mes','').replace('_ano','');if(a('#'+idCalendario).size()>0)return false;a('body').append('<div class="calendario" id="'+idCalendario+'"><a href="#" class="fechar" title="Fechar">X</a><a href="#" class="bt_controle_mes bt_voltar_mes" title="Voltar Mês"> ‹ </a><a href="#" class="bt_controle_mes bt_voltar_ano" title="Voltar Ano"> «</a><p class="nome_mes" title="Dê um duplo clique para digitar o ano!!!">mês ano</p><a href="#" class="bt_controle_mes bt_avancar_ano" title="Avançar Ano">» </a><a href="#" class="bt_controle_mes bt_avancar_mes" title="Avançar Mês"> › </a><ul class="lista_dia"><li class="semana">D</li><li class="semana">S</li><li class="semana">T</li><li class="semana">Q</li><li class="semana">Q</li><li class="semana">S</li><li class="semana">S</li></ul></div>');a('#'+idCalendario).append('<input type="hidden" name="calendarioMes" value="'+mes+'"/>');a('#'+idCalendario).append('<input type="hidden" name="calendarioAno" value="'+ano+'"/>');function preencher_calendario(idCalendario){var titulo=nomeMes[mes]+" "+ano;a('#'+idCalendario+' p.nome_mes').html(titulo);a('#'+idCalendario+' ul.lista_dia li.dia_vazio').remove();a('#'+idCalendario+' ul.lista_dia li.dia').remove();var primeiro=new Date();primeiro.setFullYear(ano,mes,1);var inicioSemana=primeiro.getDay();for(i=0;i<inicioSemana;i++){a('#'+idCalendario+' ul.lista_dia').append("<li class='dia_vazio'> <\/li>")}var fimMes=ultimo_dia(mes+1,ano);for(i=1;i<=fimMes;i++){if((ano==anoMinimo&&mes==mesMinimo&&i<diaMinimo)||(ano==anoMaximo&&mes==mesMaximo&&i>diaMaximo)){a('#'+idCalendario+' ul.lista_dia').append("<li class='dia dia_n"+i+"'>"+i+"<\/li>")}else{if(cfgs.target!=''||cfgs.targetDay!=''||cfgs.targetMonth!=''||cfgs.targetYear!=''){a('#'+idCalendario+' ul.lista_dia').append("<li class='dia dia_n"+i+"'><a href='#'>"+i+"<\/a><\/li>")}else{a('#'+idCalendario+' ul.lista_dia').append("<li class='dia dia_n"+i+"'>"+i+"<\/li>")}}}if(mes==mesOriginal&&ano==anoOriginal){a('#'+idCalendario+' ul.lista_dia li.dia_n'+diaOriginal).addClass('default')}a('#'+idCalendario+' ul.lista_dia li a').click(function(){var dia=a.trim(a(this).html());if(dia.length==1)dia='0'+dia;var mes=(1+parseInt(a.trim(a(this.parentNode.parentNode.parentNode).find('input[name="calendarioMes"]').val()),10)).toString();if(mes.length==1)mes='0'+mes;var ano=parseInt(a.trim(a(this.parentNode.parentNode.parentNode).find('input[name="calendarioAno"]').val()),10);if(cfgs.target!=''&&a(cfgs.target).size()>0){var tag=a(cfgs.target).get(0).tagName.toLowerCase(),dataVal=dia+'/'+mes+'/'+ano;if(tag=='input'){a(cfgs.target).val(dataVal)}else if(tag=='select'){a(cfgs.target).find('option[selected]').removeAttr('selected');a(cfgs.target).find('option[value='+dataVal+']').attr('selected',true)}else{a(cfgs.target).html(dataVal)}}if(cfgs.targetDay!=''&&a(cfgs.targetDay).size()>0){var tag=a(cfgs.targetDay).get(0).tagName.toLowerCase();if(tag=='input'){a(cfgs.targetDay).val(dia)}else if(tag=='select'){a(cfgs.targetDay).find('option[selected]').removeAttr('selected');a(cfgs.targetDay).find('option[value='+dia+']').attr('selected',true)}else{a(cfgs.targetDay).html(dia)}}if(cfgs.targetMonth!=''&&a(cfgs.targetMonth).size()>0){var tag=a(cfgs.targetMonth).get(0).tagName.toLowerCase();if(tag=='input'){a(cfgs.targetMonth).val(mes)}else if(tag=='select'){a(cfgs.targetMonth).find('option[selected]').removeAttr('selected');a(cfgs.targetMonth).find('option[value='+mes+']').attr('selected',true)}else{a(cfgs.targetMonth).html(mes)}}if(cfgs.targetYear!=''&&a(cfgs.targetYear).size()>0){var tag=a(cfgs.targetYear).get(0).tagName.toLowerCase();if(tag=='input'){a(cfgs.targetYear).val(ano)}else if(tag=='select'){a(cfgs.targetYear).find('option[selected]').removeAttr('selected');a(cfgs.targetYear).find('option[value='+ano+']').attr('selected',true)}else{a(cfgs.targetYear).html(ano)}}if(cfgs.closeClick)a('#'+idCalendario).remove();return false});navegacaoCalendario(idCalendario)}function navegacaoCalendario(idCalendario){a('#'+idCalendario+' a.fechar').unbind();a('#'+idCalendario+' a.fechar').click(function(){a('#'+idCalendario).remove();return false});if(ano==anoMinimo){a('#'+idCalendario+' a.bt_voltar_ano').hide()}else{a('#'+idCalendario+' a.bt_voltar_ano').show();a('#'+idCalendario+' a.bt_voltar_ano').unbind();a('#'+idCalendario+' a.bt_voltar_ano').click(function(){ano=parseInt(a('input[name="calendarioAno"]').val(),10);ano--;a('input[name="calendarioAno"]').val(ano);preencher_calendario(idCalendario);return false})}if(ano==anoMinimo&&mes==mesMinimo){a('#'+idCalendario+' a.bt_voltar_mes').hide()}else{a('#'+idCalendario+' a.bt_voltar_mes').show();a('#'+idCalendario+' a.bt_voltar_mes').unbind();a('#'+idCalendario+' a.bt_voltar_mes').click(function(){mes=parseInt(a('input[name="calendarioMes"]').val(),10);ano=parseInt(a('input[name="calendarioAno"]').val(),10);mes--;if(mes<0){mes=11;ano--}a('input[name="calendarioMes"]').val(mes);a('input[name="calendarioAno"]').val(ano);preencher_calendario(idCalendario);return false})}if(ano==anoMaximo){a('#'+idCalendario+' a.bt_avancar_ano').hide()}else{a('#'+idCalendario+' a.bt_avancar_ano').show();a('#'+idCalendario+' a.bt_avancar_ano').unbind();a('#'+idCalendario+' a.bt_avancar_ano').click(function(){ano=parseInt(a('input[name="calendarioAno"]').val(),10);ano++;a('input[name="calendarioAno"]').val(ano);preencher_calendario(idCalendario);return false})}if(ano==anoMaximo&&mes==mesMaximo){a('#'+idCalendario+' a.bt_avancar_mes').hide()}else{a('#'+idCalendario+' a.bt_avancar_mes').show();a('#'+idCalendario+' a.bt_avancar_mes').unbind();a('#'+idCalendario+' a.bt_avancar_mes').click(function(){mes=parseInt(a('input[name="calendarioMes"]').val(),10);ano=parseInt(a('input[name="calendarioAno"]').val(),10);mes++;if(mes==12){mes=0;ano++}a('input[name="calendarioMes"]').val(mes);a('input[name="calendarioAno"]').val(ano);preencher_calendario(idCalendario);return false})}a('#'+idCalendario+' p.nome_mes').unbind();a('#'+idCalendario+' p.nome_mes').dblclick(function(){var num;try{num=prompt('Digite o ano:');if(num!=null)num=parseInt(num,10)}catch(e){alert(e.message());return}if(typeof(num)=='number'&&(num>=1000||num<=9999)){if(num<anoMinimo||num>anoMaximo){alert('Valor digitado não é permitido.\n\nDigite um ano entre '+anoMinimo+' e '+anoMaximo+'!!!\n\n');return false}ano=num;a('input[name="calendarioAno"]').val(ano);preencher_calendario(idCalendario);return false}else if(num!=null){alert('O valor digitado deve ser um número válido para Ano!!!');return false}})}preencher_calendario(idCalendario);var posicoes=a(elm).offset();var leftPosition=posicoes.left+parseInt(cfgs.left,10);var topPosition=posicoes.top+parseInt(cfgs.top,10);a('#'+idCalendario).css({'left':leftPosition,'top':topPosition});a('#'+idCalendario).show();a('#'+idCalendario).data('fechar',cfgs.closeOnBlur);a(cfgs.target).blur(function(){$('#'+idCalendario).data('fechar')&&$('#'+idCalendario).remove()});a('#'+idCalendario).mousedown(function(){a('#'+idCalendario).data('fechar',false)})}return this.each(function(){var el=a(this);if(cfgs.openOnFocus)a(cfgs.target).focus(function(){Cria_Calendario(el)});else Cria_Calendario(el)})}})(jQuery);