/**
 *
 */
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
   --------------------------------------------------------
   */
  
  /**
   *
   * @param {Object} string
   * @param {Object} prefix
   */
  function startsWith(string, prefix){
    return string.indexOf(prefix) == 0;
  }
  
  /**
   * 
   * @param {Object} tId
   * @param {Object} df
   */
  this.getPubDate = function(tId, df){
    var targetId = tId || 'date';
    var dFormat  = df  || 'yyyy年M月d日';
    
    var tobj = document.getElementById(targetId);
    var srcText = tobj ? tobj.innerHTML : '';
	
    // 置換
    srcText = srcText.replace(/[\t\r\n]+/g, "");
    var elemArray = (srcText.match(/^([0-9]+年[0-9]+月)([0-9]+)・[0-9]+(日).+?$/) || []);
    if (elemArray.length >= 2) {
      srcText = elemArray[1] + elemArray[2] + elemArray[3];
    }
  
    srcText = srcText.replace("号", "");
	srcText = srcText.replace(" ", "");
	
	// 全角数字を半角数字に置換
    var str = '';
    for (var i = 0; i < srcText.length; i++) {
      var c = srcText.charCodeAt(i);
      if (c >= 65296 && c <= 65305) {
        str += String.fromCharCode(c - 65248);
      }
      else {
        str += srcText.charAt(i);
      }
    }
	srcText = str;
	
    if (!srcText || srcText.length == 0) {
      return '';
    }
	
    var pubDate = '';
    var dateString = srcText;
    if (dateString && dateString.length > 0) {
      try {
        var dateParser = new DateFormat(dFormat);
        var dateObj = dateParser.parse(dateString);
        var dateFormat = new DateFormat('yyyyMMdd');
        pubDate = dateFormat.format(dateObj);
      }
      catch (e) {
        try {
          var dateParser = new DateFormat("yy年M月d日");
          var dateObj = dateParser.parse(dateString);
          var dateFormat = new DateFormat('yyyyMMdd');
          pubDate = dateFormat.format(dateObj);
        }
        catch (e2) {
          try {
            var dateParser = new DateFormat("yyyy年M月");
            var dateObj = dateParser.parse(dateString);
            var dateFormat = new DateFormat('yyyyMMdd');
            pubDate = dateFormat.format(dateObj);
          }
          catch (e3) {
            ;
          }
        }
      }
    }
    return pubDate;
  }
  
  /**
   * 
   * @param {Object} pDate
   * @param {Object} tId
   * @param {Object} mId
   */
  this.getExpirationDate = function(pDate, tId, mId){
    var pubDate = pDate;
    var titleId = tId || 'kiji-title';
    var mediaId = mId || 'media';
    if (!pubDate) {
      return '';
    }
    
    var tObj = document.getElementById(titleId);
    if (!tObj) {
      return '';
    }
    var tText = tObj.innerHTML;
    tText = tText.replace(/[\t\r\n]+/g, "");
    if (!tText || tText.length == 0) {
      return;
    }
    
    var mObj = document.getElementById(mediaId);
    if (!mObj) {
      return '';
    }
    var mText = mObj.innerHTML;
    mText = mText.replace(/[\t\r\n]+/g, "");
    if (!mText || mText.length == 0) {
      return '';
    }
    
    if (mText.indexOf('フードケミカル') > 0 || mText.indexOf('FOOD STYLE21') > 0) {
      return '';
    }
    
    if (tText.indexOf('食檀') > 0 || tText.indexOf('康壇') > 0) {
      return '';
    }
    
    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();
      
      // 10月～12月の場合
      if (thisMonth >= 9) {
        dateObj.setYear(thisYear + 1);            // 翌年をセット
        dateObj.setMonth(dateObj.getMonth() - 9); // 3-12をセット
      }
      else {
        dateObj.setMonth(thisMonth + 3);
      }
    
      // 28日よりあとになる場合は常に28日を設定
      if (thisDay > 28) {
        dateObj.setDate(28);
      }
      
      // 補正後の日付を取得
      expirationDate = dateFormat.format(dateObj);
    }
    catch (e) {
      ;
    }
    return expirationDate;
  }
}

