// Copyright 1998,1999 Macromedia, Inc. All rights reserved.//Constructs a timer elementfunction MM_timr(theParent, theName, theInitialValue,                 theNumberOfFrames, theTimeLimit,                 theReverseFrames) {  // properties  this.initialValue = theInitialValue;  this.value = '';  this.disabled = true;  this.timeLeft = '';  this.timeLimit = theTimeLimit;  this.timeStart = '';  this._parent = theParent;  this._name = theName;  this._self = theParent._self+".e['"+theName+"']";  this._obj = '';  this._fileExt = '';  this._filePre = '';  this._preloadFrame = 1;  this._preloadInterval = 1;  this._preloadObj = new Image();  this._tick = (theTimeLimit/theNumberOfFrames)/3;  this._numberOfFrames = theNumberOfFrames;  this._currentFrame = 0;  this._reverseFrames = theReverseFrames;  this._timeoutWaiting = false;  this.c = new Array();  // member functions  this.init = MM_timrInit;  this.reset = MM_timrReset;  this.enable = MM_timrEnable;  this.disable = MM_timrDisable;  this.setDisabled = MM_timrSetDisabled;  this.update = MM_timrUpdate;  this.setValue = MM_timrSetValue;  this.step = MM_timrStep;  this.getClosestFrame = MM_timrGetClosestFrame;  this.waitTick = MM_timrWaitTick;  this.preloadFrame = MM_timrPreloadFrame;  this.getFrameSrc = MM_timrGetFrameSrc;}// Initializes the elementfunction MM_timrInit() {  var theSrc, extIndex, undIndex;  with (this) {    _obj = MM_intFindObject(_parent._self + _name + "Img");    if (_obj && _obj.src != null) {      theSrc = _obj.src;      extIndex = theSrc.lastIndexOf(".");      if (extIndex != -1) { // save the extension        _fileExt = theSrc.substring(extIndex, theSrc.length);        theSrc = theSrc.substring(0, extIndex); // remove extension      }      undIndex = theSrc.lastIndexOf("_");      if (undIndex != -1)        _filePre = theSrc.substring(0, undIndex+1);      preloadFrame();    }    if (_tick > 100) _tick = 100;  }}//Resets the elementfunction MM_timrReset() {  var i;  with (this) {    value = initialValue;    timeLeft = Math.max(0, timeLimit - value);    for(i in c) if (i != 'length' && c[i].expectedValue >= value)      c[i].selected = c[i].judged = false;    if (_obj) {      _currentFrame = getClosestFrame(value);      _obj.src = getFrameSrc(_currentFrame);      preloadFrame();    }    timeStart = Math.floor((new Date()).getTime()/1000) - value;    _parent.disabled ? disable() : enable();  }}//Enables the elementfunction MM_timrEnable() {  var i;  with (this) {    if (disabled) {      disabled = false;      timeStart = Math.floor((new Date()).getTime()/1000) - value;    }    for (i in c) if (i != 'length') c[i].disabled = false;    update();    waitTick();  }}//Disables the elementfunction MM_timrDisable() {  with (this) {    if (!disabled) {      disabled = true;      value = Math.floor((new Date()).getTime()/1000) - timeStart;      timeLeft = timeLimit - value;  } }}//Calls the approppriate disable or enable functionfunction MM_timrSetDisabled(theDisabled) {  if (theDisabled) this.disable();  else this.enable();}//Called by onClick event to update this elements valuefunction MM_timrUpdate() {  var i,judgeInt=false;  with (this) {    if (disabled) return;    // walk the list of choices, setting selected    for (i in c) if (i != 'length') {      if (!c[i].judged && c[i].validValue()) {        judgeInt = true;        c[i].judged = true;    } }    // call the parent's update    _parent.update(!judgeInt);  }}function MM_timrSetValue(theValue) {  with (this) {    value = Math.max(0, theValue);    timeStart = Math.floor((new Date()).getTime()/1000) - value;    timeLeft = Math.max(0, timeLimit - value);    for(i in c) if (i != 'length' && c[i].expectedValue >= value)      c[i].selected = c[i].judged = false;    if (_obj) {      _currentFrame = getClosestFrame(value);      _obj.src = getFrameSrc(_currentFrame);      preloadFrame();    }    _parent.update(true); // update int, no judge  }}//Calls the setTimeout() function for this element.function MM_timrWaitTick() {  with (this) {    if (!_timeoutWaiting) {      _timeoutWaiting = true;      setTimeout(_self + ".step()", _tick);  } }}//Returns the "best guess" of the frame to show for the current time.// theTime - the time to find the frame for in secondsfunction MM_timrGetClosestFrame(theTime) {  var frame;  with (this) {    frame = Math.floor((theTime * (_numberOfFrames - 1)) / timeLimit);    if (theTime >= timeLimit)      frame = _numberOfFrames - 1;    else if (frame > (_numberOfFrames - 2))      frame = _numberOfFrames - 2;  }  return frame;}//Returns the URL for the given frame image.// theFrame - the frame to get the source file name forfunction MM_timrGetFrameSrc(theFrame) {  var iTest, numberStr;  with (this) {    numberStr = (_reverseFrames) ? (_numberOfFrames - theFrame) : (theFrame + 1);    // add pad zeros    for (iTest=10; (this._numberOfFrames >= iTest); iTest*=10)      if (numberStr < iTest) numberStr = "0" + numberStr;  }  return this._filePre + numberStr + this._fileExt;}//Preload the "best guess" next frame that we can use.function MM_timrPreloadFrame() {  with (this) {    _preloadFrame = _currentFrame + _preloadInterval;    if (_preloadFrame >= _numberOfFrames)      _preloadFrame = _numberOfFrames - 1;    _preloadObj.src = getFrameSrc(_preloadFrame);  }}//Catches the timeout event and updates the timer display// and element values.  Args:function MM_timrStep() {  var doPreload, closestFrame;  with (this) {    _timeoutWaiting = false;    if (!disabled) {      value = Math.floor((new Date()).getTime()/1000) - timeStart;      timeLeft = timeLimit - value;      if (_obj) {        doPreload=false;        closestFrame=getClosestFrame(value);        if (_preloadObj.complete) {          if (closestFrame >= _preloadFrame) {            _obj.src = _preloadObj.src;            doPreload = true;          }         } else if (closestFrame > _preloadFrame) {          _preloadInterval++;          doPreload = true;        }         if (doPreload) {          _currentFrame = closestFrame;          preloadFrame();      } }            if (this.onTick != null) onTick(_parent._self+_name, value);      waitTick();      update();  } }}///////////////////////////////////////////Create a range choice objectfunction MM_timrTrig(theParent, theElement, theName,                     theExpectedValue, theIsCorrect, theScore) {  // properties  this.expectedValue = theExpectedValue;  this.isCorrect = theIsCorrect;  this.score = theScore;  this.selected = false;  this.disabled = false;  this.judged = false;  this._elem = eval(theParent._self+".e['"+theElement+"']");  this._isChoice = true;  // method  this.validValue = MM_timrTrigValidValue;  this.setDisabled = MM_timrTrigSetDisabled;  this.setSelected = MM_timrTrigSetSelected;}//Returns true if value is above this threshold.function MM_timrTrigValidValue() {  with (this) {    selected = false;    if (!disabled && _elem.value != null)      selected = (expectedValue <= _elem.value);  }  return this.selected;}function MM_timrTrigSetDisabled(theDisabled) {  with (this) {    disabled = theDisabled;    validValue();    _elem._parent.update(true); // update int, no judge  }}function MM_timrTrigSetSelected(theSelected) {  with (this) {    if (theSelected) {      _elem.setValue(expectedValue);    } else {      this.selected = false;      _elem._parent.update(true); // update int, no judge  } }}
