AS3單例形式

package utils
{



public class TimeAlarm
{
  static private var _instance:TimeAlarm;//利用單例形式
  private var _timeSourceFunc:Function;
  /**
   *鬧鈴辦理器
   *
   */  
  public function TimeAlarm()
  {
   if(_instance!=null)
    throw "TimeAlarm is single instance class."
  }
  
  static public function get instance():TimeAlarm
  {
   if(_instance==null)
   {
    _instance = new TimeAlarm();
   }
   return _instance;
  }
  /**
   *正在幀輪迴中挪用
   * @param time
   *
   */  
  public function alarmTick(time:Number=NaN):void
  {
   var date:Date;
   var day:int;
   if(isNaN(time)==true)
   {
    date = new Date();
   }else{
    date = new Date(time);
   }
   
   var monthly_key:String = "";
   var weekly_key:String = "";
   var daily_key:String = "";
   //每個月 鍵值
   if(date.month<9)
   {
    monthly_key += "0";
   }
   monthly_key += String(date.month+1);
   if(date.date<10)
   {
    monthly_key += "0";
   }
   monthly_key += String(date.date);
   //每週 鍵值
   if(date.day==0)
   {
    monthly_key = monthly_key + "07";
    weekly_key = weekly_key + "07";
    day = 7;
   }else{
    monthly_key = monthly_key + "0" + String(date.day);
    weekly_key = weekly_key + "0" + String(date.day);
    day = date.day;
   }
   //每時 鍵值
   if(date.hours<10)
   {
    monthly_key += "0";
    weekly_key += "0";
    daily_key += "0";
   }
   monthly_key += String(date.hours);
   weekly_key += String(date.hours);
   daily_key += String(date.hours);
   if(date.minutes<10)
   {
    monthly_key += "0";
    weekly_key += "0";
    daily_key += "0";
   }
   monthly_key +=String(date.minutes);
   weekly_key +=String(date.minutes);
   daily_key +=String(date.minutes);
   
   if(date.seconds<10)
   {
    monthly_key += "0";
    weekly_key += "0";
    daily_key += "0";
   }
   monthly_key +=String(date.seconds);
   weekly_key +=String(date.seconds);
   daily_key +=String(date.seconds);
   
   if(_alarms!=null)
   {
    var type_alarms:Array;
    var final_key:String;
    for (var type:String in _alarms)
    {
     type_alarms = _alarms[type];
     switch(int(type))
     {
      case ALARM_WEEKLY:
      {
       final_key = weekly_key;
       break;
      }
      case ALARM_DAiLY:
      {
       final_key = daily_key;
       break;
      }
     }
     var alarm:Object;
     var alarms:Array;
     //正面提示
     for (var k:String in type_alarms)
     {
      alarms = type_alarms[k];
      if(k==final_key)
      {
       for each(alarm in alarms)
       {
        if(alarm.alarm is Function)
        {
         alarm.alarm(alarm);
         alarm.alarmed = true;
        }
       }
      }else{
       for each(alarm in alarms)
       {
        //超出正面,可是借正在範疇內
        if(alarm.range!=null && alarm.alarmed==false)
        {
         //先只算周提示的
         if((alarm.w==null || alarm.w==day) && alarm.h==date.hours)//
         {
          var end_min:int = int(alarm.min)+int(alarm.range);
          var start_min:int = int(alarm.min);
          var start_s:int = int(alarm.s);
          var in_range:Boolean = false;
          if(end_min>date.minutes)//完畢時間比當前時間早
          {
           if(start_min==date.minutes)//假如恰好是開端妨魁
           {
            if(start_s<date.seconds)//吭喲是否是當前時間過了正面
            {
             in_range = true;
            }
           }else if(start_min<date.minutes)//假如過了開端妨魁
           {
            in_range = true;
           }
          }else if(end_min==date.minutes)//假如當前時間遇上告終束時間
          {
           if(start_s>date.seconds)//秒數借正在範疇內
           {
            in_range = true;
           }
          }
          if(in_range==true)
          {
           alarm.alarmed = true;
           alarm.alarm(alarm);
          }
         }
        }
       }
      }
     }
    }
   }
  }
  private const KEYS:Array = ["m", "d", "w", "h", "min", "s"];
  //類型戰KEYS裏的屬性索引是洞喀的
  
  private const ALARM_WEEKLY:int = 2;//每週
  private const ALARM_DAiLY:int = 3;//逐日
  private var _alarms:Array;
  /**
   * @param alarm  {m:1~12, d:1~31, w:1~7, h:0~23, min:0~60, s:0~60, range:xx, alarm:call back function } 各自意義 月 日 周(1~7) 時 分 秒
   *   range:{min:0<=min<60; s:0<=s<60} 從肇端時間開端,指按時間範疇內皆有用,單元分;alarm:回調函數
   *
   */  
  public function addAlarm(alarm:Object):void
  {
   var alarm_type:int = -1;
   //那裏的判斷要從年夜到小,好比擴展了每個月類型的便要先判兌,逆序胰ノ是 每一年>每個月>每週>天天
   if(alarm.hasOwnProperty("w")==true && alarm.w>0)
   {
    alarm_type = ALARM_WEEKLY;
   }else if(alarm.hasOwnProperty("h")==true)
   {
    alarm_type = ALARM_DAiLY;
   }
   if(alarm_type>=0)
   {
    formatAlarm(alarm, alarm_type);
   }
  }
  
  private function formatAlarm(alarm:Object, alarmType:int):void
  {
   var finale_key:String = "";
   for(var i:int = alarmType; i < KEYS.length; ++i)
   {
    var key:String = KEYS[i];
    if(alarm[key]!=null)
    {
     if(alarm[key]<10)
     {
      finale_key += "0";
     }
     finale_key += String(alarm[key]);
    }else{
     finale_key += "00";
    }
   }
   if(_alarms==null)
   {
    _alarms = new Array();
   }
   if(_alarms[alarmType]==null)
   {
    _alarms[alarmType] = new Array();
   }
   if(_alarms[alarmType][finale_key]==null)
   {
    _alarms[alarmType][finale_key] = new Array();
   }
   alarm.alarmed = false;
   _alarms[alarmType][finale_key].push(alarm);
  }
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章