//
//  iWeb - TimerWidget.js
//  Copyright (c) 2007-2008 Apple Inc. All rights reserved.
//

var TimerWidget=Class.create(Widget,{widgetIdentifier:"com-apple-iweb-widget-timer",types:['text','digital','odometer','flip'],minFontFactor:1.2,initialize:function($super,instanceID,widgetPath,sharedPath,sitePath,preferences,runningInApp){if(instanceID!=null)
{$super(instanceID,widgetPath,sharedPath,sitePath,preferences,runningInApp);this.autosizing=0;this.view=null;this.units=[this.localizedString("Secs"),this.localizedString("Mins"),this.localizedString("Hours"),this.localizedString("Days"),this.localizedString("Years")];var targetDate=new Date();targetDate.setDate(targetDate.getDate());this.initializingDefaultPreferences=true;this.initializeDefaultPreferences({'type':1,'target':targetDate.getTime(),'unitsRange':{'location':1,'length':4},'labelsEnabled':1});this.initializingDefaultPreferences=undefined;this.updateFromPreferences();}},onload:function(){this.view||this.p_createView();},onunload:function(){this.refreshInterval===undefined||this.refreshInterval==0||clearInterval(this.refreshInterval);this.view=null;},changedPreferenceForKey:function(key){if(!this.initializingDefaultPreferences&&(key=='type'||key=='target'||key=='unitsRange'||key=='labelsEnabled'))
{this.updateFromPreferences();this.p_createView();}
if(key=='labelFontSize')
{if(this.view)
{this.view.updateFromLabelFontSize();}}
else if(key=='labelFontFactor')
{if(this.view)
{this.view.updateFromLabelFontFactor();}}},setDocumentInternalCSS:function($super,css){$super(css);var currentFontFamily=this.p_currentFontFamily();if(this.lastFontFamily!=currentFontFamily){this.lastFontFamily=currentFontFamily;var testTable=new Element('table');var testRow=new Element('tr',{className:'Timer_Labels'});var testCell=new Element('td');testTable.appendChild(testRow);testRow.appendChild(testCell);testTable.setStyle({position:'absolute',top:'0px'});testRow.setStyle({fontSize:'100px'});testCell.innerText='0123456789:';this.div().appendChild(testTable);var fontFactor=Math.max(testTable.offsetHeight/100,this.minFontFactor);this.div().removeChild(testTable);this.setPreferenceForKey(fontFactor,'labelFontFactor');}},updateFromPreferences:function(){this.targetDate=this.p_targetDateFromPreferences();this.unitsRange=this.p_unitsRangeFromPreferences();this.labelsEnabledValue=this.p_labelsEnabledFromPreferences();},p_currentFontFamily:function(){var family=undefined;var labelElement=this.div().selectFirst('.Timer_Labels');if(labelElement){family=labelElement.getStyle('font-family');}
return family;},p_targetDateFromPreferences:function(){var target=this.preferenceForKey('target');return new Date(target);},p_unitsRangeFromPreferences:function(){var rangeDict=this.preferenceForKey('unitsRange');return new IWRange(rangeDict.location,rangeDict.length);},p_labelsEnabledFromPreferences:function(){return((this.preferenceForKey('labelsEnabled')>0)?true:false);},currentTimeDelta:function(){var now=new Date();return Math.max(0,this.targetDate-now);},p_createView:function(){var timerDisplayHeight=this.view!=null?this.view.timerDisplayHeight:-1;viewType=this.preferenceForKey('type');this.refreshInterval===undefined||this.refreshInterval==0||clearInterval(this.refreshInterval);this.view=null;switch(this.types[viewType])
{case'odometer':this.view=new OdometerTimerView(this,timerDisplayHeight);break;case'flip':this.view=new FlipTimerView(this,timerDisplayHeight);break;case'digital':this.view=new DigitalTimerView(this,timerDisplayHeight);break;case'text':this.view=new TextualTimerView(this,timerDisplayHeight);break;default:iWLog('timer widget could not instatiate unknown view');this.view=null;}
this.view.setSelectedStyle();if(this.runningInApp)
{window.onresize=function()
{if(this.autosizing==0)
{this.view.resize(false);}}.bind(this);this.view.resizeWidgetWindow();}
this.view.refresh();this.refreshInterval=setInterval(this.view.refresh.bind(this.view),1000);}});var TimerView=Class.create({labelClassName:'Timer_Labels',initialize:function(widget,in_timerDisplayHeight){if(widget)
{this.widget=widget;this.div=widget.div();this.p_calculateRatios();var widgetWidth=toPixels(this.div.getStyle('width'));var widgetHeight=toPixels(this.div.getStyle('height'));this.widgetAspectRatio=widgetHeight/widgetWidth;this.handlingHandleResize=0;var timer=this.widget.getElementById('timer');if(timer!==undefined){timer.update();}
this.timerDisplayHeight=in_timerDisplayHeight;this.yDigitsNumber=0;this.dDigitsNumber=0;this.hDigitsNumber=0;this.mDigitsNumber=0;this.sDigitsNumber=0;this.p_setNumberOfDigitsPerUnit();}},refresh:function(){this.render();},render:function(){},ensureVisible:function(){var timer=this.widget.div().selectFirst('.timer_widget');if(timer)
{timer.setStyle({visibility:'visible'});}},setSelectedStyle:function(){this.widget.setPreferenceForKey(this.labelClassName,"x-selected-style-class",false);},updateFromLabelFontSize:function(){var labelFontSize=this.widget.preferenceForKey("labelFontSize");this.timerDisplayHeight=this.fontFactor*this.digitsToLabelsFontsRatio*labelFontSize;this.resize(true);if(this.handlingHandleResize==0)
{this.resizeWidgetWindow();}},updateFromLabelFontFactor:function(){this.p_calculateRatios();this.updateFromLabelFontSize();},setLabelFontSize:function(labelFontSize)
{labelFontSize>=10||(labelFontSize=10);labelFontSize<=50||(labelFontSize=50);var oldLabelFontSize=this.widget.preferenceForKey("labelFontSize");if(this.widget.runningInApp&&(this.handlingHandleResize||!oldLabelFontSize)&&!this.widget.preferences.isUndoingOrRedoing())
{if(labelFontSize!=oldLabelFontSize)
{this.widget.setPreferenceForKey(labelFontSize,"labelFontSize",!!oldLabelFontSize);}}},resize:function(in_preserveHeight){if(in_preserveHeight){if(this.widget.runningInApp){this.windowWidth=window.innerWidth;this.windowHeight=window.innerHeight;}
else{this.windowWidth=Math.ceil(this.widget.div().offsetWidth);this.windowHeight=Math.ceil(this.widget.div().offsetHeight);}
var widgetSize=this.resizeTimer(true);this.widgetWidth=widgetSize.width;this.widgetHeight=widgetSize.height;this.widgetAspectRatio=this.widgetHeight/this.widgetWidth;}
else{++this.handlingHandleResize;try{var widthChanged=false,heightChanged=false;if(this.windowWidth!=window.innerWidth)
{this.windowWidth=window.innerWidth;widthChanged=true;}
if(this.windowHeight!=window.innerHeight)
{this.windowHeight=window.innerHeight;heightChanged=true;}
if(widthChanged||heightChanged)
{var windowAspectRatio=this.windowHeight/this.windowWidth;if(windowAspectRatio>this.widgetAspectRatio){this.widgetWidth=this.windowWidth;this.widgetHeight=this.windowWidth*this.widgetAspectRatio;}
else if(windowAspectRatio<this.widgetAspectRatio){this.widgetWidth=this.windowHeight/this.widgetAspectRatio;this.widgetHeight=this.windowHeight;}
else{this.widgetWidth=this.windowWidth;this.widgetHeight=this.windowHeight;}
this.resizeTimer(false);}}
finally{--this.handlingHandleResize;}}},resizeWidgetWindow:function(){++this.widget.autosizing;try
{this.widget.setPreferenceForKey({"width":this.widgetWidth,"height":this.widgetHeight,"centerHor":true},"x-widgetSize",false);}
finally
{--this.widget.autosizing;}},resizeTimer:function(in_preserveHeight){},timeUnits:function(ms,unitsRange){(function(){return 0<=unitsRange.min()&&unitsRange.min()<=unitsRange.max()&&unitsRange.max()<=5;}).assert("Invalid time units range (min="+unitsRange.min()+", max="+unitsRange.max()+")");var result=[0,0,0,0,0];var divisors=[365,24,60,60,1000];var unitsRangeMin=unitsRange.min();var acc=ms;for(i=4;i>=unitsRangeMin;i--){result[i]=Math.floor(acc/divisors[i]);acc/=divisors[i];if(i>unitsRangeMin){result[i]=result[i]%divisors[i-1];}}
return{y:result[0],d:result[1],h:result[2],m:result[3],s:result[4]};},heightWithLabels:function(in_height){return this.widget.labelsEnabledValue?in_height*(1+this.labelsToDigitsFontsRatio):in_height;},heightWithoutLabels:function(in_height){return this.widget.labelsEnabledValue?in_height/(1+this.labelsToDigitsFontsRatio):in_height;},getDigitsFromInteger:function(in_value,in_length){(function(){return in_value>=0&&in_length>=0;}).assert("getDigitsFromInteger - Invalid arguments: in_value="+in_value+" in_length="+in_length);var digits=[];var digitCount=0;var ratio=in_value;do{var mod=this.intMod(ratio,10);digits.push(mod.remainder);ratio=mod.ratio;digitCount++;}while((digitCount<2)||(in_length==0&&ratio!=0)||(in_length>0&&digitCount<in_length));return digits.reverse();},intMod:function(in_value,in_div){(function(){return in_value>=0&&in_div>0;}).assert("intMod - Invalid arguments: in_value="+in_value+" in_div="+in_div);var ratio=Math.floor(in_value/in_div);return{ratio:ratio,remainder:Math.floor(in_value%in_div)};},p_calculateRatios:function(){this.fontFactor=this.widget.preferenceForKey('labelFontFactor')||this.widget.minFontFactor;this.digitsToLabelsFontsRatio=(5.0/this.fontFactor)-1;this.labelsToDigitsFontsRatio=1/this.digitsToLabelsFontsRatio;if(this.widget.runningInApp){this.widget.setPreferenceForKey(this.labelsToDigitsFontsRatio,'x-labelsToDigitsFontsRatio',false);}},p_setNumberOfDigitsPerUnit:function(){var ms=this.widget.currentTimeDelta();var unitsRange=this.widget.unitsRange;var unitsRangeMin=unitsRange.min();var timeUnits=this.timeUnits(ms,unitsRange);this.yDigitsNumber=unitsRange.containsLocation(0)?this.getDigitsFromInteger(timeUnits.y,0).size():0;this.dDigitsNumber=unitsRange.containsLocation(1)?this.getDigitsFromInteger(timeUnits.d,1==unitsRangeMin?0:3).size():0;this.hDigitsNumber=unitsRange.containsLocation(2)?this.getDigitsFromInteger(timeUnits.h,2==unitsRangeMin?0:2).size():0;this.mDigitsNumber=unitsRange.containsLocation(3)?this.getDigitsFromInteger(timeUnits.m,3==unitsRangeMin?0:2).size():0;this.sDigitsNumber=unitsRange.containsLocation(4)?this.getDigitsFromInteger(timeUnits.s,4==unitsRangeMin?0:2).size():0;},labelsRowMarkup:function(){var labelsRowMarkupString="";if(this.widget.labelsEnabledValue>0){var unitsRange=this.widget.unitsRange;var unitsRangeMin=unitsRange.min();var unitsRangeMax=unitsRange.max();for(i=(4-unitsRangeMin);i>(4-unitsRangeMax);i--){labelsRowMarkupString+="<td style='text-align: center;' class='fg-label'>"+this.widget.units[i]+"</td>";if(i>(4-unitsRangeMax)+1){labelsRowMarkupString+="<td class='fg-label-separator'></td>";}}}
return labelsRowMarkupString;}});var TextualTimerView=Class.create(TimerView,{timerType:'text',initialize:function($super,widget,in_timerDisplayHeight){$super(widget,in_timerDisplayHeight);var unitsRange=this.widget.unitsRange;var timeDigitColumns="";for(i=unitsRange.min();i<unitsRange.max();i++){timeDigitColumns+="<td></td>";if(unitsRange.containsLocation(i+1)){timeDigitColumns+='<td>:</td>';}}
var template=new Template("<table border='0' id='#{table_id}'><tr id='#{digit_id}' class='#{label_class}'>#{columns}</tr>"+"<tr id='#{labels_id}' class='#{labels_class}'>#{labels_markup}</tr></table>");this.widget.getElementById('timer').update(template.evaluate({table_id:this.widget.getInstanceId("timer_block"),digit_id:this.widget.getInstanceId("timer_digit_block"),label_class:this.labelClassName,columns:timeDigitColumns,labels_id:this.widget.getInstanceId("timer_labels_block"),labels_class:this.labelClassName,labels_markup:this.labelsRowMarkup()}));this.widget.getElementById("timer_digit_block").selectFirst('td').setStyle({t