/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var math = require("calculator");
var pathInfo = require("./helper/pathinfo");
var moment = require("moment");
var _ = require('underscore');

var BlogComponent = require("BlogComponent");

function PageComponent() {
    BlogComponent.call(this);
    this.partialContentTemplateURL = __dirname + "/templates/listing.html"
}
PageComponent.prototype = Object.create(BlogComponent.prototype);

PageComponent.prototype.init = function () {
    var list = [];
    var posts = require("resource!" + this.basePath + "/posts").simpleResource.children;
    for each(var post in posts) {
        var blogPostModel = {};
        var createdAt = parseInt(post.getDateTimeProperty("jcr:created"));
        blogPostModel.content = this.transformMarkdown(post.properties.content);
        blogPostModel.properties = post.properties;
        blogPostModel.path = post.path;
        blogPostModel.date = moment(createdAt).format('MMMM Do YYYY, h:mm:ss a');
        list.push(blogPostModel);
    }

    this.model.posts = list;
}

module.exports = new PageComponent();