;
; 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.
;

;
; OODT Balance
; Web Application Base Framework
;
; Application Configuration File. This file should be called 'config.ini' and 
; should reside in the root directory of your site. This file follows standard
; ini file conventions. Lines beginning with ';' are comments and are ignored.
;

[Application Environment]

; site_root
; If the site lives at the document root of the server, this will be '/'. On
; the other hand, if the site lives in a sub-directory of the document root, 
; this will be the full path (starting from the document root) to the root 
; directory of the site. Always start with a slash (/) and always omit the
; trailing slash. 
;
; examples: 
;    (document root) http://domain.com/          (site_root: '/')
;    (subdirectory)  http://domain.com/apps/site (site_root: '/apps/site')
;
; Note: The value for site_root should always match the value for 'RewriteBase'
;       in the .htaccess file located in the site's root directory.
;
site_root = /


[Application Content]

; views_dir
; This is the directory inside your site root where your application's views
; reside. This should be a relative path (./). If you have set things up
; according to the instructions, the framework will use the location of this 
; file (config.ini) as the base.
;
; Note: The value provided is simply an example. It is up to you to provide
;       valid paths for your environment.
views_dir = ./views

; header_file_path
; This is the file that contains a site-wide header code/layout to be included
; in each view. This should be a relative path (./). If you have set things up
; according to the instructions, the framework will use the location of this 
; file (config.ini) as the base.
;
; Note: The value provided is simply an example. It is up to you to provide
;       valid paths for your environment.
header_file_path = ./views/common/header.php

; footer_file_path
; This is the file that contains a site-wide footer code/layout to be included
; in each view. This should be a relative path (./). If you have set things up
; according to the instructions, the framework will use the location of this 
; file (config.ini) as the base.
;
; Note: The value provided is simply an example. It is up to you to provide
;       valid paths for your environment.
footer_file_path = ./views/common/footer.php


[AUTH & AUTH]

; Authorization error redirect path to login page
authorization_redirect_url = /
