
if(!SAPO.Component||typeof(SAPO.Component)=='undefined'){SAPO.namespace('Component');}
SAPO.Component.DatePicker=function(options){this.init(options);}
SAPO.Component.DatePicker.version="1.1";SAPO.Component.DatePicker.prototype={init:function(options){options=SAPO.extendObj({instance:'scdp_'+Math.round(99999*Math.random()),elementId:false,pickerId:false,format:'yyyy-mm-dd',cssClass:'sapo_component_datepicker',container:false,onFocus:true,startDate:false,onSetDate:false,displayInSelect:false,dayId:false,monthId:false,showClose:true,closeText:'Fechar',showClean:true,cleanText:'Limpar',yearId:false,yearRange:false,prevLinkText:'«',nextLinkText:'»',deText:' de ',startWeekDay:1,month:{1:'Janeiro',2:'Fevereiro',3:'Mar&ccedil;o',4:'Abril',5:'Maio',6:'Junho',7:'Julho',8:'Agosto',9:'Setembro',10:'Outubro',11:'Novembro',12:'Dezembro'},wDay:{0:'Domingo',1:'Segunda',2:'Ter&ccedil;a',3:'Quarta',4:'Quinta',5:'Sexta',6:'S&aacute;bado'},cssURI:'http://js.sapo.pt/Assets/Images/DatePicker/style.css'},arguments[0]||{});this.options=options;if(!this.options.displayInSelect){if(!this.options.elementId||!s$(this.options.elementId)){throw"you _MUST_ give an elementId in which the date picker will act!";return;}}
this._setCSS();this.picker=null;if(this.options.yearRange){var years=this.options.yearRange.split(':');if(Number(years[0])&&Number(years[1]&&years[1]>=years[0])){this._yearMin=Math.floor(years[0]);this._yearMax=Math.floor(years[1]);}else{this.options.yearRange=false;}}
this.today=new Date();if(this.options.startDate&&typeof(this.options.startDate)=='string'&&/\d\d\d\d\-\d\d\-\d\d/.test(this.options.startDate)){this.data=new Date();var parsed=this.options.startDate.split("-");this.data.setFullYear(parsed[0],parsed[1]-1,parsed[2]);}else{this.data=new Date();}
this.day=this.today.getDate();var startYear=this._checkYearRange(this.data.getFullYear());this.data.setFullYear(startYear,this.data.getMonth(),1);this.dataField=s$(this.options.elementId);this.containerObject=document.createElement('div');this.containerObject.id=this.options.instance;this.containerObject.className='sapo_component_datepicker';var dom=document.getElementsByTagName('body')[0];if(this.options.showClose||this.options.showClean){this.superTopBar=document.createElement("div");this.superTopBar.className='sapo_cal_top_options';if(this.options.showClean){var clean=document.createElement('a');clean.className='clean';clean.innerHTML=this.options.cleanText;this.superTopBar.appendChild(clean);}
if(this.options.showClose){var close=document.createElement('a');close.className='close';close.innerHTML=this.options.closeText;this.superTopBar.appendChild(close);}
this.containerObject.appendChild(this.superTopBar);}
var calendarTop=document.createElement("div");calendarTop.className='sapo_cal_top';this.monthDescContainer=document.createElement("div");this.monthDescContainer.className='sapo_cal_month_desc';this.monthPrev=document.createElement('div');this.monthPrev.className='sapo_cal_prev';this.monthPrev.innerHTML='<a href="#prev" class="change_month_prev">'+this.options.prevLinkText+'</a>';this.monthNext=document.createElement('div');this.monthNext.className='sapo_cal_next';this.monthNext.innerHTML='<a href="#next" class="change_month_next">'+this.options.nextLinkText+'</a>';calendarTop.appendChild(this.monthPrev);calendarTop.appendChild(this.monthDescContainer);calendarTop.appendChild(this.monthNext);this.monthContainer=document.createElement("div");this.monthContainer.className='sapo_cal_month';this.containerObject.appendChild(calendarTop);this.containerObject.appendChild(this.monthContainer);this.monthSelector=document.createElement('ul');this.monthSelector.className='sapo_cal_month_selector';var ulSelector;var liMonth;for(var i=1;i<=12;i++){if(!((i-1)%4)){ulSelector=document.createElement('ul');}
liMonth=document.createElement('li');liMonth.innerHTML='<a href="#" class="sapo_calmonth_'+((String(i).length==2)?i:"0"+i)+'">'+this.options.month[i].substring(0,3)+'</a>';ulSelector.appendChild(liMonth);if(!(i%4)){this.monthSelector.appendChild(ulSelector);}}
this.containerObject.appendChild(this.monthSelector);this.yearSelector=document.createElement('ul');this.yearSelector.className='sapo_cal_year_selector';this.containerObject.appendChild(this.yearSelector);if(!this.options.onFocus||this.options.displayInSelect){if(!this.options.pickerId){this.picker=document.createElement('a');this.picker.href='#open_cal';this.picker.innerHTML='open';this.picker.style.position='absolute';this.picker.style.top=SAPO.Dom.Element.elementTop(this.options.elementId);this.picker.style.left=SAPO.Dom.Element.elementLeft(this.options.elementId)+(SAPO.Dom.Element.elementWidth(this.options.elementId)||0)+5+'px';s$(this.options.elementId).parentNode.appendChild(this.picker);this.picker.className='sapo_cal_date_picker';}else{this.picker=s$(this.options.pickerId);;}}
if(this.options.displayInSelect){if(this.options.dayId&&this.options.monthId&&this.options.yearId||this.options.pickerId){this._dayField=s$(this.options.dayId);this._monthField=s$(this.options.monthId);this._yearField=s$(this.options.yearId);}else{throw"To use display in select you *MUST* to set dayId, monthId, yearId and pickerId!";}}
dom.appendChild(this.containerObject);if(this.picker==null){SAPO.Dom.Event.observe(this.dataField,'focus',function(){this.containerObject=SAPO.Dom.Element.clonePosition(this.containerObject,this.dataField);this.containerObject.style.left=SAPO.Dom.Element.elementWidth(this.dataField)+SAPO.Dom.Element.offsetLeft(this.dataField)+'px';dom.appendChild(this.containerObject);this._updateDate();this._showMonth();this.containerObject.style.display='block';}.bindObjEvent(this));}else{SAPO.Dom.Event.observe(this.picker,'click',function(e){SAPO.Dom.Event.stop(e);this.containerObject=SAPO.Dom.Element.clonePosition(this.containerObject,this.picker);this._updateDate();this._showMonth();this.containerObject.style.display='block';}.bindObjEvent(this));}
if(!this.options.displayInSelect){SAPO.Dom.Event.observe(this.dataField,'change',function(){this._updateDate();this._showDefaultView();}.bindObjEvent(this));}else{SAPO.Dom.Event.observe(this._dayField,'change',function(){var yearSelected=this._yearField.options[this._yearField.selectedIndex].value;if(yearSelected!=''&&yearSelected!=0){this._updateDate();this._showDefaultView();}}.bindObjEvent(this));SAPO.Dom.Event.observe(this._monthField,'change',function(){var yearSelected=this._yearField.options[this._yearField.selectedIndex].value;if(yearSelected!=''&&yearSelected!=0){this._updateDate();this._showDefaultView();}}.bindObjEvent(this));SAPO.Dom.Event.observe(this._yearField,'change',function(){this._updateDate();this._showDefaultView();}.bindObjEvent(this));}
SAPO.Dom.Event.observe(document,'click',function(e){if(e.target===undefined){e.target=e.srcElement;}
try{if(!SAPO.Dom.Element.descendantOf(this.containerObject,e.target)&&e.target!=this.dataField){if(this.picker==null){this.containerObject.style.display='none';}else if(e.target!=this.picker&&(!this.options.displayInSelect||(e.target!=this._dayField&&e.target!=this._monthField&&e.target!=this._yearField))){if(!this.options.dayId||(!SAPO.Dom.Element.descendantOf(this._dayField,e.target)&&!SAPO.Dom.Element.descendantOf(this._monthField,e.target)&&!SAPO.Dom.Element.descendantOf(this._yearField,e.target))){this.containerObject.style.display='none';}}}}catch(ex){SAPO.Dom.Event.stopObserving(document,'click',arguments.callee);}}.bindObjEvent(this));this._showMonth();this.monthChanger=document.createElement('a');this.monthChanger.href='#monthchanger';this.monthChanger.className='sapo_cal_link_month';this.monthChanger.innerHTML=this.options.month[this.data.getMonth()+1];this.deText=document.createElement('span');this.deText.innerHTML=this.options.deText;this.yearChanger=document.createElement('a');this.yearChanger.href='#yearchanger';this.yearChanger.className='sapo_cal_link_year';this.yearChanger.innerHTML=this.data.getFullYear();this.monthDescContainer.innerHTML='';this.monthDescContainer.appendChild(this.monthChanger);this.monthDescContainer.appendChild(this.deText);this.monthDescContainer.appendChild(this.yearChanger);SAPO.Dom.Event.observe(this.containerObject,'click',function(e){if(typeof(e.target)=='undefined'){e.target=e.srcElement;}
var className=e.target.className;SAPO.Dom.Event.stop(e);if(className.indexOf('sapo_cal_')==0){if(Number(className.substr(9,2))){this._setDate(e.target);}else if(className=='sapo_cal_link_month'){this.monthContainer.style.display='none';this.yearSelector.style.display='none';this.monthPrev.childNodes[0].className='action_inactive';this.monthNext.childNodes[0].className='action_inactive';this._setActiveMonth();this.monthSelector.style.display='block';}else if(className=='sapo_cal_link_year'){this.monthPrev.childNodes[0].className='action_inactive';this.monthNext.childNodes[0].className='action_inactive';this.monthSelector.style.display='none';this.monthContainer.style.display='none';this._showYearSelector();this.yearSelector.style.display='block';}}else if(className.indexOf("sapo_calmonth_")==0){var month=className.substr(14,2);if(Number(month)){this.data.setMonth(month-1);this.monthSelector.style.display='none';this.monthPrev.childNodes[0].className='change_month_prev';this.monthNext.childNodes[0].className='change_month_next';this._updateCal();this.monthContainer.style.display='block';}}else if(className.indexOf("sapo_calyear_")==0){var year=className.substr(13,4);if(Number(year)){this.data.setFullYear(year);this.monthPrev.childNodes[0].className='action_inactive';this.monthNext.childNodes[0].className='action_inactive';this.yearSelector.style.display='none';this.monthSelector.style.display='block';}}else if(className.indexOf('change_month_')==0){if(className=='change_month_next'){this._updateCal(1);}else if(className=='change_month_prev'){this._updateCal(-1);}}else if(className.indexOf('change_year_')==0){if(className=='change_year_next'){this._showYearSelector(1);}else if(className=='change_year_prev'){this._showYearSelector(-1);}}else if(className=='clean'){if(this.options.displayInSelect){this._yearField.options.selectedIndex=0;this._monthField.options.selectedIndex=0;this._dayField.options.selectedIndex=0;}else{this.dataField.value='';}}else if(className=='close'){this.containerObject.style.display='none';}
this._updateDescription();}.bindObjEvent(this));},_checkYearRange:function(year){if(this.options.yearRange){if(year>this._yearMax){year=this._yearMax;}
if(year<this._yearMin){year=this._yearMin;}}
return year;},_showDefaultView:function(){this.yearSelector.style.display='none';this.monthSelector.style.display='none';this.monthPrev.childNodes[0].className='change_month_prev';this.monthNext.childNodes[0].className='change_month_next';this.monthContainer.style.display='block';},_updateDate:function(){if(!this.options.displayInSelect){if(this.dataField.value!=''){if(this._isDate(this.options.format,this.dataField.value)){var dataParsed=this._getDataArrayParsed(this.dataField.value);dataParsed[0]=this._checkYearRange(dataParsed[0]);this.data.setFullYear(dataParsed[0],dataParsed[1]-1,1);this.day=dataParsed[2];}else{this.dataField.value='';this.data.setFullYear(this.data.getFullYear(),this.data.getMonth(),1);this.day=this.today.getDate();}}}else{var dataParsed=[];if(this._isValidDate(dataParsed[0]=this._yearField.options[this._yearField.selectedIndex].value,dataParsed[1]=this._monthField.options[this._monthField.selectedIndex].value,dataParsed[2]=this._dayField.options[this._dayField.selectedIndex].value)){dataParsed[0]=this._checkYearRange(dataParsed[0]);this.data.setFullYear(dataParsed[0],dataParsed[1]-1,1);this.day=dataParsed[2];}else{dataParsed[0]=this._checkYearRange(dataParsed[0]);if(this._isValidDate(dataParsed[0],dataParsed[1],1)){this.data.setFullYear(dataParsed[0],dataParsed[1]-1,1);this.day=this._daysInMonth(dataParsed[0],dataParsed[1]);this.data.setDate(this.day);this._setDate();}}}
this._updateDescription();this._showMonth();},_updateDescription:function(){this.monthChanger.innerHTML=this.options.month[this.data.getMonth()+1];this.deText.innerHTML='&nbsp;de&nbsp;';this.yearChanger.innerHTML=this.data.getFullYear();},_showYearSelector:function(){if(arguments.length){var year=arguments[0]*10+this.data.getFullYear();year=year-year%10;if(this.options.yearRange&&(year>this._yearMax||year+9<this._yearMin)){return;}
this.data.setFullYear(arguments[0]*10+this.data.getFullYear());}
var str="";var ano_base=this.data.getFullYear()-(this.data.getFullYear()%10);for(var i=0;i<=11;i++){if(!(i%4)){str+='<ul>';}
if(!i||i==11){if((!this.options.yearRange&&i)||(i&&(ano_base+i-1)<=this._yearMax&&(ano_base+i-1)>=this._yearMin)){str+='<li><a href="#year_next" class="change_year_next">»</a></li>';}else if(!this.options.yearRange||((ano_base+i-1)<=this._yearMax&&(ano_base+i-1)>=this._yearMin)){str+='<li><a href="#year_prev" class="change_year_prev">«</a></li>';}else{str+='<li>&nbsp;</li>';}}else{if(!this.options.yearRange||((ano_base+i-1)<=this._yearMax&&(ano_base+i-1)>=this._yearMin)){str+='<li><a href="#" class="sapo_calyear_'+(ano_base+i-1)+(((ano_base+i-1)==this.data.getFullYear())?' sapo_cal_on':'')+'">'+(ano_base+i-1)+'</a></li>';}else{str+='<li><a href="#" class="sapo_cal_off">'+(ano_base+i-1)+'</a></li>';}}
if(!((i+1)%4)){str+='</ul>';}}
this.yearSelector.innerHTML=str;},_getDataArrayParsed:function(dateStr){var yearIndex=this._dateParsers[this.options.format].year;var monthIndex=this._dateParsers[this.options.format].month;var dayIndex=this._dateParsers[this.options.format].day;var dateParser=this._dateParsers[this.options.format].parser;var separator=this._dateParsers[this.options.format].sep;var arrData=[];var data=dateStr.match(dateParser);if(data!=null){if(data[2]==data[4]&&data[2]==separator){var _y=((data[yearIndex].length==2)?"20"+data[yearIndex].toString():data[yearIndex]);arrData=[_y,data[monthIndex],data[dayIndex]];}}
return arrData;},_isValidDate:function(year,month,day){var yearRegExp=/^\d{4}$/;var validOneOrTwo=/^\d{1,2}$/;if(yearRegExp.test(year)&&validOneOrTwo.test(month)&&validOneOrTwo.test(day)){if(month>=1&&month<=12&&day>=1&&this._daysInMonth(year,month)>=day){return true;}}
return false;},_isDate:function(format,dateStr){if(typeof(this._dateParsers[format])=='undefined'){return false;}
var yearIndex=this._dateParsers[format].year;var monthIndex=this._dateParsers[format].month;var dayIndex=this._dateParsers[format].day;var dateParser=this._dateParsers[format].parser;var separator=this._dateParsers[format].sep;var trim=/^\w+|\w+$/g;var data=dateStr.match(dateParser);if(data!=null){if(data[2]==data[4]&&data[2]==separator){var _y=((data[yearIndex].length==2)?"20"+data[yearIndex].toString():data[yearIndex]);if(this._isValidDate(_y,data[monthIndex].toString(),data[dayIndex].toString())){return true;}}}
return false;},_writeDateInFormat:function(){var ano=this.data.getFullYear();var mes=this.data.getMonth()+1;var dia=this.data.getDate();var diaIndex=this._dateParsers[this.options.format].day;var mesIndex=this._dateParsers[this.options.format].month;var anoIndex=this._dateParsers[this.options.format].year;var data=[];data[diaIndex]=(String(dia).length==2)?dia:"0"+dia;data[mesIndex]=(String(mes).length==2)?mes:"0"+mes;data[anoIndex]=ano;var match=0;var str="";for(var i=0;i<data.length;i++){if(typeof(data[i])!='undefined'){str+=data[i];match++;if(match<3){str+=this._dateParsers[this.options.format].sep;}else{break;}}}
return str;},_setDate:function(objClicked){if(typeof(objClicked)!='undefined'){var dia=objClicked.className.substr(9,2);this.day=dia;this.data.setDate(dia);}
if(!this.options.displayInSelect){this.dataField.value=this._writeDateInFormat();}else{this._dayField.value=this.data.getDate();this._monthField.value=this.data.getMonth()+1;this._yearField.value=this.data.getFullYear();}
if(this.options.onSetDate){this.options.onSetDate(this.data);}
this.containerObject.style.display='none';},_updateCal:function(inc){this._updateMonth(inc);this._showMonth();},_daysInMonth:function(_y,_m){var nDays;if(_m==1||_m==3||_m==5||_m==7||_m==8||_m==10||_m==12)
{nDays=31;}
else if(_m==4||_m==6||_m==9||_m==11)
{nDays=30;}
else
{if((_y%400==0)||(_y%4==0&&_y%100!=0))
{nDays=29;}
else
{nDays=28;}}
return nDays;},_updateMonth:function(incValue){if(typeof(incValue)=='undefined'){incValue="0";}
var mes=this.data.getMonth()+1;var ano=this.data.getFullYear();switch(incValue){case-1:if(mes==1){if(ano==this._yearMin){return;}
mes=12;ano--;}else{mes--;}
this.data.setFullYear(ano,mes-1,1);break;case 1:if(mes==12){if(ano==this._yearMax){return;}
mes=1;ano++;}else{mes++;}
this.data.setFullYear(ano,mes-1,1);break;default:}},_dateParsers:{'yyyy-mm-dd':{day:5,month:3,year:1,sep:'-',parser:/^(\d{4})(\-)(\d{1,2})(\-)(\d{1,2})$/},'yyyy/mm/dd':{day:5,month:3,year:1,sep:'/',parser:/^(\d{4})(\/)(\d{1,2})(\/)(\d{1,2})$/},'yy-mm-dd':{day:5,month:3,year:1,sep:'-',parser:/^(\d{2})(\-)(\d{1,2})(\-)(\d{1,2})$/},'yy/mm/dd':{day:5,month:3,year:1,sep:'/',parser:/^(\d{2})(\/)(\d{1,2})(\/)(\d{1,2})$/},'dd-mm-yyyy':{day:1,month:3,year:5,sep:'-',parser:/^(\d{1,2})(\-)(\d{1,2})(\-)(\d{4})$/},'dd/mm/yyyy':{day:1,month:3,year:5,sep:'/',parser:/^(\d{1,2})(\/)(\d{1,2})(\/)(\d{4})$/},'dd-mm-yy':{day:1,month:3,year:5,sep:'-',parser:/^(\d{1,2})(\-)(\d{1,2})(\-)(\d{2})$/},'dd/mm/yy':{day:1,month:3,year:5,sep:'/',parser:/^(\d{1,2})(\/)(\d{1,2})(\/)(\d{2})$/},'mm/dd/yyyy':{day:3,month:1,year:5,sep:'/',parser:/^(\d{1,2})(\/)(\d{1,2})(\/)(\d{4})$/},'mm-dd-yyyy':{day:3,month:1,year:5,sep:'-',parser:/^(\d{1,2})(\-)(\d{1,2})(\-)(\d{4})$/}},_showMonth:function(){var mes=this.data.getMonth()+1;var ano=this.data.getFullYear();var maxDay=this._daysInMonth(ano,mes);var wDayFirst=this.data.getDay();var startWeekDay=this.options.startWeekDay||0;this.monthPrev.childNodes[0].className='change_month_prev';this.monthNext.childNodes[0].className='change_month_next';if(mes==1&&this._yearMin==ano){this.monthPrev.childNodes[0].className='action_inactive';}else if(mes==12&&this._yearMax==ano){this.monthNext.childNodes[0].className='action_inactive';}
if(startWeekDay&&Number(startWeekDay)){if(startWeekDay>wDayFirst){wDayFirst=7+startWeekDay-wDayFirst;}else{wDayFirst+=startWeekDay;}}
var html='';html+='<ul class="sapo_cal_header">';for(i=0;i<7;i++){html+='<li>'+this.options.wDay[i+(((startWeekDay+i)>6)?startWeekDay-7:startWeekDay)].substring(0,1)+'</li>'}
html+='</ul>';var counter=0;html+='<ul class="sapo_cal_middle">';if(wDayFirst){for(j=startWeekDay;j<wDayFirst-startWeekDay;j++){if(!counter){html+='<ul>';}
html+='<li class="sapo_cal_empty">&nbsp;</li>';counter++;}}
var wDay=wDayFirst;var dateYM=ano+"-"+((mes.length==2)?mes:"0"+mes)+"-";for(i=1;i<=maxDay;i++){if(counter==7){counter=0;html+='<ul>';}
idx='sapo_cal_'+((String(i).length==2)?i:"0"+i)+((i==this.day||(this.day>maxDay&&i==maxDay))?" sapo_cal_on":"");html+='<li><a href="#" class="'+idx+'">'+i+'</a></li>';counter++;if(counter==7){html+='</ul>';}}
if(counter!=7){for(i=counter;i<7;i++){html+='<li class="sapo_cal_empty">&nbsp;</li>'}
html+='</ul>';}
html+='</ul>';this.monthContainer.innerHTML=html;},_setCSS:function(){if(!this.options.cssURI){return;}
var head=document.getElementsByTagName('head')[0];var css=document.createElement('link');css.rel="stylesheet";css.type="text/css";css.href=this.options.cssURI;head.appendChild(css);},_setActiveMonth:function(parent){if(typeof(parent)=='undefined'){parent=this.monthSelector;}
var length=parent.childNodes.length;if(parent.className&&parent.className.match(/sapo_calmonth_/)){var indice=-1;if(typeof(parent.className)=='undefined'){return;}
if((indice=parent.className.indexOf(' '))>0){parent.className=parent.className.substr(0,indice);}
var mes=this.data.getMonth()+1;var liMes=parent.className.substr(14,2);if(mes==liMes){parent.className+=" sapo_cal_on";}}else if(length!=0){for(var i=0;i<length;i++){this._setActiveMonth(parent.childNodes[i]);}}},debug:function(){}};
