/**
 *
 */
function RADateUtils(){
  
  /*
   --------------------------------------------------------
   dateformat.js - Simple date formatter
   Version 1.1 (Update 2008/04/02)
   Copyright (c) 2007-2008 onozaty (http://www.enjoyxstudy.com)
   Released under an MIT-style license.
   For details, see the web site:
   http://www.enjoyxstudy.com/javascript/dateformat/
   --------------------------------------------------------
   patterns
   y : Year         ex. "yyyy" -> "2007", "yy" -> "07"
   M : Month        ex. "MM" -> "05" "12", "M" -> "5" "12"
   d : Day          ex. "dd" -> "09" "30", "d" -> "9" "30"
   H : Hour (0-23)  ex. "HH" -> "00" "23", "H" -> "0" "23"
   m : Minute       ex. "mm" -> "01" "59", "m" -> "1" "59"
   s : Second       ex. "ss" -> "00" "59", "H" -> "0" "59"
   S : Millisecond  ex. "SSS" -> "000" "012" "999",
   "SS" -> "00" "12" "999", "S" -> "0" "12" "999"
   Text can be quoted using single quotes (') to avoid interpretation.
   "''" represents a single quote.
   Useing..
   var fmt = new DateFormat("yyyy/MM/dd HH:mm:ss SSS");
   var str = fmt.format(new Date()); // "2007/05/10 12:21:19 002"
   var date = fmt.parse("2007/05/10 12:21:19 002"); // return Date object
   --------------------------------------------------------
   */
  function DateFormat(pattern){
    this._init.apply(this, arguments);
  };
  
  DateFormat.prototype = {
    _init: function(pattern){
      this.pattern = pattern;
      this._patterns = [];
      
      for (var i = 0; i < pattern.length; i++) {
        var ch = pattern.charAt(i);
        if (this._patterns.length == 0) {
          this._patterns[0] = ch;
        }
        else {
          var index = this._patterns.length - 1;
          if (this._patterns[index].charAt(0) == "'") {
            if (this._patterns[index].length == 1 || this._patterns[index].charAt(this._patterns[index].length - 1) != "'") {
              this._patterns[index] += ch;
            }
            else {
              this._patterns[index + 1] = ch;
            }
          }
          else 
            if (this._patterns[index].charAt(0) == ch) {
              this._patterns[index] += ch;
            }
            else {
              this._patterns[index + 1] = ch;
            }
        }
      }
    },
    
    format: function(date){
    
      var result = [];
      for (var i = 0; i < this._patterns.length; i++) {
        result[i] = this._formatWord(date, this._patterns[i]);
      }
      return result.join('');
    },
    _formatWord: function(date, pattern){
    
      var formatter = this._formatter[pattern.charAt(0)];
      if (formatter) {
        return formatter.apply(this, [date, pattern]);
      }
      else {
        return pattern;
      }
    },
    _formatter: {
      "y": function(date, pattern){
        // Year
        var year = String(date.getFullYear());
        if (pattern.length <= 2) {
          year = year.substring(2, 4);
        }
        else {
          year = this._zeroPadding(year, pattern.length);
        }
        return year;
      },
      "M": function(date, pattern){
        // Month in year
        return this._zeroPadding(String(date.getMonth() + 1), pattern.length);
      },
      "d": function(date, pattern){
        // Day in month
        return this._zeroPadding(String(date.getDate()), pattern.length);
      },
      "H": function(date, pattern){
        // Hour in day (0-23)
        return this._zeroPadding(String(date.getHours()), pattern.length);
      },
      "m": function(date, pattern){
        // Minute in hour
        return this._zeroPadding(String(date.getMinutes()), pattern.length);
      },
      "s": function(date, pattern){
        // Second in minute
        return this._zeroPadding(String(date.getSeconds()), pattern.length);
      },
      "S": function(date, pattern){
        // Millisecond
        return this._zeroPadding(String(date.getMilliseconds()), pattern.length);
      },
      "'": function(date, pattern){
        // escape
        if (pattern == "''") {
          return "'";
        }
        else {
          return pattern.replace(/'/g, '');
        }
      }
    },
    
    _zeroPadding: function(str, length){
      if (str.length >= length) {
        return str;
      }
      
      return new Array(length - str.length + 1).join("0") + str;
    },
    
    
    /// Parser ///
    parse: function(text){
    
      if (typeof text != 'string' || text == '') {
        return null;
      }
      
      var result = {
        year: 1970,
        month: 1,
        day: 1,
        hour: 0,
        min: 0,
        sec: 0,
        msec: 0
      };
      for (var i = 0; i < this._patterns.length; i++) {
        if (text == '') {
          return null; // parse error!!
        }
        text = this._parseWord(text, this._patterns[i], result);
        if (text === null) {
          return null; // parse error!!
        }
      }
      if (text != '') {
        return null; // parse error!!
      }
      return new Date(result.year, result.month - 1, result.day, result.hour, result.min, result.sec, result.msec);
    },
    _parseWord: function(text, pattern, result){
    
      var parser = this._parser[pattern.charAt(0)];
      if (parser) {
        return parser.apply(this, [text, pattern, result]);
      }
      else {
        if (text.indexOf(pattern) != 0) {
          return null;
        }
        else {
          return text.substring(pattern.length);
        }
      }
    },
    _parser: {
      "y": function(text, pattern, result){
        // Year
        var year;
        if (pattern.length <= 2) {
          year = text.substring(0, 2);
          year = year < 70 ? '20' + year : '19' + year;
          text = text.substring(2);
        }
        else {
          var length = (pattern.length == 3) ? 4 : pattern.length;
          year = text.substring(0, length);
          text = text.substring(length);
        }
        if (!this._isNumber(year)) 
          return null; // error
        result.year = parseInt(year, 10);
        return text;
      },
      "M": function(text, pattern, result){
        // Month in year
        var month;
        if (pattern.length == 1 && text.length > 1 &&
        text.substring(0, 2).match(/1[0-2]/) != null) {
          month = text.substring(0, 2);
          text = text.substring(2);
        }
        else {
          month = text.substring(0, pattern.length);
          text = text.substring(pattern.length);
        }
        if (!this._isNumber(month)) 
          return null; // error
        result.month = parseInt(month, 10);
        return text;
      },
      "d": function(text, pattern, result){
        // Day in month
        var day;
        if (pattern.length == 1 && text.length > 1 &&
        text.substring(0, 2).match(/1[0-9]|2[0-9]|3[0-1]/) != null) {
          day = text.substring(0, 2);
          text = text.substring(2);
        }
        else {
          day = text.substring(0, pattern.length);
          text = text.substring(pattern.length);
        }
        if (!this._isNumber(day)) 
          return null; // error
        result.day = parseInt(day, 10);
        return text;
      },
      "H": function(text, pattern, result){
        // Hour in day (0-23)
        var hour;
        if (pattern.length == 1 && text.length > 1 &&
        text.substring(0, 2).match(/1[0-9]|2[0-3]/) != null) {
          hour = text.substring(0, 2);
          text = text.substring(2);
        }
        else {
          hour = text.substring(0, pattern.length);
          text = text.substring(pattern.length);
        }
        if (!this._isNumber(hour)) 
          return null; // error
        result.hour = parseInt(hour, 10);
        return text;
      },
      "m": function(text, pattern, result){
        // Minute in hour
        var min;
        if (pattern.length == 1 && text.length > 1 &&
        text.substring(0, 2).match(/[1-5][0-9]/) != null) {
          min = text.substring(0, 2);
          text = text.substring(2);
        }
        else {
          min = text.substring(0, pattern.length);
          text = text.substring(pattern.length);
        }
        if (!this._isNumber(min)) 
          return null; // error
        result.min = parseInt(min, 10);
        return text;
      },
      "s": function(text, pattern, result){
        // Second in minute
        var sec;
        if (pattern.length == 1 && text.length > 1 &&
        text.substring(0, 2).match(/[1-5][0-9]/) != null) {
          sec = text.substring(0, 2);
          text = text.substring(2);
        }
        else {
          sec = text.substring(0, pattern.length);
          text = text.substring(pattern.length);
        }
        if (!this._isNumber(sec)) 
          return null; // error
        result.sec = parseInt(sec, 10);
        return text;
      },
      "S": function(text, pattern, result){
        // Millimsecond
        var msec;
        if (pattern.length == 1 || pattern.length == 2) {
          if (text.length > 2 && text.substring(0, 3).match(/[1-9][0-9][0-9]/) != null) {
            msec = text.substring(0, 3);
            text = text.substring(3);
          }
          else 
            if (text.length > 1 && text.substring(0, 2).match(/[1-9][0-9]/) != null) {
              msec = text.substring(0, 2);
              text = text.substring(2);
            }
            else {
              msec = text.substring(0, pattern.length);
              text = text.substring(pattern.length);
            }
        }
        else {
          msec = text.substring(0, pattern.length);
          text = text.substring(pattern.length);
        }
        if (!this._isNumber(msec)) 
          return null; // error
        result.msec = parseInt(msec, 10);
        return text;
      },
      "'": function(text, pattern, result){
        // escape
        if (pattern == "''") {
          pattern = "'";
        }
        else {
          pattern = pattern.replace(/'/g, '');
        }
        if (text.indexOf(pattern) != 0) {
          return null; // error
        }
        else {
          return text.substring(pattern.length);
        }
      }
    },
    
    _isNumber: function(str){
      return /^[0-9]*$/.test(str);
    }
  }
  
  /*
   --------------------------------------------------------
   dateformat.js end
   --------------------------------------------------------
   */
  
  /**
   *
   */
  this.getPubDate = function(tId, dFormat){
    var targetId   = tId     || 'w_title';
	var dateFormat = dFormat || 'MM/dd';
	
    var parentObj  = document.getElementById(targetId);
	var children = parentObj.childNodes;
	var tobj;
	for (var i = 0; i < children.length; ++i) {
	  var child = children[i];
	  if (!child) {
	  	continue;
	  }
	  if (!child.tagName) {
	  	continue;
	  }
	  if (child.tagName.toUpperCase() == 'H2') {
        tobj = child;
        break;
	  }
	}
	
    var srcText = tobj ? tobj.innerHTML : '';
    if (!srcText || srcText.length == 0) {
      return '';
    }
    var pubDate = '';
    var dateString = (srcText.match(/^([^（]+)　（(.+?)）$/i) || [])[2];
    if (dateString && dateString.length > 0) {
      try {
	  	// 今日現在の情報を格納したDateオブジェクト
	  	var todayObj  = new Date();
        var thisYear  = todayObj.getFullYear();
		var thisMonth = todayObj.getMonth();

        var dateParser = new DateFormat(dateFormat);
        var dateObj = dateParser.parse(dateString);
		// 記事の月が、今月よりも新しい場合は、実際には昨年の記事
		if (dateObj.getMonth() > thisMonth) {
			dateObj.setYear(thisYear - 1);
		}
		else {
			dateObj.setYear(thisYear);
		}
		
        var dateFormat = new DateFormat('yyyyMMdd');
        pubDate = dateFormat.format(dateObj);
      } 
      catch (e) {
        ;
      }
    }
    return pubDate;
  }
  
  /**
   *
   * @param {Object} string
   * @param {Object} prefix
   */
  function startsWith(string, prefix){
    return string.indexOf(prefix) == 0;
  }
  
  /**
   *
   * @param {Object} url
   * @param {Object} pubDate
   */
  this.getExpirationDate = function (pubDate){
    var expirationDate = '';
    try {
      var dateFormat = new DateFormat('yyyyMMdd');
      var dateObj = dateFormat.parse(pubDate);
      var thisYear = dateObj.getFullYear();
      var thisMonth = dateObj.getMonth();
      var thisDay = dateObj.getDate();
      
	  // 11月・12月の場合
	  if (thisMonth >= 10) {
        dateObj.setYear(thisYear + 1);             // 翌年をセット
        dateObj.setMonth(dateObj.getMonth() - 10); // 2ヶ月先をセット
      }
      else {
        dateObj.setMonth(thisMonth + 2);
	  }
	  
	  // 28日よりあとになる場合は常に28日を設定
	  if (thisDay > 28) {
        dateObj.setDate(28);
	  }
	  
      // 補正後の日付を取得
      expirationDate = dateFormat.format(dateObj);
    } 
    catch (e) {
      ;
    }
    return expirationDate;
  }
}

