
if( 'undefined' == typeof(_) ) {
  _ = require('underscore')
}



var business = {
  months:['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
  non_sunday:{
    '20111224':[20111225,20111224,20111231]
  }
}


business.zpad = function(str,width) {
  str = ''+str
  width = width || 2
  while( str.length < width ) {
    str = '0'+str
  }
  return str
}


business.ranker = function( inlist, ranks, prop ) {
  var numranks = _.keys(ranks).length
  var outlist = []
  for( var i = 0; i < inlist.length; i++ ) {
    var item = inlist[i]
    var r = item[prop] % 100
    if( ranks[r] ) {
      outlist[0===r?(numranks-1):99-r] = item;
      delete ranks[r]
    }
  }
  return outlist
}


business.DAY  = 24*60*60
business.WEEK = 7*business.DAY

business.now = function() {
  return new Date()
}

business.editiondate = function(date) {
  var fixtz = date.getTimezoneOffset() * 60000
  date.setTime( date.getTime() - fixtz )


  // exceptions
  var ymd = business.yyyymmdd(date)

  var non_sunday = business.non_sunday;

  if('undefined'!=typeof(app)){
    if( app.conf && app.conf.non_sunday) { 
      non_sunday = app.non_sunday
    }
  }
  for( var nonsun in non_sunday ) {
    if( non_sunday[nonsun][1] <= ymd && ymd <= non_sunday[nonsun][2] ) {
      return business.yyyymmdd( parseInt(nonsun,10) )
    }
  }

  var sec = Math.floor( ( (date&&date.getTime()) || business.now().getTime() ) / 1000 )
  var editionweekday = 4 // sunday
  var preveditionday =  
    (-(editionweekday)*business.DAY) +
    business.WEEK * Math.floor( (sec+(editionweekday*business.DAY)) / business.WEEK )
  return new Date(1000*preveditionday);
}

// date->yyyymmdd or yyyymmdd->date
business.yyyymmdd = function(date) {
  if( _.isDate(date) ) { 
    return parseInt(date.getUTCFullYear()+business.zpad(date.getUTCMonth()+1)+business.zpad(date.getUTCDate()),10);
  }
  else {
    var yyyy = Math.floor(date/10000), mm = Math.floor((date % 10000)/100)-1 , dd = date % 100;

    var d = business.now();
    d.setUTCFullYear(yyyy);
    d.setUTCMonth(mm,dd);
    d.setUTCHours(0);
    d.setUTCMinutes(0);
    d.setUTCSeconds(0);
    d.setUTCMilliseconds(0);

    return d;
  }
}


business.iseditionday = function(date) {
  var ymd = business.yyyymmdd(date)
  var edymd = business.yyyymmdd( business.editiondate(date) )
  return ymd === edymd;
}


// edrange = [yyyymmdd (single), yyyymmddyyyymmdd (range), ... ]
business.Access = function( edrange ) {
  var self = this

  edrange = edrange || []

  self.contains = function( editioncode ) {
    var yes = false
    for( var i = 0; i < edrange.length; i++ ) {
      var ed = edrange[i]
      if( ed < 99999999 ) {
        if( editioncode == ed ) {
          yes = true
          break;
        }
      }
      else {
        var start = Math.floor(ed / 100000000)
        var end   = ed % 100000000
        if( start <= editioncode && editioncode <= end ) {
          yes = true
          break;
        }
      }
    }

    return yes
  }


  self.hascurrentsub = function( editioncode ) {
    var yes = false
    for( var i = 0; i < edrange.length; i++ ) {
      var ed = edrange[i]
      if( 99999999 < ed ) {
        var start = Math.floor(ed / 100000000)
        var end   = ed % 100000000
        if( start <= editioncode && editioncode <= end ) {
          yes = true
          break;
        }
      }
    }

    return yes
  }


  self.next = function( editioncode ) {
    var d = business.yyyymmdd(editioncode)
    d = new Date(d.getTime()+(1000*business.WEEK))
    return business.yyyymmdd(d)
  }

  self.access = function( date, whence ) {
    var d = _.isNumber( date) ? business.yyyymmdd(date) : date
    var adjusteddate = d

    // allow for saturday dated stories, and daylight savings
    /* DEL
    if( 18 < d.getUTCHours() && d.getUTCDay()==6 ) {
      adjusteddate = new Date( d.getTime()+(8*60*60*1000) )
    }
    */

    var editiondate = business.editiondate(adjusteddate)

    var editioncode = business.yyyymmdd(adjusteddate) 
    var allow = self.contains( editioncode )

    if( !allow ) {
      var today = business.now()
      var todayedition = business.editiondate(today)
      var todayedcode = business.yyyymmdd(todayedition) 
      allow = self.hascurrentsub(todayedcode)
    }

    if( 'article-select' == whence ) {
      //alert('date:'+date+' add:'+adjusteddate+' edd:'+editiondate+' edc:'+editioncode+' allow:'+allow+' edrange:'+edrange)
    }

    return allow
  }

  // reverse chronological order
  self.list = function() {
    var edlist = []
    for( var i = 0; i < edrange.length; i++ ) {
      var ed = edrange[i]
      if( ed < 99999999 ) {
        edlist.push(ed)
      }
      else {
        var start = Math.floor(ed / 100000000)
        var end   = ed % 100000000
        for( ed = start; ed <= end; ed = self.next(ed) ) {
          edlist.push(ed)
        }
      }
    }
    return edlist.reverse()
  }
}

if( 'undefined' !== typeof(module) ) {
  module.exports = business
}



