var DateUtils = Class.create();
DateUtils.prototype = {

 /**
   *
   */
 initialize: function(){
  this.WeekDays  = new Array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
  this.MonthList = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
 },

 /**
   *
   */
 getDateFormat: function(DateLine){
  /**
    *  RFC 822 (Mon, 15 Aug 2005 15:52:01 +0000)
    *  RSS     (Mon, 15 Aug 2005 15:52:01 +0000)
    *  RFC1123 (Mon, 15 Aug 2005 15:52:01 +0000)
    *  ISO8601 (2005-08-15T15:52:01+0000) 
    *  ATOM    (2005-08-15T15:52:01+0000) 
    *  RFC3339 (2005-08-15T15:52:01+0000) 

    *  YYYYMMDDHHMISS

      DATE_COOKIE (string) 
      HTTP クッキー (例: Monday, 15-Aug-05 15:52:01 UTC) 

      DATE_RFC850 (string) 
      RFC 850 (例: Monday, 15-Aug-05 15:52:01 UTC) 

      DATE_RFC1036 (string) 
      RFC 1036 (例: Mon, 15 Aug 05 15:52:01 +0000) 

      DATE_W3C (string) 
      World Wide Web コンソーシアム (例: 2005-08-15T15:52:01+00:00) 
    **/
  var RegExpObj = new Array();
  this.RegExpObj = new Array();
  // RFC822, RSS
  this.RegExpObj[0] = new RegExp(/(Mon|Tue|Wed|Thu|Fri|Sat|Sun), [0-9]{2} (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)/);
  // ISO8601, ATOM
  this.RegExpObj[1] = new RegExp(/([12][0-9]{3})\-([01][0-9])\-([0123][0-9])T([012][0-9]):([0-5][0-9]):([0-5][0-9])[\+\-][012][0-9]:[0-5][0-9]/);

  if (DateLine.match(this.RegExpObj[0])){  return 'RFC822';    };
  if (DateLine.match(this.RegExpObj[1])){  return 'ISO8601';   };
 },

 /**
   *
   */
 parseDateFormat: function(DateLine){
  var Format = this.getDateFormat(DateLine);
  var Function = 'this.parseDateFormat_' + Format + '("' + DateLine + '")';
  if (typeof (eval ('this.parseDateFormat_' + Format)) == 'function'){
   var Ret = eval (Function);
   return Ret;
  }
 },

 /**
   *  parseDateFormat_RFC822
   */
 parseDateFormat_RFC822: function(DateLine){
  var DateLineArray = DateLine.split(' ');
  var DateArray = {
   Year      : parseInt(DateLineArray[3]),
   Month     : this.ArraySearch(DateLineArray[2], this.MonthList) + 1,
   Day       : parseInt(DateLineArray[1].replace(/^0/, '')),
   Hour      : parseInt(DateLineArray[4].split(':')[0].replace(/^0/, '')),
   Minute    : parseInt(DateLineArray[4].split(':')[1].replace(/^0/, '')),
   Second    : parseInt(DateLineArray[4].split(':')[2].replace(/^0/, '')),
   WeekDayNo : parseInt(this.ArraySearch(DateLineArray[0].replace(/,$/, ''), this.WeekDays))
  }
  return DateArray;
 },

 /**
   *  parseDateFormat_ISO8601
   */
 parseDateFormat_ISO8601: function(DateLine){
  var Reg = DateLine.match(this.RegExpObj[1]);
  var DateArray = {  Year : RegExp.$1,  Month : RegExp.$2,  Day : RegExp.$3, 
                     Hour : RegExp.$4,  Minute : RegExp.$5, Second : RegExp.$6 };
  DateArray = {
    Year      : DateArray.Year,
    Month     : parseInt(DateArray.Month.replace(/^0/, '')),
    Day       : parseInt(DateArray.Day.replace(/^0/, '')),
    Hour      : parseInt(DateArray.Hour.replace(/^0/, '')),
    Minute    : parseInt(DateArray.Minute.replace(/^0/, '')),
    Second    : parseInt(DateArray.Second.replace(/^0/, ''))
   };
 },

 /**
   *  getSerializedDate
   */
 getSerializedDate: function(DateObj){
  if (typeof (DateObj) == 'undefined')
     DateObj = new Date();
  var year   = DateObj.getFullYear().toString();
  var month  = ((DateObj.getMonth() + 1) < 10) ? '0' + (DateObj.getMonth() + 1).toString() : (DateObj.getMonth() + 1).toString();
  var day    = (DateObj.getDate() < 10) ? '0' + DateObj.getDate().toString()       : DateObj.getDate().toString();
  var hour   = (DateObj.getHours() < 10) ? '0' + DateObj.getHours().toString()     : DateObj.getHours().toString();
  var minute = (DateObj.getMinutes() < 10) ? '0' + DateObj.getMinutes().toString() : DateObj.getMinutes().toString();
  var second = (DateObj.getSeconds() < 10) ? '0' + DateObj.getSeconds().toString() : DateObj.getSeconds().toString();
  return (parseInt (year + month + day + hour + minute + second));
 },

 /**
   *  ArraySearch
   */
 ArraySearch : function(Data, Values){
  for (var i = 0; i < Values.length; i++) {
   if (Values[i] == Data) {
    return i;
   }
  }
  return false;
 }


};

