Initial commit
86
admin/creditcards.php
Normal file
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
include '../php/classes/page.php';
|
||||
include 'functions/func_xml.php';
|
||||
|
||||
$page = new Page();
|
||||
$page->init_user();
|
||||
|
||||
# make sure the user is logged in before he has access to the
|
||||
# admin section
|
||||
if(!$page->user()->check_role('admin'))
|
||||
header('Location: login.php?message=1');
|
||||
|
||||
$page->attr('title','Administrate FTI: Credit Cards');
|
||||
// to make jquery be loaded first
|
||||
$page->useJSFile('jquery.min.js');
|
||||
$page->addJSFile('admin.js');
|
||||
$page->useCSSFile('admin.css');
|
||||
|
||||
$page->content('admin/creditcards.php');
|
||||
$page->layout('admin_layout.php');
|
||||
$page->menu('admin/menu.php');
|
||||
|
||||
# get news posts
|
||||
$cards = xml_get_from_file($FILES['ccinfo']);
|
||||
$page->data('creditcards',array_reverse($cards->xpath('creditcard')));
|
||||
|
||||
if(isset($_REQUEST['do']))
|
||||
{
|
||||
if($_REQUEST['do'] == 'view')
|
||||
{
|
||||
# find the credit card
|
||||
$card = FindCreditCard($cards->xpath('creditcard'), $_GET['id']);
|
||||
|
||||
# if the card was found above, send it to the template
|
||||
if($card)
|
||||
{
|
||||
$page->content('admin/creditcards.view.php');
|
||||
$page->data('card',$card);
|
||||
}
|
||||
# card not found, display error
|
||||
else
|
||||
$page->addError('That credit card entry does not exist.');
|
||||
}
|
||||
else if($_REQUEST['do'] == 'delete')
|
||||
{
|
||||
# find the credit card
|
||||
$card = FindCreditCard($cards->xpath('creditcard'), $_GET['id']);
|
||||
|
||||
if($card)
|
||||
{
|
||||
$page->content('admin/creditcards.delete.php');
|
||||
$page->data('card',$card);
|
||||
}
|
||||
else
|
||||
$page->addError('That credit card entry does not exist.');
|
||||
}
|
||||
else if($_REQUEST['do'] == 'reallydelete')
|
||||
{
|
||||
$cardIdx = FindCreditCard($cards->xpath('creditcard'),$_POST['id'],true);
|
||||
unset($cards->creditcard[$cardIdx]);
|
||||
file_put_contents($FILES['ccinfo'],$cards->asXML());
|
||||
|
||||
$page->data("creditcards",$cards);
|
||||
$page->addMessage('Credit card information successfully deleted.');
|
||||
}
|
||||
}
|
||||
|
||||
$page->process();
|
||||
|
||||
############################################################### FindCreditCard #
|
||||
function FindCreditCard($cards, $cardId, $returnIdx = false)
|
||||
{
|
||||
for($c = 0; $c < count($cards); $c++)
|
||||
{
|
||||
if((int)$cards[$c]['id'] == (int)$cardId)
|
||||
if($returnIdx)
|
||||
return $c;
|
||||
else
|
||||
return $cards[$c];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
?>
|
||||
38
admin/index.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
include '../php/classes/page.php';
|
||||
include 'functions/func_xml.php';
|
||||
|
||||
$page = new Page();
|
||||
$page->init_user();
|
||||
|
||||
# make sure the user is logged in before he has access to the
|
||||
# admin section
|
||||
if(!$page->user()->check_role('admin'))
|
||||
header('Location: login.php?message=1');
|
||||
|
||||
$page->attr('title','Administrate FTI');
|
||||
// to make jquery be loaded first
|
||||
$page->useJSFile('jquery.min.js');
|
||||
$page->addJSFile('admin.js');
|
||||
$page->useCSSFile('admin.css');
|
||||
|
||||
$page->content('admin/home.php');
|
||||
$page->layout('admin_layout.php');
|
||||
$page->menu('admin/menu.php');
|
||||
|
||||
# get news posts
|
||||
$news = xml_get_from_file($FILES['news']);
|
||||
$page->data('news',array_reverse($news->xpath('newsitem')));
|
||||
|
||||
# get credit cards
|
||||
$cards = xml_get_from_file($FILES['ccinfo']);
|
||||
$page->data('creditcards',array_reverse($cards->xpath('creditcard')));
|
||||
|
||||
# get passports
|
||||
$passports = xml_get_from_file($FILES['passportinfo']);
|
||||
$page->data('passports',$passports->xpath('passport'));
|
||||
|
||||
$page->process();
|
||||
|
||||
?>
|
||||
188
admin/linksandnumbers.php
Normal file
@@ -0,0 +1,188 @@
|
||||
<?php
|
||||
|
||||
include '../php/classes/page.php';
|
||||
include 'functions/func_xml.php';
|
||||
|
||||
$page = new Page();
|
||||
$page->init_user();
|
||||
|
||||
# make sure the user is logged in before he has access to the
|
||||
# admin section
|
||||
if(!$page->user()->check_role('admin'))
|
||||
header('Location: login.php?message=1');
|
||||
|
||||
$page->attr('title','Administrate FTI: Links and Numbers');
|
||||
// to make jquery be loaded first
|
||||
$page->useJSFile('jquery.min.js');
|
||||
$page->addJSFile('admin.js');
|
||||
$page->useCSSFile('admin.css');
|
||||
|
||||
$page->content('admin/linksandnumbers.php');
|
||||
$page->layout('admin_layout.php');
|
||||
$page->menu('admin/menu.php');
|
||||
|
||||
# get news posts
|
||||
$linksandnumbers = xml_get_from_file($FILES['linksandnumbers']);
|
||||
$items = $linksandnumbers->xpath('item');
|
||||
$page->data('linksandnumbers',$items);
|
||||
|
||||
if(isset($_REQUEST['do']))
|
||||
{
|
||||
if($_REQUEST['do'] == 'add' || $_REQUEST['do'] == 'edit')
|
||||
{
|
||||
$page->addJSFile('admin/textboxbuttons.js');
|
||||
// this may be changed below, if the item is not found
|
||||
$page->content('admin/linksandnumbers.add.edit.php');
|
||||
|
||||
if($_GET['do'] == 'edit')
|
||||
{
|
||||
$item = FindItemById($items,$_GET['id']);
|
||||
|
||||
if(!is_null($item))
|
||||
{
|
||||
$page->data('item',$item);
|
||||
$page->data('editing',true);
|
||||
}
|
||||
else
|
||||
{
|
||||
$page->addError('Links and numbers item does not exist. Please try again.');
|
||||
$page->content('admin/linksandnumbers.php');
|
||||
}
|
||||
}
|
||||
}
|
||||
else if($_REQUEST['do'] == 'delete')
|
||||
{
|
||||
$item = FindItemById($items,$_GET['id']);
|
||||
|
||||
if(!is_null($item))
|
||||
{
|
||||
$page->content('admin/linksandnumbers.delete.php');
|
||||
$page->data('item',$item);
|
||||
}
|
||||
else
|
||||
$page->addError('Links and items number does not exist. Please try again.');
|
||||
}
|
||||
else if($_REQUEST['do'] == 'reallyadd')
|
||||
{
|
||||
$newItem = $linksandnumbers->addChild('item');
|
||||
$newItem->addChild('title',stripslashes($_POST['title']));
|
||||
$newItem->addChild('subtitle',stripslashes($_POST['subtitle']));
|
||||
$newItem->addChild('type',$_POST['type']);
|
||||
$newItem->addChild('text',"<![CDATA[".stripslashes($_POST['text'])."]]>");
|
||||
|
||||
if(!empty($_POST['title']) && !empty($_POST['text']))
|
||||
{
|
||||
$nextId = GetNextId($items);
|
||||
$newItem->addAttribute('id',$nextId);
|
||||
|
||||
if(file_put_contents($FILES['linksandnumbers'],xml_fix_cdata($linksandnumbers->asXML())))
|
||||
{
|
||||
$page->addMessage('Links and numbers item added.');
|
||||
$page->data('linksandnumbers',$linksandnumbers->xpath('item'));
|
||||
}
|
||||
else
|
||||
{
|
||||
$page->addError('Could not add links and numbers item. Please try again later.');
|
||||
$page->data('item',$newItem);
|
||||
$page->addJSFile('admin/textboxbuttons.js');
|
||||
$page->content('admin/linksandnumbers.add.edit.php');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$page->addError('Please enter a title and text.');
|
||||
$page->data('item',$newItem);
|
||||
$page->addJSFile('admin/textboxbuttons.js');
|
||||
$page->content('admin/linksandnumbers.add.edit.php');
|
||||
}
|
||||
}
|
||||
else if($_REQUEST['do'] == 'reallyedit')
|
||||
{
|
||||
$itemIdx = FindItemById($items,$_POST['id'],true);
|
||||
$page->data('editing',true);
|
||||
|
||||
if(!is_null($itemIdx))
|
||||
{
|
||||
$linksandnumbers->item[$itemIdx]->title = stripslashes($_POST['title']);
|
||||
$linksandnumbers->item[$itemIdx]->subtitle = stripslashes($_POST['subtitle']);
|
||||
$linksandnumbers->item[$itemIdx]->type = $_POST['type'];
|
||||
$linksandnumbers->item[$itemIdx]->text = "<![CDATA[".stripslashes($_POST['text'])."]]>";
|
||||
|
||||
if(!empty($_POST['title']) && !empty($_POST['text']))
|
||||
{
|
||||
if(file_put_contents($FILES['linksandnumbers'],xml_fix_cdata($linksandnumbers->asXML())))
|
||||
$page->addMessage('Links and numbers item saved.');
|
||||
else
|
||||
{
|
||||
$page->addError('Could not save links and numbers item. Please try again later.');
|
||||
$page->data('item',$linksandnumbers->item[$itemIdx]);
|
||||
$page->addJSFile('admin/textboxbuttons.js');
|
||||
$page->content('admin/linksandnumbers.add.edit.php');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$page->addError('Please enter a title and text.');
|
||||
$page->data('item',$linksandnumbers->item[$itemIdx]);
|
||||
$page->addJSFile('admin/textboxbuttons.js');
|
||||
$page->content('admin/linksandnumbers.add.edit.php');
|
||||
}
|
||||
}
|
||||
else
|
||||
$page->addError('Links and numbers item does not exit. Please try again.');
|
||||
}
|
||||
else if($_REQUEST['do'] == 'reallydelete')
|
||||
{
|
||||
$itemIdx = FindItemById($items,$_POST['id'],true);
|
||||
if(!is_null($itemIdx))
|
||||
{
|
||||
unset($linksandnumbers->item[$itemIdx]);
|
||||
|
||||
if(file_put_contents($FILES['linksandnumbers'],xml_fix_cdata($linksandnumbers->asXML())))
|
||||
{
|
||||
$page->addMessage('Links and numbers item deleted.');
|
||||
$page->data('linksandnumbers',$linksandnumbers->xpath('item'));
|
||||
}
|
||||
else
|
||||
{
|
||||
$page->addError('Could not delete news item. Please try again later.');
|
||||
$page->data('item',$linksandnumbers->item[$itemIdx]);
|
||||
$page->content('admin/linksandnumbers.delete.php');
|
||||
}
|
||||
}
|
||||
else
|
||||
$page->addError('Links and numbers item does not exist. Please try again.');
|
||||
}
|
||||
}
|
||||
|
||||
$page->process();
|
||||
|
||||
################################################################# FindItemById #
|
||||
function FindItemById($items, $itemId, $returnIdx = false)
|
||||
{
|
||||
for($c = 0; $c < count($items); $c++)
|
||||
{
|
||||
if((int)$items[$c]['id'] === (int)$itemId)
|
||||
if($returnIdx)
|
||||
return $c;
|
||||
else
|
||||
return $items[$c];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#################################################################### GetNextId #
|
||||
function GetNextId($items)
|
||||
{
|
||||
$largestId = 1;
|
||||
for($c = 0; $c < count($items); $c++)
|
||||
{
|
||||
if($largestId < (int)$items[$c]['id'])
|
||||
$largestId = (int)$items[$c]['id'];
|
||||
}
|
||||
|
||||
return $largestId + 1;
|
||||
}
|
||||
|
||||
?>
|
||||
37
admin/login.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
include '../php/classes/page.php';
|
||||
|
||||
$page = new Page();
|
||||
$page->init_user();
|
||||
|
||||
# log the user out, if requested
|
||||
if(isset($_GET['logout']))
|
||||
{
|
||||
$page->user()->logout();
|
||||
$page->addMessage('Logout successful.');
|
||||
}
|
||||
else
|
||||
{
|
||||
# log the user in and redirect if the user successfully logged in
|
||||
if(isset($_POST['username']) && isset($_POST['password']))
|
||||
if($page->user()->login($_POST['username'],$_POST['password']))
|
||||
header('Location: index.php');
|
||||
else
|
||||
$page->addError('Username and/or password incorrect.');
|
||||
|
||||
if(isset($_GET['message']))
|
||||
$page->addMessage('Please login to use the admin section.');
|
||||
}
|
||||
|
||||
$page->attr('title','Login');
|
||||
$page->display('header',false);
|
||||
$page->display('footer',false);
|
||||
$page->display('menu',false);
|
||||
$page->layout('admin_layout.php');
|
||||
$page->useCSSFile('admin.css');
|
||||
$page->content('admin/login.php');
|
||||
|
||||
$page->process();
|
||||
|
||||
?>
|
||||
180
admin/news.php
Normal file
@@ -0,0 +1,180 @@
|
||||
<?php
|
||||
|
||||
include '../php/classes/page.php';
|
||||
include 'functions/func_xml.php';
|
||||
|
||||
$page = new Page();
|
||||
$page->init_user();
|
||||
|
||||
# make sure the user is logged in before he has access to the
|
||||
# admin section
|
||||
if(!$page->user()->check_role('admin'))
|
||||
header('Location: login.php?message=1');
|
||||
|
||||
$page->attr('title','Administrate FTI: News');
|
||||
// to make jquery be loaded first
|
||||
$page->useJSFile('jquery.min.js');
|
||||
$page->addJSFile('admin.js');
|
||||
$page->useCSSFile('admin.css');
|
||||
|
||||
$page->content('admin/news.php');
|
||||
$page->layout('admin_layout.php');
|
||||
$page->menu('admin/menu.php');
|
||||
|
||||
# get news posts
|
||||
$news = xml_get_from_file($FILES['news']);
|
||||
$newsItems = $news->xpath('newsitem');
|
||||
$page->data('news',array_reverse($newsItems));
|
||||
|
||||
if(isset($_REQUEST['do']))
|
||||
{
|
||||
if($_REQUEST['do'] == 'add' || $_REQUEST['do'] == 'edit')
|
||||
{
|
||||
$page->addJSFile('admin/textboxbuttons.js');
|
||||
// this may be changed below, if the news post is not found
|
||||
$page->content('admin/news.add.edit.php');
|
||||
|
||||
if($_GET['do'] == 'edit')
|
||||
{
|
||||
$newsItem = FindNewsItem($newsItems,$_GET['id']);
|
||||
|
||||
if(!is_null($newsItem))
|
||||
{
|
||||
$page->data('newsitem',$newsItem);
|
||||
$page->data('editing',true);
|
||||
}
|
||||
else
|
||||
{
|
||||
$page->addError('News post does not exist. Please try again.');
|
||||
$page->content('admin/news.php');
|
||||
}
|
||||
}
|
||||
}
|
||||
else if($_REQUEST['do'] == 'delete')
|
||||
{
|
||||
$newsItem = FindNewsItem($newsItems,$_GET['id']);
|
||||
|
||||
if(!is_null($newsItem))
|
||||
{
|
||||
$page->content('admin/news.delete.php');
|
||||
$page->data('newsitem',$newsItem);
|
||||
}
|
||||
else
|
||||
$page->addError('News post does not exist. Please try again.');
|
||||
}
|
||||
else if($_REQUEST['do'] == 'reallyadd')
|
||||
{
|
||||
$newItem = $news->addChild('newsitem');
|
||||
$newItem->addChild('title',stripslashes($_POST['title']));
|
||||
$newItem->addChild('text',"<![CDATA[".stripslashes($_POST['text'])."]]>");
|
||||
|
||||
if(!empty($_POST['title']) && !empty($_POST['text']))
|
||||
{
|
||||
$nextId = GetNextId($newsItems);
|
||||
$newItem->addAttribute('id',$nextId);
|
||||
|
||||
if(file_put_contents($FILES['news'],xml_fix_cdata($news->asXML())))
|
||||
{
|
||||
$page->addMessage('News item added.');
|
||||
$page->data('news',array_reverse($news->xpath('newsitem')));
|
||||
}
|
||||
else
|
||||
{
|
||||
$page->addError('Could not add news item. Please try again later.');
|
||||
$page->data('newsitem',$newItem);
|
||||
$page->content('admin/news.add.edit.php');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$page->addError('Please enter a title and text.');
|
||||
$page->data('newsitem',$newItem);
|
||||
$page->content('admin/news.add.edit.php');
|
||||
}
|
||||
}
|
||||
else if($_REQUEST['do'] == 'reallyedit')
|
||||
{
|
||||
$newsItemIdx = FindNewsItem($newsItems,$_POST['id'],true);
|
||||
$page->data('editing',true);
|
||||
|
||||
if(!is_null($newsItemIdx))
|
||||
{
|
||||
$news->newsitem[$newsItemIdx]->title = stripslashes($_POST['title']);
|
||||
$news->newsitem[$newsItemIdx]->text = "<![CDATA[".stripslashes($_POST['text'])."]]>";
|
||||
|
||||
if(!empty($_POST['title']) && !empty($_POST['text']))
|
||||
{
|
||||
if(file_put_contents($FILES['news'],xml_fix_cdata($news->asXML())))
|
||||
$page->addMessage('News item saved.');
|
||||
else
|
||||
{
|
||||
$page->addError('Could not save news item. Please try again later.');
|
||||
$page->data('newsitem',$news->newsitem[$newsItemIdx]);
|
||||
$page->content('admin/news.add.edit.php');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$page->addError('Please enter a title and text.');
|
||||
$page->data('newsitem',$news->newsitem[$newsItemIdx]);
|
||||
$page->content('admin/news.add.edit.php');
|
||||
}
|
||||
}
|
||||
else
|
||||
$page->addError('News item does not exit. Please try again.');
|
||||
}
|
||||
else if($_REQUEST['do'] == 'reallydelete')
|
||||
{
|
||||
$newsItemIdx = FindNewsItem($newsItems,$_POST['id'],true);
|
||||
if(!is_null($newsItemIdx))
|
||||
{
|
||||
unset($news->newsitem[$newsItemIdx]);
|
||||
|
||||
if(file_put_contents($FILES['news'],xml_fix_cdata($news->asXML())))
|
||||
{
|
||||
$page->addMessage('News item deleted.');
|
||||
$page->data('news',array_reverse($news->xpath('newsitem')));
|
||||
}
|
||||
else
|
||||
{
|
||||
$page->addError('Could not delete news item. Please try again later.');
|
||||
$page->data('newsitem',$news->newsitem[$newsItemIdx]);
|
||||
$page->content('admin/news.delete.php');
|
||||
}
|
||||
}
|
||||
else
|
||||
$page->addError('News item does not exist. Please try again.');
|
||||
}
|
||||
}
|
||||
|
||||
$page->process();
|
||||
|
||||
################################################################# FindNewsItem #
|
||||
function FindNewsItem($items, $itemId, $returnIdx = false)
|
||||
{
|
||||
for($c = 0; $c < count($items); $c++)
|
||||
{
|
||||
if((int)$items[$c]['id'] === (int)$itemId)
|
||||
if($returnIdx)
|
||||
return $c;
|
||||
else
|
||||
return $items[$c];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#################################################################### GetNextId #
|
||||
function GetNextId($items)
|
||||
{
|
||||
$largestId = 1;
|
||||
for($c = 0; $c < count($items); $c++)
|
||||
{
|
||||
if($largestId < (int)$items[$c]['id'])
|
||||
$largestId = (int)$items[$c]['id'];
|
||||
}
|
||||
|
||||
return $largestId + 1;
|
||||
}
|
||||
|
||||
?>
|
||||
86
admin/passports.php
Normal file
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
include '../php/classes/page.php';
|
||||
include 'functions/func_xml.php';
|
||||
|
||||
$page = new Page();
|
||||
$page->init_user();
|
||||
|
||||
# make sure the user is logged in before he has access to the
|
||||
# admin section
|
||||
if(!$page->user()->check_role('admin'))
|
||||
header('Location: login.php?message=1');
|
||||
|
||||
$page->attr('title','Administrate FTI: Passports');
|
||||
// to make jquery be loaded first
|
||||
$page->useJSFile('jquery.min.js');
|
||||
$page->addJSFile('admin.js');
|
||||
$page->useCSSFile('admin.css');
|
||||
|
||||
$page->content('admin/passports.php');
|
||||
$page->layout('admin_layout.php');
|
||||
$page->menu('admin/menu.php');
|
||||
|
||||
# get passports
|
||||
$passports = xml_get_from_file($FILES['passportinfo']);
|
||||
$page->data('passports',array_reverse($passports->xpath('passport')));
|
||||
|
||||
if(isset($_REQUEST['do']))
|
||||
{
|
||||
if($_REQUEST['do'] == 'view')
|
||||
{
|
||||
# find the passport
|
||||
$passport = FindItemById($passports->xpath('passport'), $_GET['id']);
|
||||
|
||||
# if the passport was found above, send it to the template
|
||||
if($passport)
|
||||
{
|
||||
$page->content('admin/passports.view.php');
|
||||
$page->data('passport',$passport);
|
||||
}
|
||||
# passport not found, display error
|
||||
else
|
||||
$page->addError('That passport does not exist.');
|
||||
}
|
||||
else if($_REQUEST['do'] == 'delete')
|
||||
{
|
||||
# find the passport
|
||||
$passport = FindItemById($passports->xpath('passport'), $_GET['id']);
|
||||
|
||||
if($passport)
|
||||
{
|
||||
$page->content('admin/passports.delete.php');
|
||||
$page->data('passport',$passport);
|
||||
}
|
||||
else
|
||||
$page->addError('That passport does not exist.');
|
||||
}
|
||||
else if($_REQUEST['do'] == 'reallydelete')
|
||||
{
|
||||
$passportIdx = FindItemById($passports->xpath('passport'),$_POST['id'],true);
|
||||
unset($passports->passport[$passportIdx]);
|
||||
file_put_contents($FILES['passportinfo'],$passports->asXML());
|
||||
|
||||
$page->data("passports",$passports->xpath('passport'));
|
||||
$page->addMessage('Passport information successfully deleted.');
|
||||
}
|
||||
}
|
||||
|
||||
$page->process();
|
||||
|
||||
################################################################# FindItemById #
|
||||
function FindItemById($items, $itemId, $returnIdx = false)
|
||||
{
|
||||
for($c = 0; $c < count($items); $c++)
|
||||
{
|
||||
if((int)$items[$c]['id'] == (int)$itemId)
|
||||
if($returnIdx)
|
||||
return $c;
|
||||
else
|
||||
return $items[$c];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
?>
|
||||
81
bookingrequest.php
Normal file
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
include 'php/classes/page.php';
|
||||
include 'functions/func_xml.php';
|
||||
|
||||
$page = new Page();
|
||||
|
||||
$page->attr('title','Booking Request');
|
||||
$page->useJSFile('jquery.min.js');
|
||||
$page->addJSFile('jquery-ui.min.js');
|
||||
$page->addJSFile('default.js');
|
||||
$page->addJSFile("bookingrequest.js");
|
||||
|
||||
$page->addCSSFile("smoothness/jquery-ui.css");
|
||||
$page->addCSSFile("bookingrequest.css");
|
||||
# the default template for this page is this one
|
||||
$page->content('bookingrequest.php');
|
||||
|
||||
# if the form has been submitted, then first present the information
|
||||
# to be reviewed by the user, then submit the information to John
|
||||
if(!empty($_POST))
|
||||
{
|
||||
# go to the review page if the user has just clicked on Review Information
|
||||
# or, go to the form again with the information in it if the user clicked
|
||||
# on "Edit Information"
|
||||
if(isset($_POST['review_submit']) || isset($_POST['edit']))
|
||||
{
|
||||
$page->data('info',$_POST);
|
||||
# only if we are moving to the review information page to we not display
|
||||
# the form
|
||||
if(isset($_POST['review_submit']))
|
||||
$page->content('bookingrequest_review.php');
|
||||
}
|
||||
# otherwise, we submit the form to john, since it has been reviewed
|
||||
else
|
||||
{
|
||||
# cobble together the message to send to john
|
||||
$message = '';
|
||||
foreach($_POST as $key => $value)
|
||||
{
|
||||
# skip the buttons
|
||||
if($key == 'edit' || $key == 'submit' || $key == "FirstName" || $key == "MiddleName"
|
||||
|| $key == "LastName" || $key == "Gender" || $key == "Birthdate")
|
||||
continue;
|
||||
|
||||
$readable_key = ucfirst(str_replace('_',' ',$key));
|
||||
$message .= str_repeat(" ", (27 - strlen($key) - 1)) . "$readable_key: $value\n";
|
||||
}
|
||||
|
||||
$spaces = str_repeat(" ", 15);
|
||||
for($idx = 0; $idx < count($_POST["FirstName"]); $idx++)
|
||||
{
|
||||
if(empty($_POST["FirstName"][$idx]))
|
||||
continue;
|
||||
|
||||
$message .= $spaces . "Passenger " . ($idx + 1) . ": " . $_POST["FirstName"][$idx];
|
||||
$message .= " " . $_POST["MiddleName"][$idx] . " " . $_POST["LastName"][$idx];
|
||||
$message .= ", " . $_POST["Gender"][$idx] . ", " . $_POST["Birthdate"][$idx];
|
||||
$message .= "\n";
|
||||
}
|
||||
|
||||
# send the e-mail, print success message if successful
|
||||
if(mail($CONFIG['email'],'Booking Request Received', $message, "From: {$CONFIG['email']}\r\nReply-To: {$_POST['email_address']}"))
|
||||
{
|
||||
$page->addMessage('Your request has been sent, thank you. You will hear
|
||||
from us within 3 business days, or sooner.');
|
||||
}
|
||||
# if the e-mail did not succeed, give the post data to the table
|
||||
# and print an error message
|
||||
else
|
||||
{
|
||||
$page->addError('We could not send your request at this time. Please try again later.');
|
||||
$page->data('info',$_POST);
|
||||
$page->content('bookingrequest_review.php');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$page->process();
|
||||
|
||||
?>
|
||||
49
creditcard.php
Normal file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
include 'php/classes/page.php';
|
||||
include 'functions/func_xml.php';
|
||||
|
||||
$page = new Page();
|
||||
|
||||
$page->attr('title','Send Credit Card Information');
|
||||
$page->content('creditcard.php');
|
||||
// to make jquery be loaded first
|
||||
$page->useJSFile('jquery.min.js');
|
||||
$page->addJSFile('default.js');
|
||||
|
||||
# save form when it's submitted
|
||||
if(!empty($_POST))
|
||||
{
|
||||
$ccFile = xml_get_from_file($FILES['ccinfo']);
|
||||
$lastID = $ccFile->creditcard[count($ccFile) - 1]['id'];
|
||||
|
||||
$newCC = $ccFile->addChild('creditcard');
|
||||
$newCC->addAttribute('id',$lastID + 1);
|
||||
|
||||
foreach($_POST as $key => $value)
|
||||
{
|
||||
# skip any forum values not starting with 'billing_' or 'card_'
|
||||
if(strpos($key,'billing_') === false && strpos($key,'card_') === false)
|
||||
continue;
|
||||
|
||||
# clean up form contents
|
||||
$value = strip_tags($value);
|
||||
$value = htmlspecialchars($value);
|
||||
|
||||
# add new child
|
||||
$newCC->addChild($key,$value);
|
||||
}
|
||||
|
||||
# save the new xml
|
||||
file_put_contents($FILES['ccinfo'],$ccFile->asXML());
|
||||
# give user a success message
|
||||
$page->addMessage('Your credit card information has been successfully submitted. Thank you.');
|
||||
# send email notification that new cc info is available
|
||||
$message = "You have another set of credit card information available online.";
|
||||
$subject = 'New credit card information available.';
|
||||
mail($CONFIG['email'],$subject,$message,"From: ".$CONFIG['email']);
|
||||
}
|
||||
|
||||
$page->process();
|
||||
|
||||
?>
|
||||
12
history.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
include 'php/classes/page.php';
|
||||
|
||||
$page = new Page();
|
||||
|
||||
$page->attr('title','History of FTI');
|
||||
$page->content('history.php');
|
||||
|
||||
$page->process();
|
||||
|
||||
?>
|
||||
20
index.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
include 'php/classes/page.php';
|
||||
include 'functions/func_xml.php';
|
||||
|
||||
$page = new Page();
|
||||
$page->init_user();
|
||||
|
||||
$page->attr('title','Your Christian Travel Resource');
|
||||
$page->content('home.php');
|
||||
$page->useJSFile('jquery.min.js');
|
||||
$page->addJSFile('default.js');
|
||||
|
||||
# get news items
|
||||
$news = xml_get_from_file($FILES['news']);
|
||||
$page->data('news',$news->xpath('newsitem'));
|
||||
|
||||
$page->process();
|
||||
|
||||
?>
|
||||
19
itinerary_beforecontinuing.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
include 'php/classes/page.php';
|
||||
|
||||
$page = new Page();
|
||||
|
||||
$page->attr('title','Before You Continue To View Your Itinerary');
|
||||
|
||||
if(isset($_GET['type']) && !empty($_GET['type']))
|
||||
{
|
||||
$page->data('itinerary_type',$_GET['type']);
|
||||
$page->content('itinerary_beforecontinuing.php');
|
||||
}
|
||||
else
|
||||
header('Location: viewyouritinerary.php');
|
||||
|
||||
$page->process();
|
||||
|
||||
?>
|
||||
50
linksandnumbers.php
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
include 'php/classes/page.php';
|
||||
include 'functions/func_xml.php';
|
||||
|
||||
$page = new Page();
|
||||
|
||||
$page->attr('title','Links and Numbers');
|
||||
$linksandnumbers = xml_get_from_file($FILES['linksandnumbers']);
|
||||
$items = $linksandnumbers->xpath('item');
|
||||
|
||||
if(isset($_GET['id']))
|
||||
{
|
||||
$itemIdx = FindItemById($items,$_GET['id'],true);
|
||||
|
||||
if(!is_null($itemIdx))
|
||||
{
|
||||
$page->data('item',$items[$itemIdx]);
|
||||
$page->content('linksandnumbers.subpage.php');
|
||||
}
|
||||
else
|
||||
{
|
||||
$page->addError('Links and numbers item does not exist.');
|
||||
$page->content('linksandnumbers.php');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$page->data('items',$items);
|
||||
$page->content('linksandnumbers.php');
|
||||
}
|
||||
|
||||
$page->process();
|
||||
|
||||
################################################################# FindItemById #
|
||||
function FindItemById($items, $itemId, $returnIdx = false)
|
||||
{
|
||||
for($c = 0; $c < count($items); $c++)
|
||||
{
|
||||
if((int)$items[$c]['id'] === (int)$itemId)
|
||||
if($returnIdx)
|
||||
return $c;
|
||||
else
|
||||
return $items[$c];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
?>
|
||||
57
passportinfo.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
include 'php/classes/page.php';
|
||||
include 'functions/func_xml.php';
|
||||
|
||||
$page = new Page();
|
||||
|
||||
$page->attr('title','Submit Your Passport Information');
|
||||
$page->content('passportinfo.php');
|
||||
// to make jquery be loaded first
|
||||
$page->useJSFile('jquery.min.js');
|
||||
$page->addJSFile('default.js');
|
||||
|
||||
# if form has not been submitted, then is probably the initial request
|
||||
# for the page, so just display the form
|
||||
if(!empty($_POST))
|
||||
{
|
||||
#print_r($_POST);
|
||||
$passportFile = xml_get_from_file($FILES['passportinfo']);
|
||||
$lastID = $passportFile->passport[count($passportFile) - 1]['id'];
|
||||
|
||||
# clean each entry up
|
||||
foreach($_POST as $key => $val)
|
||||
{
|
||||
foreach($_POST[$key] as $key2 => $val2)
|
||||
{
|
||||
$_POST[$key][$key2] = strip_tags($_POST[$key][$key2]);
|
||||
$_POST[$key][$key2] = htmlspecialchars($_POST[$key][$key2]);
|
||||
}
|
||||
}
|
||||
|
||||
# add new passports to file
|
||||
for($c = 0; $c < count($_POST['passport_name']); $c++)
|
||||
{
|
||||
$newPassport = $passportFile->addChild('passport');
|
||||
$newPassport->addAttribute('id',$lastID + 1);
|
||||
$newPassport->addChild('name',$_POST['passport_name'][$c]);
|
||||
$newPassport->addChild('birthdate',$_POST['passport_birthdate'][$c]);
|
||||
$newPassport->addChild('number',$_POST['passport_number'][$c]);
|
||||
$newPassport->addChild('expiration_date',$_POST['passport_expirationdate'][$c]);
|
||||
$newPassport->addChild('expiration_country',$_POST['passport_country'][$c]);
|
||||
}
|
||||
|
||||
# save the new xml file
|
||||
file_put_contents($FILES['passportinfo'],$passportFile->asXML());
|
||||
# add success message
|
||||
$page->addMessage('Your passport information has been successfully submitted.');
|
||||
|
||||
# email to let john know he's got a new entry
|
||||
$message = "You have another set of passport information available online.";
|
||||
$subject = 'New passport information available.';
|
||||
mail($CONFIG['email'],$subject,$message,"From: ".$CONFIG['email']);
|
||||
}
|
||||
|
||||
$page->process();
|
||||
|
||||
?>
|
||||
1
php/.htaccess
Normal file
@@ -0,0 +1 @@
|
||||
Options -indexes
|
||||
344
php/classes/page.php
Executable file
@@ -0,0 +1,344 @@
|
||||
<?php
|
||||
# start a session
|
||||
session_start();
|
||||
|
||||
# we set the PHP error handler to use this function
|
||||
set_error_handler("page_errors");
|
||||
# only care about errors normally
|
||||
#error_reporting(E_ERROR | E_USER_ERROR);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
# set the include path so that our templates can always include
|
||||
# relative to the root template folder
|
||||
$DOCROOT = str_replace($_SERVER['SCRIPT_NAME'],'',$_SERVER['SCRIPT_FILENAME']);
|
||||
$templates_path = $DOCROOT.'/site';
|
||||
$php_path = $DOCROOT.'/php';
|
||||
set_include_path(get_include_path() . PATH_SEPARATOR . $templates_path . PATH_SEPARATOR . $php_path);
|
||||
|
||||
# include configuration options
|
||||
include_once 'includes/config.php';
|
||||
# require the user class to handle users
|
||||
require_once 'classes/user.php';
|
||||
|
||||
class Page
|
||||
{
|
||||
################################################################################
|
||||
# PRIVATE DATA
|
||||
private $title,$pageName, $lang;
|
||||
private $cssFiles = array(),$jsFiles = array();
|
||||
private $header, $footer, $content, $menu, $layout;
|
||||
private $display,$data;
|
||||
private $absPath,$absURL,$site,$templates,$js,$css,$graphics;
|
||||
private $messages = array(),$errors = array();
|
||||
private $user;
|
||||
|
||||
################################################################################
|
||||
# PUBLIC FUNCTIONS
|
||||
# constructor
|
||||
public function __construct()
|
||||
{
|
||||
# set our paths
|
||||
$this->absPath = str_replace($_SERVER['SCRIPT_NAME'],'',$_SERVER['SCRIPT_FILENAME']).'/';
|
||||
$this->absURL = preg_replace('/^(.*)\/\w+\.php$/','$1',$_SERVER['SCRIPT_NAME']).'/';
|
||||
$this->site = 'site/';
|
||||
$this->templates = $this->absPath.$this->site;
|
||||
$this->js = '/'.$this->site . 'javascript/';
|
||||
$this->css = '/'.$this->site . 'css/';
|
||||
$this->graphics = '/'.$this->site . 'graphics/';
|
||||
|
||||
# the page language is automatically pulled from a language
|
||||
# cookie names 'lang'
|
||||
if(isset($_GET['lang']))
|
||||
{
|
||||
$this->lang = $_GET['lang'];
|
||||
setcookie('lang',$_GET['lang'],time() + 60*60*24*365);
|
||||
|
||||
# if the lang parameter is empty, we want to get rid of the cookie
|
||||
if(empty($_GET['lang']))
|
||||
unset($_COOKIE['lang']);
|
||||
}
|
||||
else if(isset($_COOKIE['lang']) && !empty($_COOKIE['lang']))
|
||||
$this->lang = $_COOKIE['lang'];
|
||||
else
|
||||
$this->lang = 'en';
|
||||
|
||||
$this->templates .= $this->lang .'/';
|
||||
$this->graphics .= $this->lang .'/';
|
||||
|
||||
# default values for title and pageName
|
||||
$this->title = isset($TITLE_PREFIX) ? $TITLE_PREFIX : 'Welcome!';
|
||||
$this->pageName = preg_replace('/^.*\/(\w+)\.php$/','$1',$_SERVER['SCRIPT_NAME']);
|
||||
|
||||
# elements of our page
|
||||
$this->header = $this->templates . 'header.php';
|
||||
$this->footer = $this->templates . 'footer.php';
|
||||
$this->content = $this->templates . 'home.php';
|
||||
$this->menu = $this->templates . 'menu.php';
|
||||
$this->layout = 'default_layout.php';
|
||||
|
||||
# by default, the header, footer and content are all displayed
|
||||
$this->display = array(
|
||||
'header' => true,
|
||||
'footer' => true,
|
||||
'content' => true,
|
||||
'menu' => true
|
||||
);
|
||||
|
||||
# load default css and js files
|
||||
array_push($this->cssFiles,$this->css . 'default.css');
|
||||
array_push($this->jsFiles,$this->js . 'default.js');
|
||||
}
|
||||
# automatically load all css files from folder
|
||||
public function autoloadCSS()
|
||||
{
|
||||
# find all CSS files in css folder
|
||||
$this->cssFiles = preg_grep('/\.css$/',scandir($this->absPath . $this->css));
|
||||
|
||||
# make each path relative to absURL
|
||||
foreach($this->cssFiles as $key => $value)
|
||||
$this->cssFiles[$key] = $this->css . $value;
|
||||
}
|
||||
# automatically load all javascript files from folder
|
||||
public function autoloadJS()
|
||||
{
|
||||
# find all js files in javascript folder
|
||||
$this->jsFiles = preg_grep('/\.js$/',scandir($this->absPath . $this->js));
|
||||
|
||||
# make each path relative to absURL
|
||||
foreach($this->jsFiles as $key => $value)
|
||||
$this->jsFiles[$key] = $this->js . $value;
|
||||
}
|
||||
# processes all or part of the page
|
||||
public function process($part = NULL)
|
||||
{
|
||||
# it is possible to process the header or footer by
|
||||
# itself or just the content, or the entire page
|
||||
if($part == 'header')
|
||||
$this->_processHeader();
|
||||
else if($part == 'footer')
|
||||
$this->_processFooter();
|
||||
else if($part == 'content')
|
||||
$this->_processContent();
|
||||
else
|
||||
$this->_processPage();
|
||||
}
|
||||
# adds a js file to ones already pulled from standard
|
||||
# folder
|
||||
public function addJSFile($new_file)
|
||||
{
|
||||
# a list of files can be passed to add several js files at once
|
||||
if(func_num_args() > 1)
|
||||
{
|
||||
$files = func_get_args();
|
||||
foreach($files as $js_file)
|
||||
{
|
||||
array_push($this->jsFiles, $this->js . $js_file);
|
||||
}
|
||||
}
|
||||
# add single file with relative path
|
||||
else
|
||||
{
|
||||
array_push($this->jsFiles, $this->js . $new_file);
|
||||
}
|
||||
}
|
||||
# replaces all other js files with this one
|
||||
public function useJSFile($new_file)
|
||||
{
|
||||
$this->jsFiles = array($this->js . $new_file);
|
||||
}
|
||||
# adds a css file to ones already pulled from standard folder
|
||||
public function addCSSFile($new_file)
|
||||
{
|
||||
# a list of files can be passed to add several CSS files at once
|
||||
if(func_num_args() > 1)
|
||||
{
|
||||
$files = func_get_args();
|
||||
foreach($files as $css_file)
|
||||
{
|
||||
array_push($this->cssFiles, $this->css . $css_file);
|
||||
}
|
||||
}
|
||||
# add file with relative path
|
||||
else
|
||||
{
|
||||
array_push($this->cssFiles, $this->css . $new_file);
|
||||
}
|
||||
}
|
||||
# replaces all other css files with this one
|
||||
public function useCSSFile($new_file)
|
||||
{
|
||||
$this->cssFiles = array($this->css . $new_file);
|
||||
}
|
||||
# adds an error message to the array
|
||||
public function addError($err)
|
||||
{
|
||||
array_push($this->errors,$err);
|
||||
}
|
||||
# adds non-error message to the array
|
||||
public function addMessage($msg)
|
||||
{
|
||||
array_push($this->messages,$msg);
|
||||
}
|
||||
################################################################################
|
||||
# SETTERS/GETTERS
|
||||
# return the user object
|
||||
public function init_user()
|
||||
{
|
||||
$this->user = new User($this->absPath.$this->site);
|
||||
}
|
||||
public function user()
|
||||
{
|
||||
if(empty($this->user))
|
||||
$this->init_user();
|
||||
|
||||
return $this->user;
|
||||
}
|
||||
# you can pass data to the template via this variable
|
||||
public function data($key,$value = NULL)
|
||||
{
|
||||
if(!is_null($value))
|
||||
$this->data[$key] = $value;
|
||||
else
|
||||
return($this->data[$key]);
|
||||
}
|
||||
# you can turn off parts of the page by setting it's
|
||||
# corresponding display element to false
|
||||
public function display($page_element,$value = NULL)
|
||||
{
|
||||
if(!is_null($value))
|
||||
$this->display[$page_element] = $value;
|
||||
else
|
||||
return($this->display[$page_element]);
|
||||
}
|
||||
# setter/getter for header file
|
||||
public function header($new_header = NULL)
|
||||
{
|
||||
if(!is_null($new_header))
|
||||
$this->header = $this->templates . $new_header;
|
||||
else
|
||||
return $this->header;
|
||||
}
|
||||
# setter/getter for footer file
|
||||
public function footer($new_footer = NULL)
|
||||
{
|
||||
if(!is_null($new_footer))
|
||||
$this->footer = $this->templates . $new_footer;
|
||||
else
|
||||
return $this->footer;
|
||||
}
|
||||
# setter/getter for content file
|
||||
public function content($new_content = NULL)
|
||||
{
|
||||
if(!is_null($new_content))
|
||||
$this->content = $this->templates . $new_content;
|
||||
else
|
||||
return $this->content;
|
||||
}
|
||||
# setter/getter for menu file
|
||||
public function menu($new_menu = NULL)
|
||||
{
|
||||
if(!is_null($new_menu))
|
||||
$this->menu = $this->templates . $new_menu;
|
||||
else
|
||||
return $this->menu;
|
||||
}
|
||||
# setter/getter for layout file
|
||||
public function layout($new_layout = NULL)
|
||||
{
|
||||
if(!is_null($new_layout))
|
||||
$this->layout = $new_layout;
|
||||
else
|
||||
return $this->layout;
|
||||
}
|
||||
|
||||
# accessor/modifier for page attributes
|
||||
public function attr($attr,$value = NULL)
|
||||
{
|
||||
global $CONFIG;
|
||||
# the case when we are setting an attribute
|
||||
if(!is_null($value))
|
||||
{
|
||||
switch($attr)
|
||||
{
|
||||
case 'lang':
|
||||
$this->lang = $value;
|
||||
$this->templates = $this->site;
|
||||
$this->templates .= $this->lang .'/';
|
||||
$this->graphics .= $this->lang .'/';
|
||||
$this->header = $this->templates . 'header.php';
|
||||
$this->footer = $this->templates . 'footer.php';
|
||||
$this->content = $this->templates . 'home.php';
|
||||
break;
|
||||
case 'title':
|
||||
$this->title = $CONFIG['title_prefix'].': '.$value;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
# the case when we are getting an attribute
|
||||
else
|
||||
{
|
||||
switch($attr)
|
||||
{
|
||||
case 'lang':
|
||||
return $this->lang;
|
||||
break;
|
||||
case 'title':
|
||||
return $this->title;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
################################################################################
|
||||
# PRIVATE FUNCTIONS
|
||||
private function _processPage()
|
||||
{
|
||||
include $this->absPath . $this->site . 'layout/html.php';
|
||||
}
|
||||
private function _processHeader()
|
||||
{
|
||||
include $this->header;
|
||||
}
|
||||
private function _processFooter()
|
||||
{
|
||||
include $this->footer;
|
||||
}
|
||||
private function _processContent()
|
||||
{
|
||||
include $this->content;
|
||||
}
|
||||
}
|
||||
|
||||
################################################################## page_errors #
|
||||
function page_errors($errno, $errstr, $errfile, $errline, $errcontext)
|
||||
{
|
||||
global $page;
|
||||
|
||||
# don't do anything with the message if error_reporting
|
||||
# is too low for this type of error
|
||||
if(!(error_reporting() & $errno))
|
||||
return true;
|
||||
|
||||
switch($errno)
|
||||
{
|
||||
case E_USER_ERROR:
|
||||
$page->addError($errstr);
|
||||
break;
|
||||
case E_NOTICE:
|
||||
case E_WARNING:
|
||||
case E_USER_WARNING:
|
||||
case E_USER_NOTICE:
|
||||
$page->addMessage($errstr.$errno.$errfile.$errline);
|
||||
break;
|
||||
default:
|
||||
$page->addError("$errno: $errstr on $errline in $errfile");
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
?>
|
||||
95
php/classes/user.php
Normal file
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
class User
|
||||
{
|
||||
##############################################################################
|
||||
# PRIVATE DATA
|
||||
private $password, $username, $loggedin, $role;
|
||||
private $user_data;
|
||||
##############################################################################
|
||||
# PUBLIC FUNCTIONS
|
||||
public function __construct($site_path)
|
||||
{
|
||||
$this->user_data = simplexml_load_file($site_path.'data/users/users.xml');
|
||||
$this->username = $_SESSION['username'];
|
||||
$this->loggedin = $_SESSION['_loggedin'];
|
||||
$this->role = $_SESSION['userrole'];
|
||||
}
|
||||
public function __destruct()
|
||||
{
|
||||
# save the session data when the object goes out of context
|
||||
$_SESSION['username'] = $this->username;
|
||||
$_SESSION['_loggedin'] = $this->loggedin;
|
||||
$_SESSION['userrole'] = $this->role;
|
||||
}
|
||||
# see if a user is logged in
|
||||
public function user_exists()
|
||||
{
|
||||
return $this->loggedin;
|
||||
}
|
||||
# check if the user has a role equal to what is passed
|
||||
public function check_role($role_to_check)
|
||||
{
|
||||
$role_to_check = strtolower($role_to_check);
|
||||
if(($role_to_check == $this->role) && $this->loggedin)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
public function login($username,$password)
|
||||
{
|
||||
foreach($this->user_data->user as $user)
|
||||
{
|
||||
if($username == (string)$user->username)
|
||||
{
|
||||
$hash = sha1($password);
|
||||
#print $hash;
|
||||
if($hash == (string)$user->password)
|
||||
{
|
||||
$this->username = $username;
|
||||
$this->password = $hash;
|
||||
$this->loggedin = true;
|
||||
$this->role = (string)$user->role;
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
# log the user out
|
||||
public function logout()
|
||||
{
|
||||
# delete cookie
|
||||
setcookie('PHPSESSID','',time()-3600);
|
||||
# delete the session entirely
|
||||
session_unset();
|
||||
|
||||
# reset object vars
|
||||
$this->loggedin = false;
|
||||
$this->username = NULL;
|
||||
$this->password = NULL;
|
||||
$this->role = NULL;
|
||||
|
||||
return true;
|
||||
}
|
||||
##############################################################################
|
||||
# SETTERS/GETTERS
|
||||
public function username($new_username = NULL)
|
||||
{
|
||||
if(!is_null($new_username))
|
||||
$this->username = $new_username;
|
||||
else
|
||||
return $this->username;
|
||||
}
|
||||
public function role()
|
||||
{
|
||||
return $this->role;
|
||||
}
|
||||
##############################################################################
|
||||
# PRIVATE FUNCTIONS
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
58
php/functions/func_file.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
################################################ FUNCTION: file_process_upload #
|
||||
function file_process_upload($input_name,$save_path,$overwrite = false,$replace_regex = "/[^A-Za-z0-9]+/")
|
||||
{
|
||||
$no_errs = true;
|
||||
$clean_names = array();
|
||||
if(!is_dir($save_path))
|
||||
{
|
||||
trigger_error('Path is not a directory.',E_USER_ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!is_array($_FILES[$input_name]['tmp_name']))
|
||||
{
|
||||
foreach($_FILES[$input_name] as $key => $value)
|
||||
$_FILES[$input_name][$key] = array($_FILES[$input_name][$key]);
|
||||
}
|
||||
|
||||
foreach($_FILES[$input_name]['tmp_name'] as $key => $value)
|
||||
{
|
||||
if(!is_uploaded_file($_FILES[$input_name]['tmp_name'][$key]))
|
||||
{
|
||||
$no_errs = false;
|
||||
trigger_error('File "'.$_FILES[$input_name]['name'][$key].'" is not an uploaded file.',E_USER_ERROR);
|
||||
}
|
||||
|
||||
$clean_name = $_FILES[$input_name]['name'][$key];
|
||||
# find the extension
|
||||
preg_match("/(\.\S+)$/",$clean_name,$matches);
|
||||
$ext = $matches[1];
|
||||
# take the extension off of the file name
|
||||
$clean_name = str_replace($ext,'',$clean_name);
|
||||
$clean_name = preg_replace($replace_regex,'_',$clean_name);
|
||||
|
||||
# move the uploaded file to the new location, unless a file with the same name
|
||||
# is already there
|
||||
if(file_exists($save_path.'/'.$clean_name.$ext) and !$overwrite)
|
||||
{
|
||||
$no_errs = false;
|
||||
trigger_error('File "'.$_FILES[$input_name]['name'][$key].'" already exists.', E_USER_ERROR);
|
||||
}
|
||||
if(move_uploaded_file($_FILES[$input_name]['tmp_name'][$key],$save_path.'/'.$clean_name.$ext))
|
||||
array_push($clean_names,$clean_name.$ext);
|
||||
else
|
||||
{
|
||||
$no_errs = false;
|
||||
trigger_error('File "'.$_FILES[$input_name]['name'][$key].'" could not be moved to permanent location.', E_USER_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
if(count($clean_names) == 1)
|
||||
return($clean_names[0]);
|
||||
else
|
||||
return($clean_names);
|
||||
}
|
||||
|
||||
?>
|
||||
150
php/functions/func_filesystem.php
Executable file
@@ -0,0 +1,150 @@
|
||||
<?php
|
||||
#################################################################################
|
||||
# #
|
||||
# written by benjamin ramey #
|
||||
# bsr@rameydesign.net #
|
||||
# #
|
||||
# This file contains: #
|
||||
# Functions that perform various filesystem tasks such as removing #
|
||||
# unwanted types of files/folders from an array of files and folders #
|
||||
# in a folder #
|
||||
# #
|
||||
#################################################################################
|
||||
|
||||
############################################# FUNCTION: filesys_get_folder_tree #
|
||||
# returns: html of folder tree
|
||||
# parameters: path to root folder
|
||||
function filesys_get_folder_tree($path)
|
||||
{
|
||||
global $_DOC_ROOT,$_SCRIPT_FOLDER;
|
||||
# variable that will hold all the HTML for the folder
|
||||
$folderhtml = '';
|
||||
# get folder contents in alphabetical order
|
||||
$folder_contents = scandir($path);
|
||||
# the url is used so that people can download/look at these files through
|
||||
# the browser, a doc_root path wouldn't work, of course
|
||||
$url = str_replace($_DOC_ROOT,"$_SCRIPT_FOLDER",$path);
|
||||
|
||||
# one by one, set $element to a file or folder inside the passed folder
|
||||
foreach($folder_contents as $element)
|
||||
{
|
||||
# ignore current and parent folders
|
||||
if( ($element != '.') and ($element != '..') )
|
||||
{
|
||||
# make sure each is_dir call is not using cached information
|
||||
# from last is_dir check
|
||||
clearstatcache();
|
||||
# if $element is a folder, call this function recursively and
|
||||
# create HTML for this subfolder
|
||||
if( is_dir("$path/$element") )
|
||||
{
|
||||
$folderhtml .= "
|
||||
<div class='folder_name' id='${element}_name'
|
||||
onclick='ExpandFolder(this)'
|
||||
onmouseover='ChangeFolderNameBG(this,0)'
|
||||
onmouseout='ChangeFolderNameBG(this,1)'>
|
||||
+ $element
|
||||
</div>
|
||||
<div class='sub_folder' id='${element}_folder'>";
|
||||
$folderhtml .= filesys_get_folder_tree("$path/$element");
|
||||
$folderhtml .= "
|
||||
</div>\n\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
# get the size of this file in kilobytes
|
||||
$file_size_kb = intval(filesize($path.'/'.$element) / 1024);
|
||||
$folderhtml .= "
|
||||
+ <a href='/$url/$element'>$element</a>
|
||||
($file_size_kb Kb)<br />\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $folderhtml;
|
||||
}
|
||||
|
||||
################################################ FUNCTION: filesys_dirs_present #
|
||||
# returns: true or false
|
||||
# parameters: path to directory to inspect, pattern to match directory name
|
||||
# against
|
||||
function filesys_dirs_present($path,$pattern = "/.*/")
|
||||
{
|
||||
# make sure the path passed here is really a directory we can't
|
||||
# check anything but a directory, since only directory will contain
|
||||
# other directories, duh
|
||||
$handle = is_dir($path) ? opendir($path) : NULL ;
|
||||
if(empty($handle))
|
||||
{ return(NULL); }
|
||||
|
||||
# set through each child in this directory and see if the child
|
||||
# is directory but not the parent or current directory
|
||||
# readdir returns FALSE when no children are left to inspect
|
||||
while($child = readdir($handle) and $child !== false)
|
||||
{
|
||||
# make sure each is_dir call is not using cached information
|
||||
# from last is_dir check
|
||||
clearstatcache();
|
||||
# check if this child is directory and whether it
|
||||
# matches the user given pattern or not
|
||||
if(is_dir($path.'/'.$child)
|
||||
and ($child !== '..')
|
||||
and ($child !== '.')
|
||||
and (preg_match($pattern,$child)) )
|
||||
{
|
||||
# we can return true with the first matching folder we find
|
||||
# this is an OR operation
|
||||
return(true);
|
||||
}
|
||||
}
|
||||
|
||||
# if we get here, no matching folders were found, so none exist
|
||||
# so we return false
|
||||
return(false);
|
||||
}
|
||||
|
||||
######################################### FUNCTION: filesys_get_wanted_children #
|
||||
# returns: array of wanted dir children
|
||||
# parameters: 1) path to directory; 2) command to remove [files,folders]
|
||||
# 3) a pattern to match folder/file names against
|
||||
function filesys_get_wanted_children($path,$exclude,$pattern = "/.*/")
|
||||
{
|
||||
# the cmd can be passed as either all cap or not, so conform it
|
||||
# here to lower case
|
||||
$exclude = strtolower($exclude);
|
||||
|
||||
# fill an array full of the directory children, but only, of course if
|
||||
# the passed path is really to a directory
|
||||
$children = is_dir($path) ? scandir($path) : NULL ;
|
||||
if(empty($children))
|
||||
{ return(NULL); }
|
||||
|
||||
# remove the current and parent directories
|
||||
$children = preg_grep("/^\.{1,2}$/",$children,PREG_GREP_INVERT);
|
||||
# get only the children that match the pattern
|
||||
$children = preg_grep($pattern,$children);
|
||||
|
||||
# if files are to be removed, remove them
|
||||
if($exclude == 'files')
|
||||
{
|
||||
foreach($children as $key => $value)
|
||||
{
|
||||
if(!is_dir($path.'/'.$value))
|
||||
unset($children[$key]);
|
||||
}
|
||||
}
|
||||
# if folders are to be removed, remove them
|
||||
else if($exclude == 'folders')
|
||||
{
|
||||
foreach($children as $key => $value)
|
||||
{
|
||||
if(is_dir($path.'/'.$value))
|
||||
unset($children[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
# return the array of directory children, free of the bad little ones
|
||||
return($children);
|
||||
}
|
||||
|
||||
?>
|
||||
63
php/functions/func_xml.php
Normal file
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
################################################### FUNCTION: xml_random_child #
|
||||
function xml_random_child($xml_file)
|
||||
{
|
||||
$xml = xml_get_from_file($xml_file);
|
||||
$children = $xml->children();
|
||||
$count = count($children);
|
||||
|
||||
return($children[rand(0,$count-1)]);
|
||||
}
|
||||
|
||||
################################################## FUNCTION: xml_get_from_file #
|
||||
function xml_get_from_file($file_path)
|
||||
{
|
||||
if(!file_exists($file_path))
|
||||
{
|
||||
trigger_error('XML file "'.$file_path.'" does not exist!');
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return simplexml_load_file($file_path);
|
||||
}
|
||||
|
||||
################################################ FUNCTION: xml_nl_to_paragraph #
|
||||
function xml_nl_to_paragraph($string)
|
||||
{
|
||||
$string = '<p>'.preg_replace('#([\r\n]\s*?[\r\n]){2,}#','</p>$0<p>',$string).'</p>';
|
||||
$string = str_replace('<p></p>','',$string);
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
################################################### FUNCTION: xml_parse_bbcode #
|
||||
function xml_parse_bbcode($string)
|
||||
{
|
||||
$codes = array('[b]','[/b]','[i]','[/i]','[/link]');
|
||||
$translation = array('<strong>','</strong>','<em>','</em>','</a>');
|
||||
|
||||
// replace bbcode items from above
|
||||
$string = str_replace($codes,$translation,$string);
|
||||
|
||||
// deal with [link]s
|
||||
$pattern = "#\[link href=([^\]]+)\]#";
|
||||
$replacement = "<a href='$1' title='$1'>";
|
||||
$string = preg_replace($pattern,$replacement,$string);
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
###################################################### FUNCTION: xml_fix_cdata #
|
||||
function xml_fix_cdata($string)
|
||||
{
|
||||
$find[] = '<![CDATA[';
|
||||
$replace[] = '<![CDATA[';
|
||||
|
||||
$find[] = ']]>';
|
||||
$replace[] = ']]>';
|
||||
|
||||
return $string = str_replace($find, $replace, $string);
|
||||
}
|
||||
|
||||
?>
|
||||
15
php/includes/config.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
$CONFIG = array(
|
||||
'title_prefix' => 'Friendship Tours International',
|
||||
'email' => 'Friendship Tours Intl <travel@friendshiptours.org>',
|
||||
);
|
||||
|
||||
$FILES = array(
|
||||
'news' => $DOCROOT.'/site/data/news.xml',
|
||||
'passportinfo' => $DOCROOT.'/site/data/passportinfo.xml',
|
||||
'ccinfo' => $DOCROOT.'/site/data/creditcards.xml',
|
||||
'linksandnumbers' => $DOCROOT.'/site/data/linksandnumbers.xml',
|
||||
);
|
||||
|
||||
?>
|
||||
1
site/.htaccess
Normal file
@@ -0,0 +1 @@
|
||||
Options -indexes
|
||||
212
site/css/admin.css
Normal file
@@ -0,0 +1,212 @@
|
||||
/***********************************************
|
||||
* Default styles for: friendshiptours.org Admin section
|
||||
* Author: Benjamin Ramey
|
||||
* E-mail: ben.ramey@gmail.com
|
||||
* Created: Wed Jan 16 16:52:38 CST 2008
|
||||
***********************************************/
|
||||
|
||||
/***********************************************
|
||||
Main element styles
|
||||
***********************************************/
|
||||
body {
|
||||
font-family: Arial;
|
||||
}
|
||||
h1 {
|
||||
text-indent: -10000px;
|
||||
}
|
||||
h1 a {
|
||||
display: block;
|
||||
width: 600px;
|
||||
height: 137px;
|
||||
background: url(/site/graphics/logo.gif) no-repeat top center transparent;
|
||||
}
|
||||
h3 {
|
||||
margin: 25px auto 0px;
|
||||
}
|
||||
p {
|
||||
margin: 10px auto 20px;
|
||||
}
|
||||
ul#admin_nav {
|
||||
list-style-type: none;
|
||||
padding: 4px 0px;
|
||||
background: #336699;
|
||||
}
|
||||
ul#admin_nav li {
|
||||
display: inline;
|
||||
margin: 0 5px;
|
||||
}
|
||||
ul#admin_nav li a {
|
||||
display: inline;
|
||||
padding: 6px;
|
||||
background: transparent;
|
||||
color: white;
|
||||
font-size: 0.9em;
|
||||
text-decoration: none;
|
||||
}
|
||||
ul#admin_nav li a:hover {
|
||||
background: #333;
|
||||
}
|
||||
#index #index_link a,
|
||||
#news #news_link a,
|
||||
#linksandnumbers #linksandnumbers_link a,
|
||||
#creditcards #creditcards_link a,
|
||||
#passports #passports_link a
|
||||
{
|
||||
background: #333;
|
||||
}
|
||||
#content {
|
||||
margin: 10px 20px;
|
||||
}
|
||||
#footer {
|
||||
margin-top: 20px;
|
||||
padding: 10px;
|
||||
font-size: 0.8em;
|
||||
border-top: 2px solid #333;
|
||||
color: #666;
|
||||
text-align: center;
|
||||
}
|
||||
#messages {
|
||||
margin: 10px 0;
|
||||
padding: 2px;
|
||||
background: #FFFF66;
|
||||
}
|
||||
#messages ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
#errors {
|
||||
margin: 10px 0;
|
||||
padding: 2px;
|
||||
background: #CC0000;
|
||||
color: white;
|
||||
}
|
||||
#errors ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
/***********************************************
|
||||
Summary/data table styles
|
||||
***********************************************/
|
||||
.summary_table, .data_table {
|
||||
border-width: 1px 0px;
|
||||
border-color: #999;
|
||||
border-style: solid;
|
||||
}
|
||||
.summary_data {
|
||||
padding-right: 10px;
|
||||
}
|
||||
.summary_data:hover {
|
||||
background: #fcfcfc;
|
||||
}
|
||||
.summary_actions {
|
||||
padding-left: 10px;
|
||||
border-left: 1px #ccc solid;
|
||||
}
|
||||
.summary_actions:hover {
|
||||
background: #fcfcfc;
|
||||
}
|
||||
.data_key {
|
||||
text-align: right;
|
||||
font-weight: bold;
|
||||
}
|
||||
.data_value {}
|
||||
|
||||
/***********************************************
|
||||
Form styles
|
||||
***********************************************/
|
||||
.login-box {
|
||||
width: 400px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.form_button_group {
|
||||
margin: 6px 0px;
|
||||
text-align: left;
|
||||
width: 600px;
|
||||
}
|
||||
a.form_button:link, a.form_button:visited {
|
||||
display: inline;
|
||||
padding: 2px 6px;
|
||||
border: 1px solid black;
|
||||
text-decoration: none;
|
||||
color: black;
|
||||
}
|
||||
a.form_button:hover {
|
||||
background: black;
|
||||
color: white;
|
||||
}
|
||||
fieldset {
|
||||
margin: 10px;
|
||||
border: 0;
|
||||
}
|
||||
fieldset legend {
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
p.field, p.error_field, p.date {
|
||||
position: relative;
|
||||
width: 190px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
p.error_field {
|
||||
font-weight: bold;
|
||||
color: red;
|
||||
}
|
||||
p.field_medium, p.error_field_medium {
|
||||
position: relative;
|
||||
width: 250px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
p.field_long, p.error_field_long {
|
||||
position: relative;
|
||||
width: 400px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
span.field_details {
|
||||
display: block;
|
||||
width: 380px;
|
||||
position: relative;
|
||||
left: 100%;
|
||||
font-size: 0.9em;
|
||||
padding: 4px 0;
|
||||
margin: 4px 0 0;
|
||||
}
|
||||
p.field span.field_content {
|
||||
width: 400px;
|
||||
position: absolute;
|
||||
left: 100%;
|
||||
margin-left: 10px;
|
||||
}
|
||||
p.field input,
|
||||
p.field select,
|
||||
p.field_long input,
|
||||
p.field_long select,
|
||||
p.field_medium input,
|
||||
p.field_medium select,
|
||||
p.error_field input,
|
||||
p.error_field select,
|
||||
p.error_field_long input,
|
||||
p.error_field_long select,
|
||||
p.error_field_medium input,
|
||||
p.error_field_medium select {
|
||||
position: absolute;
|
||||
left: 100%;
|
||||
}
|
||||
input.long {
|
||||
width: 250px;
|
||||
}
|
||||
p.date span.date_fields {
|
||||
width: 380px;
|
||||
position: absolute;
|
||||
left: 100%;
|
||||
}
|
||||
input.delete_person {
|
||||
font-size: 0.7em;
|
||||
}
|
||||
#news_form textarea, #linksandnumbers_form textarea {
|
||||
width: 600px;
|
||||
height: 200px;
|
||||
}
|
||||
table.data_table {
|
||||
border-spacing: 10px;
|
||||
}
|
||||
table.data_table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
36
site/css/bookingrequest.css
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Styles for the bookrequest page
|
||||
*/
|
||||
.ui-datepicker {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
table.passengers {
|
||||
border-collapse: collapse;
|
||||
empty-cells: hide;
|
||||
margin: 0 10px;
|
||||
}
|
||||
table.passengers th {
|
||||
background-color: #eee;
|
||||
border: 1px solid #999;
|
||||
}
|
||||
table.passengers th,
|
||||
table.passengers td {
|
||||
padding: 4px;
|
||||
}
|
||||
table.passengers tbody input {
|
||||
width: 100px;
|
||||
}
|
||||
table.passengers tbody input.date-input {
|
||||
width: 70px;
|
||||
}
|
||||
button.passenger-btn {
|
||||
margin-top: 5px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
table.passengers-review {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.passengers-review td {
|
||||
border: 1px solid #eee;
|
||||
padding: 4px 6px;
|
||||
}
|
||||
301
site/css/default.css
Normal file
@@ -0,0 +1,301 @@
|
||||
/***********************************************
|
||||
* Default styles for: friendshiptours.org
|
||||
* Author: Benjamin Ramey
|
||||
* E-mail: ben.ramey@gmail.com
|
||||
* Created: Sun Dec 16 17:46:57 CST 2007
|
||||
***********************************************/
|
||||
/***********************************************
|
||||
Major page element styles
|
||||
***********************************************/
|
||||
html, body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
body {
|
||||
background: #778899;
|
||||
font-family: Times;
|
||||
}
|
||||
iframe {
|
||||
border: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
height: 550px;
|
||||
background: white;
|
||||
}
|
||||
.iframe-link {
|
||||
margin: 0;
|
||||
background: white;
|
||||
padding: 10px;
|
||||
border-bottom: 2px solid black;
|
||||
}
|
||||
h1 {
|
||||
margin: 0;
|
||||
padding: 16px 0;
|
||||
text-indent: -10000px;
|
||||
}
|
||||
h1 a {
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
width: 600px;
|
||||
height: 137px;
|
||||
background: url(/site/graphics/logo.gif) no-repeat top center transparent;
|
||||
}
|
||||
h2 {
|
||||
margin: 0;
|
||||
padding: 5px;
|
||||
font-family: Arial;
|
||||
font-size: 0.8em;
|
||||
background: #778899;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
h3 {
|
||||
text-align: center;
|
||||
}
|
||||
ul.linksandnumbers-list {
|
||||
list-style-type: none;
|
||||
}
|
||||
ul.linksandnumbers-list li {
|
||||
margin: 15px 0;
|
||||
}
|
||||
p.sub-link {
|
||||
text-align: center;
|
||||
}
|
||||
p.intro {
|
||||
margin: 20px;
|
||||
padding: 10px;
|
||||
border: 1px black solid;
|
||||
}
|
||||
#main {
|
||||
position: relative;
|
||||
margin: 0 auto -90px;
|
||||
width: 670px;
|
||||
padding: 0 10px;
|
||||
border-width: 0 5px;
|
||||
border-style: solid;
|
||||
border-color: #000066;
|
||||
background: white;
|
||||
min-height: 100%;
|
||||
height: 100%;
|
||||
voice-family: "\"}\"";
|
||||
voice-family: inherit;
|
||||
height: auto;
|
||||
}
|
||||
html>body #main {
|
||||
height: auto;
|
||||
}
|
||||
#content {
|
||||
clear: both;
|
||||
}
|
||||
#footer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 650px;
|
||||
border-top: 1px solid black;
|
||||
padding: 10px 10px 0;
|
||||
font-size: 0.7em;
|
||||
text-align: center;
|
||||
clear: both;
|
||||
}
|
||||
#footer form {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
float: right;
|
||||
}
|
||||
#footer p {
|
||||
float: left;
|
||||
}
|
||||
#clearfooter {
|
||||
clear: both;
|
||||
height: 90px;
|
||||
}
|
||||
#messages {
|
||||
margin: 10px 0;
|
||||
padding: 2px;
|
||||
background: #FFFF66;
|
||||
}
|
||||
#messages ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
#errors {
|
||||
margin: 10px 0;
|
||||
padding: 2px;
|
||||
background: #CC0000;
|
||||
color: white;
|
||||
}
|
||||
#errors ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
/***********************************************
|
||||
Form styles
|
||||
***********************************************/
|
||||
fieldset {
|
||||
margin: 10px;
|
||||
border: 0;
|
||||
}
|
||||
fieldset legend {
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
p.field, p.error_field, p.date {
|
||||
position: relative;
|
||||
width: 190px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
p.error_field {
|
||||
font-weight: bold;
|
||||
color: red;
|
||||
}
|
||||
p.field_medium, p.error_field_medium {
|
||||
position: relative;
|
||||
width: 250px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
p.field_long, p.error_field_long {
|
||||
position: relative;
|
||||
width: 400px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
span.field_details {
|
||||
display: block;
|
||||
width: 380px;
|
||||
position: relative;
|
||||
left: 100%;
|
||||
font-size: 0.9em;
|
||||
padding: 4px 0;
|
||||
margin: 4px 0 0;
|
||||
}
|
||||
p.field span.field_content {
|
||||
width: 400px;
|
||||
position: absolute;
|
||||
left: 100%;
|
||||
margin-left: 10px;
|
||||
}
|
||||
p.field input,
|
||||
p.field select,
|
||||
p.field_long input,
|
||||
p.field_long select,
|
||||
p.field_medium input,
|
||||
p.field_medium select,
|
||||
p.error_field input,
|
||||
p.error_field select,
|
||||
p.error_field_long input,
|
||||
p.error_field_long select,
|
||||
p.error_field_medium input,
|
||||
p.error_field_medium select {
|
||||
position: absolute;
|
||||
left: 100%;
|
||||
}
|
||||
p.date span.date_fields {
|
||||
width: 380px;
|
||||
position: absolute;
|
||||
left: 100%;
|
||||
}
|
||||
input.delete_person {
|
||||
font-size: 0.7em;
|
||||
}
|
||||
#bookingrequest_form textarea {
|
||||
width: 400px;
|
||||
height: 60px;
|
||||
}
|
||||
table.data_table {
|
||||
border-spacing: 10px;
|
||||
}
|
||||
table.data_table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
/***********************************************
|
||||
Menu styles
|
||||
***********************************************/
|
||||
#menu ul {
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
padding: 6px 4px;
|
||||
background: #778899;
|
||||
border-width: 5px 0 0;
|
||||
border-color: #000066;
|
||||
border-style: solid;
|
||||
height: 14px;
|
||||
}
|
||||
#menu #nav2 {
|
||||
border-width: 0 0 5px;
|
||||
}
|
||||
#menu li {
|
||||
display: block;
|
||||
float: left;
|
||||
margin: 0 23px;
|
||||
width: 154px;
|
||||
text-align: center;
|
||||
padding: 0 10px;
|
||||
background: transparent;
|
||||
}
|
||||
#menu li:hover {
|
||||
background: url(/site/graphics/icon_airplane.jpg) no-repeat left center;
|
||||
}
|
||||
#menu a {
|
||||
background: transparent;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
}
|
||||
#menu a:visited {
|
||||
text-decoration: none;
|
||||
color: white;
|
||||
}
|
||||
#menu a:hover {
|
||||
color: #ccc;
|
||||
text-decoration: none;
|
||||
}
|
||||
#index #home_link,
|
||||
#history #history_link,
|
||||
#viewyouritinerary #viewyouritinerary_link,
|
||||
#itinerary_beforecontinuing #viewyouritinerary_link,
|
||||
#linksandnumbers #linksandnumbers_link,
|
||||
#creditcard #creditcard_link {
|
||||
background: url(/site/graphics/icon_airplane.jpg) no-repeat left center;
|
||||
}
|
||||
/***********************************************
|
||||
News styles
|
||||
***********************************************/
|
||||
#news-jumper {
|
||||
width: 450px;
|
||||
float: left;
|
||||
}
|
||||
.news-item {
|
||||
border-top: 1px black solid;
|
||||
margin: 20px 10px 10px;
|
||||
}
|
||||
p.top-link {
|
||||
margin: 2px;
|
||||
padding: 0;
|
||||
text-align: center;
|
||||
}
|
||||
/***********************************************
|
||||
Page box styles
|
||||
***********************************************/
|
||||
.page-box-center {
|
||||
border: 1px solid black;
|
||||
background: white;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.page-box-left {
|
||||
border: 1px solid black;
|
||||
float: left;
|
||||
width: 450px;
|
||||
background: white;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.page-box-right {
|
||||
border: 1px solid black;
|
||||
float: right;
|
||||
width: 210px;
|
||||
background: white;
|
||||
}
|
||||
.page-box-center p,
|
||||
.page-box-right hr,
|
||||
.page-box-right p {
|
||||
margin: 10px;
|
||||
}
|
||||
BIN
site/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
Executable file
|
After Width: | Height: | Size: 180 B |
BIN
site/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
Executable file
|
After Width: | Height: | Size: 178 B |
BIN
site/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
Executable file
|
After Width: | Height: | Size: 120 B |
BIN
site/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
Executable file
|
After Width: | Height: | Size: 105 B |
BIN
site/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png
Executable file
|
After Width: | Height: | Size: 111 B |
BIN
site/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
Executable file
|
After Width: | Height: | Size: 110 B |
BIN
site/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
Executable file
|
After Width: | Height: | Size: 119 B |
BIN
site/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
Executable file
|
After Width: | Height: | Size: 101 B |
BIN
site/css/smoothness/images/ui-icons_222222_256x240.png
Executable file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
site/css/smoothness/images/ui-icons_2e83ff_256x240.png
Executable file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
site/css/smoothness/images/ui-icons_454545_256x240.png
Executable file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
site/css/smoothness/images/ui-icons_888888_256x240.png
Executable file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
site/css/smoothness/images/ui-icons_cd0a0a_256x240.png
Executable file
|
After Width: | Height: | Size: 4.3 KiB |
406
site/css/smoothness/jquery-ui.css
vendored
Executable file
@@ -0,0 +1,406 @@
|
||||
/*
|
||||
* jQuery UI CSS Framework
|
||||
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
|
||||
*/
|
||||
|
||||
/* Layout helpers
|
||||
----------------------------------*/
|
||||
.ui-helper-hidden { display: none; }
|
||||
.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
|
||||
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
|
||||
.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
|
||||
.ui-helper-clearfix { display: inline-block; }
|
||||
/* required comment for clearfix to work in Opera \*/
|
||||
* html .ui-helper-clearfix { height:1%; }
|
||||
.ui-helper-clearfix { display:block; }
|
||||
/* end clearfix */
|
||||
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
|
||||
|
||||
|
||||
/* Interaction Cues
|
||||
----------------------------------*/
|
||||
.ui-state-disabled { cursor: default !important; }
|
||||
|
||||
|
||||
/* Icons
|
||||
----------------------------------*/
|
||||
|
||||
/* states and images */
|
||||
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
|
||||
|
||||
|
||||
/* Misc visuals
|
||||
----------------------------------*/
|
||||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* jQuery UI CSS Framework
|
||||
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
|
||||
* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
|
||||
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
|
||||
*/
|
||||
|
||||
|
||||
/* Component containers
|
||||
----------------------------------*/
|
||||
.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
|
||||
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
|
||||
.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
|
||||
.ui-widget-content a { color: #222222; }
|
||||
.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
|
||||
.ui-widget-header a { color: #222222; }
|
||||
|
||||
/* Interaction states
|
||||
----------------------------------*/
|
||||
.ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; outline: none; }
|
||||
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; outline: none; }
|
||||
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; outline: none; }
|
||||
.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; outline: none; }
|
||||
.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; outline: none; }
|
||||
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; outline: none; text-decoration: none; }
|
||||
|
||||
/* Interaction Cues
|
||||
----------------------------------*/
|
||||
.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
|
||||
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #363636; }
|
||||
.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
|
||||
.ui-state-error a, .ui-widget-content .ui-state-error a { color: #cd0a0a; }
|
||||
.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #cd0a0a; }
|
||||
.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
|
||||
.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; }
|
||||
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
|
||||
|
||||
/* Icons
|
||||
----------------------------------*/
|
||||
|
||||
/* states and images */
|
||||
.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
|
||||
.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
|
||||
.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
|
||||
.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
|
||||
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
|
||||
.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
|
||||
.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
|
||||
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
|
||||
|
||||
/* positioning */
|
||||
.ui-icon-carat-1-n { background-position: 0 0; }
|
||||
.ui-icon-carat-1-ne { background-position: -16px 0; }
|
||||
.ui-icon-carat-1-e { background-position: -32px 0; }
|
||||
.ui-icon-carat-1-se { background-position: -48px 0; }
|
||||
.ui-icon-carat-1-s { background-position: -64px 0; }
|
||||
.ui-icon-carat-1-sw { background-position: -80px 0; }
|
||||
.ui-icon-carat-1-w { background-position: -96px 0; }
|
||||
.ui-icon-carat-1-nw { background-position: -112px 0; }
|
||||
.ui-icon-carat-2-n-s { background-position: -128px 0; }
|
||||
.ui-icon-carat-2-e-w { background-position: -144px 0; }
|
||||
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
||||
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
||||
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
||||
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
||||
.ui-icon-triangle-1-s { background-position: -64px -16px; }
|
||||
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
||||
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
||||
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
||||
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
||||
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
||||
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
||||
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
||||
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
||||
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
||||
.ui-icon-arrow-1-s { background-position: -64px -32px; }
|
||||
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
||||
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
||||
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
||||
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
||||
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
||||
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
||||
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
||||
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
||||
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
||||
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
||||
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
||||
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
||||
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
||||
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
||||
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
||||
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
||||
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
||||
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
||||
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
||||
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
||||
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
||||
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
||||
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
||||
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
||||
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
||||
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
||||
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
||||
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
||||
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
||||
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
||||
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
||||
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
||||
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
||||
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
||||
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
||||
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
||||
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
||||
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
||||
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
||||
.ui-icon-extlink { background-position: -32px -80px; }
|
||||
.ui-icon-newwin { background-position: -48px -80px; }
|
||||
.ui-icon-refresh { background-position: -64px -80px; }
|
||||
.ui-icon-shuffle { background-position: -80px -80px; }
|
||||
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
||||
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
||||
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
||||
.ui-icon-folder-open { background-position: -16px -96px; }
|
||||
.ui-icon-document { background-position: -32px -96px; }
|
||||
.ui-icon-document-b { background-position: -48px -96px; }
|
||||
.ui-icon-note { background-position: -64px -96px; }
|
||||
.ui-icon-mail-closed { background-position: -80px -96px; }
|
||||
.ui-icon-mail-open { background-position: -96px -96px; }
|
||||
.ui-icon-suitcase { background-position: -112px -96px; }
|
||||
.ui-icon-comment { background-position: -128px -96px; }
|
||||
.ui-icon-person { background-position: -144px -96px; }
|
||||
.ui-icon-print { background-position: -160px -96px; }
|
||||
.ui-icon-trash { background-position: -176px -96px; }
|
||||
.ui-icon-locked { background-position: -192px -96px; }
|
||||
.ui-icon-unlocked { background-position: -208px -96px; }
|
||||
.ui-icon-bookmark { background-position: -224px -96px; }
|
||||
.ui-icon-tag { background-position: -240px -96px; }
|
||||
.ui-icon-home { background-position: 0 -112px; }
|
||||
.ui-icon-flag { background-position: -16px -112px; }
|
||||
.ui-icon-calendar { background-position: -32px -112px; }
|
||||
.ui-icon-cart { background-position: -48px -112px; }
|
||||
.ui-icon-pencil { background-position: -64px -112px; }
|
||||
.ui-icon-clock { background-position: -80px -112px; }
|
||||
.ui-icon-disk { background-position: -96px -112px; }
|
||||
.ui-icon-calculator { background-position: -112px -112px; }
|
||||
.ui-icon-zoomin { background-position: -128px -112px; }
|
||||
.ui-icon-zoomout { background-position: -144px -112px; }
|
||||
.ui-icon-search { background-position: -160px -112px; }
|
||||
.ui-icon-wrench { background-position: -176px -112px; }
|
||||
.ui-icon-gear { background-position: -192px -112px; }
|
||||
.ui-icon-heart { background-position: -208px -112px; }
|
||||
.ui-icon-star { background-position: -224px -112px; }
|
||||
.ui-icon-link { background-position: -240px -112px; }
|
||||
.ui-icon-cancel { background-position: 0 -128px; }
|
||||
.ui-icon-plus { background-position: -16px -128px; }
|
||||
.ui-icon-plusthick { background-position: -32px -128px; }
|
||||
.ui-icon-minus { background-position: -48px -128px; }
|
||||
.ui-icon-minusthick { background-position: -64px -128px; }
|
||||
.ui-icon-close { background-position: -80px -128px; }
|
||||
.ui-icon-closethick { background-position: -96px -128px; }
|
||||
.ui-icon-key { background-position: -112px -128px; }
|
||||
.ui-icon-lightbulb { background-position: -128px -128px; }
|
||||
.ui-icon-scissors { background-position: -144px -128px; }
|
||||
.ui-icon-clipboard { background-position: -160px -128px; }
|
||||
.ui-icon-copy { background-position: -176px -128px; }
|
||||
.ui-icon-contact { background-position: -192px -128px; }
|
||||
.ui-icon-image { background-position: -208px -128px; }
|
||||
.ui-icon-video { background-position: -224px -128px; }
|
||||
.ui-icon-script { background-position: -240px -128px; }
|
||||
.ui-icon-alert { background-position: 0 -144px; }
|
||||
.ui-icon-info { background-position: -16px -144px; }
|
||||
.ui-icon-notice { background-position: -32px -144px; }
|
||||
.ui-icon-help { background-position: -48px -144px; }
|
||||
.ui-icon-check { background-position: -64px -144px; }
|
||||
.ui-icon-bullet { background-position: -80px -144px; }
|
||||
.ui-icon-radio-off { background-position: -96px -144px; }
|
||||
.ui-icon-radio-on { background-position: -112px -144px; }
|
||||
.ui-icon-pin-w { background-position: -128px -144px; }
|
||||
.ui-icon-pin-s { background-position: -144px -144px; }
|
||||
.ui-icon-play { background-position: 0 -160px; }
|
||||
.ui-icon-pause { background-position: -16px -160px; }
|
||||
.ui-icon-seek-next { background-position: -32px -160px; }
|
||||
.ui-icon-seek-prev { background-position: -48px -160px; }
|
||||
.ui-icon-seek-end { background-position: -64px -160px; }
|
||||
.ui-icon-seek-first { background-position: -80px -160px; }
|
||||
.ui-icon-stop { background-position: -96px -160px; }
|
||||
.ui-icon-eject { background-position: -112px -160px; }
|
||||
.ui-icon-volume-off { background-position: -128px -160px; }
|
||||
.ui-icon-volume-on { background-position: -144px -160px; }
|
||||
.ui-icon-power { background-position: 0 -176px; }
|
||||
.ui-icon-signal-diag { background-position: -16px -176px; }
|
||||
.ui-icon-signal { background-position: -32px -176px; }
|
||||
.ui-icon-battery-0 { background-position: -48px -176px; }
|
||||
.ui-icon-battery-1 { background-position: -64px -176px; }
|
||||
.ui-icon-battery-2 { background-position: -80px -176px; }
|
||||
.ui-icon-battery-3 { background-position: -96px -176px; }
|
||||
.ui-icon-circle-plus { background-position: 0 -192px; }
|
||||
.ui-icon-circle-minus { background-position: -16px -192px; }
|
||||
.ui-icon-circle-close { background-position: -32px -192px; }
|
||||
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
||||
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
||||
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
||||
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
||||
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
||||
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
||||
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
||||
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
||||
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
||||
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
||||
.ui-icon-circle-check { background-position: -208px -192px; }
|
||||
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
||||
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
||||
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
||||
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
||||
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
||||
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
||||
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
||||
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
||||
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
||||
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
||||
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
||||
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
||||
|
||||
|
||||
/* Misc visuals
|
||||
----------------------------------*/
|
||||
|
||||
/* Corner radius */
|
||||
.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; }
|
||||
.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; }
|
||||
.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; }
|
||||
.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; }
|
||||
.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; }
|
||||
.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; }
|
||||
.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; }
|
||||
.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; }
|
||||
.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; }
|
||||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
|
||||
.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; }/* Accordion
|
||||
----------------------------------*/
|
||||
.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
|
||||
.ui-accordion .ui-accordion-li-fix { display: inline; }
|
||||
.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
|
||||
.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; }
|
||||
.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
|
||||
.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; }
|
||||
.ui-accordion .ui-accordion-content-active { display: block; }/* Datepicker
|
||||
----------------------------------*/
|
||||
.ui-datepicker { width: 17em; padding: .2em .2em 0; }
|
||||
.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
|
||||
.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
|
||||
.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
|
||||
.ui-datepicker .ui-datepicker-prev { left:2px; }
|
||||
.ui-datepicker .ui-datepicker-next { right:2px; }
|
||||
.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
|
||||
.ui-datepicker .ui-datepicker-next-hover { right:1px; }
|
||||
.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
|
||||
.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
|
||||
.ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; }
|
||||
.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
|
||||
.ui-datepicker select.ui-datepicker-month,
|
||||
.ui-datepicker select.ui-datepicker-year { width: 49%;}
|
||||
.ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; }
|
||||
.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
|
||||
.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
|
||||
.ui-datepicker td { border: 0; padding: 1px; }
|
||||
.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
|
||||
.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
|
||||
.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
|
||||
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
|
||||
|
||||
/* with multiple calendars */
|
||||
.ui-datepicker.ui-datepicker-multi { width:auto; }
|
||||
.ui-datepicker-multi .ui-datepicker-group { float:left; }
|
||||
.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
|
||||
.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
|
||||
.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
|
||||
.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
|
||||
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
|
||||
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
|
||||
.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
|
||||
.ui-datepicker-row-break { clear:both; width:100%; }
|
||||
|
||||
/* RTL support */
|
||||
.ui-datepicker-rtl { direction: rtl; }
|
||||
.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
|
||||
.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
|
||||
.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
|
||||
.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
|
||||
.ui-datepicker-rtl .ui-datepicker-group { float:right; }
|
||||
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
|
||||
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
|
||||
|
||||
/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
|
||||
.ui-datepicker-cover {
|
||||
display: none; /*sorry for IE5*/
|
||||
display/**/: block; /*sorry for IE5*/
|
||||
position: absolute; /*must have*/
|
||||
z-index: -1; /*must have*/
|
||||
filter: mask(); /*must have*/
|
||||
top: -4px; /*must have*/
|
||||
left: -4px; /*must have*/
|
||||
width: 200px; /*must have*/
|
||||
height: 200px; /*must have*/
|
||||
}/* Dialog
|
||||
----------------------------------*/
|
||||
.ui-dialog { position: relative; padding: .2em; width: 300px; }
|
||||
.ui-dialog .ui-dialog-titlebar { padding: .5em .3em .3em 1em; position: relative; }
|
||||
.ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; }
|
||||
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
|
||||
.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
|
||||
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
|
||||
.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
|
||||
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
|
||||
.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; }
|
||||
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
|
||||
.ui-draggable .ui-dialog-titlebar { cursor: move; }
|
||||
/* Progressbar
|
||||
----------------------------------*/
|
||||
.ui-progressbar { height:2em; text-align: left; }
|
||||
.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Resizable
|
||||
----------------------------------*/
|
||||
.ui-resizable { position: relative;}
|
||||
.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
|
||||
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
|
||||
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0px; }
|
||||
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0px; }
|
||||
.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; height: 100%; }
|
||||
.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; height: 100%; }
|
||||
.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
|
||||
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
|
||||
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
|
||||
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Slider
|
||||
----------------------------------*/
|
||||
.ui-slider { position: relative; text-align: left; }
|
||||
.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
|
||||
.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; }
|
||||
|
||||
.ui-slider-horizontal { height: .8em; }
|
||||
.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
|
||||
.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
|
||||
.ui-slider-horizontal .ui-slider-range-min { left: 0; }
|
||||
.ui-slider-horizontal .ui-slider-range-max { right: 0; }
|
||||
|
||||
.ui-slider-vertical { width: .8em; height: 100px; }
|
||||
.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
|
||||
.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
|
||||
.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
|
||||
.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs
|
||||
----------------------------------*/
|
||||
.ui-tabs { padding: .2em; zoom: 1; }
|
||||
.ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .2em .2em 0; }
|
||||
.ui-tabs .ui-tabs-nav li { position: relative; float: left; border-bottom-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; }
|
||||
.ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding: .5em 1em; }
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-bottom-width: 0; }
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
|
||||
.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
|
||||
.ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-width: 0; background: none; }
|
||||
.ui-tabs .ui-tabs-hide { display: none !important; }
|
||||
2
site/data/.htaccess
Normal file
@@ -0,0 +1,2 @@
|
||||
Order deny,allow
|
||||
Deny from all
|
||||
2
site/data/creditcards.xml
Executable file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<creditcards/>
|
||||
223
site/data/linksandnumbers.xml
Executable file
@@ -0,0 +1,223 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<linksandnumbers>
|
||||
<item id="1">
|
||||
<title>Renting a car? Read this and BEWARE!</title>
|
||||
<subtitle/>
|
||||
<type>page</type>
|
||||
<text><![CDATA[Below is a link to an excellent article regarding what to expect when renting a car. Note that you should determine BEFORE you arrive at the rental counter exactly which, if any, of the optional fees, charges and insurances mentioned in the article you wish to accept.
|
||||
|
||||
[link href=http://www.ftc.gov/bcp/conline/pubs/autos/carrent.htm]http://www.ftc.gov/bcp/conline/pubs/autos/carrent.htm[/link]
|
||||
|
||||
Also, when picking up your car, be sure to READ the front page of the rental contract that you sign. Don't just believe the rental agent when he said OK to you asking to decline a certain insurance. If he says it is declined but you sign the contract that states you are accepting it, guess whose word holds up? Yours - your signature!!!
|
||||
]]></text>
|
||||
</item>
|
||||
<item id="2">
|
||||
<title>Frequent flyer mileage programs</title>
|
||||
<subtitle>is it worth collecting miles?</subtitle>
|
||||
<type>page</type>
|
||||
<text><![CDATA[So what's the value of these miles? Sometimes you might want to pay some sort of fee (for a credit card or a phone service, for example) just to get the miles, and you want to know if the miles are worth the fee. And sometimes it is a close decision whether to use valuable miles to get a ticket, or to just pay cash for it so you can use the miles later for something more valuable. Well, here is how to figure this all out: The value to you of one mile very much depends on how you use them. To find that value, you need three numbers:
|
||||
|
||||
Total dollar cost of the ticket you would buy with your miles: Be sure the dollar price of the ticket is for one that is similar in restrictions and advanced payment to the conditions on using the miles. Usually this is a discount ticket sold by either the airline or by me using fares through my discounters/consolidators. Be sure you have the total cost, including taxes and fees.
|
||||
|
||||
Total miles you would lose by using miles to acquire the ticket: This includes both the miles you pay to get the ticket and the miles you would have accrued by buying the same ticket with dollars.
|
||||
|
||||
The number of dollars you would have to spend anyway by acquiring the ticket with miles: You will pay departure, excise taxes, and security fees. These charges can amount to over $100.
|
||||
|
||||
To compute the value of one mile:
|
||||
|
||||
First subtract the dollar charges for using miles from the dollar cost of buying the ticket. This is the dollar amount you save by using miles. Then add the miles you would get by using dollars to buy the ticket to the miles you would be charged for the ticket if you were to use your miles to get it. This is the total number of miles the ticket would cost you.
|
||||
|
||||
Now divide your dollar savings you just computed by the total miles you just computed to find the cost per mile.
|
||||
|
||||
Examples: A round trip to Europe from the West Coast of the United states can usually be purchased through consolidators for about $500 in the winter and $1,000 in the summer, plus taxes and fees. Yet both would cost 50000 miles on most airlines. Suppose the taxes and fees are $50 and the length of the round trip is 10000 miles. Further suppose that you have exactly 50000 miles in your account. If you use your miles to get the summer ticket, you would have 0 miles left in and be out of pocket $50. If you were to buy your ticket with dollars you would be out of pocket $1,050, but you would have 60000 miles in your account after taking the flights. So your net savings by using miles is $1,050 - $50 = $1,000, and your net loss of miles is 10000 + 50000 = 60000 miles. Divide those numbers. You are getting $1,000/60000 = 1.66 cents per mile. Yet if you use your miles to get the winter ticket, you are getting $500/60000 = 0.83 cents per mile. I would use my cash to buy the winter ticket, and save my miles for something more valuable.
|
||||
|
||||
A 5000 mile coast to coast round trip domestic ticket within the United States costs around $200 plus taxes and fees on Southwest Airlines if you wait for the right sale and are willing to fly on three different airplanes to get there and eat peanuts while doing so. At that price, assuming the taxes and fees are the same no matter how you acquire the ticket, using 25,000 miles for the same trip would value the miles at $200/30000 = 0.67 cents per mile. Better use those miles for something more expensive. But perhaps you want a non-stop flight and a meal, and figure that will cost you $320 plus taxes. Well, $320/30000 = 1.066 cents per mile. That's a little better.
|
||||
|
||||
What about buying a ticket on your preferred airline that costs more than a ticket on a cheaper airline? Most airlines calculate the value of one frequent flyer mile at 2 cent. That means a free ticket within the USA that requires 25,000 miles should be worth $500 (25,000 x .02). Most people use their frequent flyer miles for tickets worth far less than that, but let's use that as an example.
|
||||
|
||||
It takes roughly three paid round-trip tickets across the Atlantic to accrue enough miles for the free ticket using miles. If you pay $150 more for each of those tickets using your ëpreferred' airline compared with the cheapest airline, you have just ìpaidî $450 ($150 x 3 trips) for your ìfreeî ticket.
|
||||
|
||||
The moral of the story? Try to accrue miles in your preferred airline's program but be realistic. If a transatlantic ticket on another airline is less expensive by $100 or more, you are definitely better off putting the savings in the bank and using the cheaper airline. With less of a savings, it is a tossup. Unfortunately, every decision is not so cut and dried. If you are close to obtaining enough miles for an award, if your miles will soon expire or under similar circumstances, it might be best to use your preferred airline even though it costs quite a bit more.
|
||||
|
||||
It seems that the cost to purchase a business class ticket is always much more than twice the cost of an economy class ticket, yet the number of miles to buy the business class ticket is usually only 1.5 or 1.6 times the miles for cattle class. So if you usually fly business class and have lots of miles to spend, for you business class might be a very cost effective method of using those miles.
|
||||
|
||||
O.K., now go decide how you might use your miles. Then get a good estimate of how much money you would have to pay to get tickets for the same usage, buying just as far in advance as you would have to if you were using miles (often 6-10 months). Then do the math to get some idea of how much your miles are worth.
|
||||
|
||||
Now you can decide if the miles you would get are worth a fee to get them. If, for example, MCI offers me 10000 miles for using their long distance service for six months, but wants to charge me a $5 per month minimum (which I would never come close to exceeding), then I would be paying about 6 months x $5/month = $30 for those miles.; Let's see, that's $30/10000 miles = 0.3 cents per mile. Not a bad price for miles that I will sell to the airlines for at least four times as much.
|
||||
|
||||
Since I value my miles at 1.5 cents each, I can consider that to be a 1.5% discount when I buy stuff that gets me one mile per dollar spent, say by using a credit card that uses miles, or shopping at internet sites that give me even more miles. This is useful for comparison shopping.
|
||||
|
||||
And you can decide a cut-off value for which you would choose to pay cash for a ticket rather than use those valuable miles. For me, that averages about 1.5 cents per mile. But your decision might be different, depending on what kind of ticket you would buy with the miles.
|
||||
]]></text>
|
||||
</item>
|
||||
<item id="3">
|
||||
<title>Frequent flyer mileage programs</title>
|
||||
<subtitle>how to be sure your miles are credited to your account</subtitle>
|
||||
<type>page</type>
|
||||
<text><![CDATA[Though you give me your frequent flyer numbers and I enter them into the reservation, that is still no guarantee that the airlines will have your numbers in their system for the entire trip or that you will receive mileage credit. In order to increase the chances of receiving credit for your trip, double check at each and every airport that the airline has your number in their computer and retain all ticket stubs and boarding passes until you see the mileage credited to your account.
|
||||
|
||||
If for some reason you will need copies of your ticket stubs or ticket numbers from me after completion of your trip, we charge $25 per person to obtain such past date information plus any costs that my suppliers might charge, if we obtained your ticket through a discounter.]]></text>
|
||||
</item>
|
||||
<item id="4">
|
||||
<title>Travel Insurance</title>
|
||||
<subtitle/>
|
||||
<type>page</type>
|
||||
<text><![CDATA[If you are purchasing this policy within two weeks of having your ticket issued, [link href=/travelinsurance.php?type=cruisett]Cruise, Tour & Travel[/link] protects you up to $250 to cancel for any reason. Otherwise, [link href=/travelinsurance.php?type=protectassist]Protect Assist[/link] is the best option for you. ]]></text>
|
||||
</item>
|
||||
<item id="5">
|
||||
<title>Staying in a hotel? Read this.</title>
|
||||
<subtitle/>
|
||||
<type>page</type>
|
||||
<text><![CDATA[The latest way for hotels to try and make money off their guests is to offer the "convenience" of charging you for your room in the currency that your credit card is issued in. So if you have a US-issued credit card but stay in Europe, the hotel will offer to charge your card in dollars. Sometimes they don't even tell you they are charging your card in dollars, but just do it. DON'T LET THIS HAPPEN TO YOU. Insist that your card be billed in the local currency where you are staying. Otherwise, the hotel will use an artificially high exchange rate and you will have no recourse. If you have the charge billed in the local currency, you will obtain the preferred exchange rate used by the credit card company when they convert the charge into the currency your credit card bill is issued in.]]></text>
|
||||
</item>
|
||||
<item id="6">
|
||||
<title>Austria travel information</title>
|
||||
<subtitle>since so many clients visit or live in Austria</subtitle>
|
||||
<type>external_link</type>
|
||||
<text><![CDATA[http://www.austria-tourism.at/]]></text>
|
||||
</item>
|
||||
<item id="7">
|
||||
<title>Travel a lot and need a cheap prepaid phone card?</title>
|
||||
<subtitle/>
|
||||
<type>page</type>
|
||||
<text><![CDATA[Here is the phone card that I use for all my long-distance calls, both in the office and while traveling. I get great rates, and there are neat features like being able to pre-program several phone numbers I frequently call from so that I don't need to enter a PIN number when calling from those phone numbers.
|
||||
|
||||
If you use the link below to sign up, we each get 20 free minutes. Trust me, I am not pushing this company for the 20 free minutes (at 3 cents per minute, that is only 60 cents!). They truly are a good and inexpensive way to call. And their international rates are great too.
|
||||
|
||||
[link href=https://www.onesuite.com/04CI74648/suitetreat]https://www.onesuite.com/04CI74648/suitetreat[/link]]]></text>
|
||||
</item>
|
||||
<item id="8">
|
||||
<title>Lonely Planet travel guidebooks, travel information</title>
|
||||
<subtitle>in my opinion, probably the best guidebook series.</subtitle>
|
||||
<type>external_link</type>
|
||||
<text><![CDATA[http://www.lonelyplanet.com/]]></text>
|
||||
</item>
|
||||
<item id="9">
|
||||
<title>Packing Tips</title>
|
||||
<subtitle/>
|
||||
<type>page</type>
|
||||
<text><![CDATA[[b]The right bag[/b]
|
||||
|
||||
In the beginning there's the luggage - and it had better be lightweight and roll.
|
||||
|
||||
Ideally, carry-on only is the way to go, and some people (who are not my friends) can pull that off. For the rest of us who want some variety in our clothing and need to take bulkier gear, checking bags is a given.
|
||||
|
||||
Airlines typically allow two checked pieces. To avoid surcharges, these may be no more than 62 linear inches (a combination of length, width and depth) and weigh a maximum of 50 pounds each.
|
||||
|
||||
Most carriers impose a surcharge of $25 for 51-70 pounds and $50 for 70-100 pounds on domestic flights. You will pay $80 extra for a third checked bag that meets the 62-inch limit. First-class passengers may be allowed more leeway. Rules for foreign flights vary.
|
||||
|
||||
The best bet for durability and weight in a roomy bag you're going to check is a wheeled 25-29-inch soft-sided case, often referred to as a pullman or trolley. Look for the new lighter-weight polyester or nylon bags made with graphite frames. A big open design accommodates more and weighs less than bags with multiple internal compartments. Many of the better bags are expandable, providing as much as 2 1/2 inches of extra packing space when needed.
|
||||
|
||||
Opt for a bright color so the bag will stand out in the sea of black cases at baggage claim (or highlight your black bag with brightly colored duct tape or a colorful luggage strap). Choose a bag with a dual-pole telescoping handle, which provides more stability than single-pole models for additional bags you sling over the handle. A good, reasonably priced choice is Delsey's Helium Lite 100 line. The 25-inch expandable trolley, available in bright red, blue or black, weighs just 10.7 pounds and is widely available for about $90.
|
||||
|
||||
Post / Andrew Lucas) along the sides. Put heavy durable items at the wheel end of the bag to keep the center of gravity low and make for easier pulling. Place fragile items such as hair dryers at the handle.
|
||||
|
||||
[b]Carrying on[/b]
|
||||
|
||||
Wheeled soft-sided 21-22-inch bags with one big undivided interior compartment provide the most packing space for airlines' carry-on allowance, typically 45 linear inches. (On smaller planes, these may have to be gate-checked).
|
||||
|
||||
Thinner is better, so opt for a bag with a depth of no more than 9 inches. Stuffing the outside pockets can make a bag too fat to fit in the overhead bin.
|
||||
|
||||
A good choice is Delsey's Helium Lite Carry-on Suiter Trolley ($70), which measures 21 by 14 by 8.5 inches, and weighs 8.8 pounds.
|
||||
|
||||
Airlines usually will allow one additional small item, such as a purse or computer bag. I like a zippered nylon knapsack, which leaves my hands free to navigate the wheel-aboard, and is a special blessing when I'm confronted with stairs.
|
||||
|
||||
Load your wheel-aboard bag with essential guidebooks, medications that you don't want to have to replace, and bulky fragile goods, well-wrapped in a spare pair of socks or T-shirt - which can come in handy if your checked luggage is delayed.
|
||||
|
||||
The smaller bag, which will remain in your possession even if you have to gate-check the wheeled bag at the last minute, should hold all valuables, such as money, jewelry, travel documents, crucial prescription medications and keys. It also should contain any items you may want to get to on the plane - a book, newspaper, CD or MP3 player, earplugs, decongestant spray, an inflatable neck rest. For long flights, I also include eyeshades and a pillow cover. Dreamsacks makes a sumptuous blue silk Airline Comfort Set ($55), composed of padded eyeshades, a small pillowcase and a 72-inch by 43-inch blanket, all tucked into a matching bag.
|
||||
|
||||
If you get to the gate and find your plane has been switched to one that can't accommodate your wheeled bag onboard, transfer any important items to your smaller bag. Make sure you get a claim check, and that the bag has an ID tag. (In fact, even your smallest carry-on should have a tag in case it gets misplaced.)
|
||||
|
||||
[b]Security Matters[/b]
|
||||
|
||||
Now that security officials are performing random inspections after checked bags leave your hands, the only locks recommended are the special Transportation Security Administration-approved padlocks, for which most U.S. baggage inspectors have special keys. Brookstone sells a version called EasyCheck for $20 for a two-pack. These locks are not universally operational, however, particularly abroad. I secure my checked bags with a little snap-on disposable plastic padlock ($8 for a 20-pack of PrivaSeals from Magellan's) and an adjustable luggage strap ($10 from Magellan's). These won't stop a determined thief, but they may deter opportunistic filchers looking for a hassle-free hit.
|
||||
|
||||
While baggage ID tags are essential for reuniting lost luggage with their owners, security experts advise against putting your home address on these. (Why advertise that your home may be unoccupied?) Better to list your office address, phone number and e-mail, and perhaps a cellphone number. It also may be helpful to include the hotel or ship for which you are bound, so lost luggage at least has a chance of reaching you during your trip.
|
||||
|
||||
[b]Getting it home[/b]
|
||||
|
||||
If you've acquired a substantial amount during your trip - whether guidebooks, clothing or gifts - consider shipping rather than schlepping the excess. Or, take precious purchases with you and ship clothes you won't need for a while.
|
||||
|
||||
Whenever possible, pay by credit card for items you intend to ship, and insure valuable shipments. Many credit card companies provide some free insurance on purchases.
|
||||
|
||||
If you're planning to bring back substantially more than you left with, pack a sturdy double-zippered duffle in your main bag. It's better to check an extra bag on your return than to try to stuff too much into just one - which could push the weight over 50 pounds or risk bursting seams or breaking zippers. A good choice is Eagle Creek's Large Cargo Duffle ($70), which measures a generous 30 by 15 by 14 inches, and weighs 2 1/2 pounds.
|
||||
|
||||
A portable luggage scale can come in handy when weight is a concern. Magellan's Travel Utility Scale, 4 inches square, weighs just 6 ounces ($10). Hook it onto your bag's carry handle and lift it off the ground for a reading in pounds and kilograms (up to 50 pounds/23 kilograms).
|
||||
|
||||
[b]The inside story[/b]
|
||||
|
||||
Packing wisdom holds that you should take half the clothes and double the money you think you need. It's a good rule.
|
||||
|
||||
I always do a trial pack a few days before a trip, then go back the day before and remove the things I really don't need after all. Out come the extra pair of shoes that match the extra slacks, which also come out. Out comes the heavy trench coat; my lighter-weight parka, though less stylish, will do fine.
|
||||
|
||||
The weightiest contents tend to be the toiletries, so pack only a starter set of minisize shampoo, conditioner, toothpaste, baby powder and such. Most hotels and cruise ships supply and regularly replenish toiletries in the rooms (stash some away for subsequent trips).
|
||||
|
||||
For internal compartmentalization, I vote for self-sealing plastic freezer bags in quart, gallon and 2-gallon sizes. Fancy packing cubes and pouches hog more space and weigh more than simple ziplocks, which have the added advantage of being see-through, and thus are less likely to be opened by inspectors. The bags are great for toiletries. Pack spillable items together, double-bagged.
|
||||
|
||||
To reduce the volume of bulky items, such as sweaters and slacks, by as much as two-thirds, use plastic compression bags. These basically are giant ziplocks with a one-way valve on one end through which excess air is removed when the compression bag is rolled tightly from the other end. I've run into wrinkle problems with these, however, and the weight of the items remains the same, so the more you can fit, the heavier the suitcase gets.
|
||||
|
||||
Start packing the suitcase by filling the recesses made by the luggage wheels and telescoping handle with shoes (in 2-gallon ziplocks), underwear and other items that make use of that often wasted space.
|
||||
|
||||
Next, lay all garments flat, biggest first, letting the excess drape over the sides of the bag. Then fold the spillover carefully back into the bag in reverse order, last garment first, then the one under it over that one, and so on. This is the most compact packing method, and also will cut back on wrinkling.
|
||||
|
||||
Stash socks and underwear in the corners of the bag. Wedge extra shoes along the sides. Put heavy durable items at the wheel end of the bag to keep the center of gravity low and make for easier pulling. Place fragile items such as hair dryers at the handle end.
|
||||
|
||||
[i]Judi Dash, a freelance writer who lives in Beachwood, Ohio, writes the Travel section's weekly Gearing Up column.[/i]]]></text>
|
||||
</item>
|
||||
<item id="10">
|
||||
<title>Obtaining travel advisories from the US State Department</title>
|
||||
<subtitle/>
|
||||
<type>external_link</type>
|
||||
<text><![CDATA[http://travel.state.gov/travel/cis_pa_tw/cis_pa_tw_1168]]></text>
|
||||
</item>
|
||||
<item id="11">
|
||||
<title>Obtaining travel information from the US State Department</title>
|
||||
<subtitle/>
|
||||
<type>external_link</type>
|
||||
<text><![CDATA[http://travel.state.gov/]]></text>
|
||||
</item>
|
||||
<item id="12">
|
||||
<title>Helpful International Travel Information</title>
|
||||
<subtitle/>
|
||||
<type>page</type>
|
||||
<text><![CDATA[[link href=http://www.geocities.com/Thavery2000/]Airline Toll Free Numbers[/link]
|
||||
[link href=http://usembassy.state.gov/]U.S. Embassies and Diplomatic Missions[/link]
|
||||
[link href=http://uscis.gov/graphics/index.htm]U.S. Immigration and Naturalization Service[/link]
|
||||
[link href=http://www.towd.com/]Tourism Offices Worldwide[/link]
|
||||
[link href=http://www.customs.gov/]Help Through U.S. Customs[/link]
|
||||
[link href=http://flightview.com/]Track flight information[/link]
|
||||
[link href=http://www.oanda.com/]Travel Currency conversion[/link]
|
||||
[link href=http://dictionary.reference.com/]International Dictionary and Translation[/link]
|
||||
[link href=http://www.worldtimeserver.com/]Time Around the World[/link]
|
||||
[link href=http://aviewoncities.com/]Major worldwide city information[/link]]]></text>
|
||||
</item>
|
||||
<item id="13">
|
||||
<title>Travel Notes</title>
|
||||
<subtitle/>
|
||||
<type>page</type>
|
||||
<text><![CDATA[Very organized travel directory providing country/state information, reviewed websites, and regular travel articles. [link href=http://www.travelnotes.org]www.travelnotes.org[/link]]]></text>
|
||||
</item>
|
||||
<item id="14">
|
||||
<title>Need help obtaining passports and visas, even within 48 hours of departure?</title>
|
||||
<subtitle/>
|
||||
<type>external_link</type>
|
||||
<text><![CDATA[http://www.passportsandvisas.com/index.asp?affiliate=1718]]></text>
|
||||
</item>
|
||||
<item id="15">
|
||||
<title>Sick of all the travel taxes you pay?</title>
|
||||
<subtitle/>
|
||||
<type>page</type>
|
||||
<text><![CDATA[Many domestic tickets include taxes of up to 25% of your fare and taxes, security and fuel surcharges on international flights can be up to $300 per person. Want to fight back? Send a letter to your congressman.
|
||||
|
||||
Go to the following links, enter your US zip code or state and it will tell you all your elected representatives (you can compose an Email to them online and send it from your computer)
|
||||
|
||||
[link href=http://www.house.gov/writerep/]http://www.house.gov/writerep/[/link]
|
||||
[link href=http://www.senate.gov/]http://www.senate.gov/[/link]]]></text>
|
||||
</item>
|
||||
<item id="16">
|
||||
<title>Report a bad link</title>
|
||||
<subtitle/>
|
||||
<type>external_link</type>
|
||||
<text><![CDATA[mailto:travel@friendshiptours.org]]></text>
|
||||
</item>
|
||||
</linksandnumbers>
|
||||
69
site/data/news.xml
Executable file
@@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<news>
|
||||
<newsitem id="1">
|
||||
<title>"A Missionary's Best Friend"</title>
|
||||
<text><[/i]
|
||||
|
||||
[b]Brainerd-based travel agency finds best deals for missionaries[/b]
|
||||
|
||||
By HEIDI LAKE
|
||||
|
||||
Staff Writer
|
||||
|
||||
John Nielsen's friends call him "the coupon king" because he uses coupons wherever he goes.
|
||||
|
||||
Although he gets teased for his frugal ways, Nielsen has the last laugh. His faith and thrifty way of life have turned him into a successful business owner.
|
||||
|
||||
Nielsen's Brainerd-based travel agency, Friendship Tours International, primarily makes travel arrangements for missionaries around the world, finding them the best rates available.
|
||||
|
||||
"I love saving money whether it's for me or someone else," Nielsen said.
|
||||
|
||||
It's that attitude and a love of traveling that got him into the travel business in the first place.
|
||||
|
||||
In 1974, Nielsen became a Christian and found himself intrigued by the missions field. He went on mission trips while attending Western Michigan University. In 1982, Nielsen moved to Vienna, Austria, working as a missionary and assisting with Friendship Tours.
|
||||
|
||||
FTI began as a cover story when missionaries needed an excuse to travel to then-communist Eastern Europe. Simply stating "missions work" as the reason to enter Eastern European countries wasn't enough. In 1979, a missionary in Vienna and a businessman in Michigan decided to create a travel company to organize "tours" to Eastern Europe, thus allowing missionaries to gain entrance.
|
||||
|
||||
What started as merely a coverup, FTI has been booking trips for missionaries around the world for the past 25 years.
|
||||
|
||||
Eventually, Nielsen turned his mission work into a career. he now owns and operates FTI out of an office in Brainerd.
|
||||
|
||||
Currently FTI serves 300 missionary families around the world, and is not taking any new clients. Nielsen said he and his assistant, Kelli Sanguma, have all the work they can handle right now.
|
||||
|
||||
"I don't want to get too big, where all I do is manage employees," he said.
|
||||
|
||||
After all, finding the cheapest fares is what Nielsen does best.
|
||||
|
||||
Nielsen describes every booking as a new challenge, often finding flights to remote countries in Africa or central Asia for his clients.
|
||||
|
||||
"It's fun to figure out how to get to those places," Nielsen said.
|
||||
|
||||
There aren't many travel agencies that work primarily with missionaries, Nielsen said, because it's a lot of work. A large percentage of his workload involves changing flights for his customers, for one reason or another. Many missionaries travel every other week to faraway destinations, keeping Nielsen busy.
|
||||
|
||||
"Some individuals travel intensely while I hear from some once every two years," he said.
|
||||
|
||||
It's the low fares and attention to detail that keep customers coming back to FTI. Nielsen described some travel agents as mere "order takers," while he prides himself in saving money for his clients.
|
||||
|
||||
"I just like helping the people," he said. "Without me here doing this (missionaries) couldn't be out in the field." ]]></text>
|
||||
</newsitem>
|
||||
<newsitem id="2">
|
||||
<title>Traveling in 2007?</title>
|
||||
<text><![CDATA[[b]If you live in Europe[/b], generally you may make reservations up to 11 months in advance but often you do not need to have the tickets issued or paid for until 2-3 weeks before departure. Therefore you should be booking for 2007 travels as follows:
|
||||
|
||||
For Easter travel (April 1 - April 15) you should book ASAP.
|
||||
|
||||
For summer 2007 travel (early June through mid-September) you should book by end of December 2006 if possible.
|
||||
|
||||
For Christmas 2007 travel (Dec 14, 2007 to Jan 10, 2008) you should book by June or July 2007.
|
||||
|
||||
[b]If you live in the USA or elsewhere outside of Europe[/b], generally you must have tickets issued within 7 to 14 days of making the reservation. Therefore, you must be quite certain of your travel plans before you make a reservation. If possible, you should be booking for 2007 travel as follows:
|
||||
|
||||
For travel from June 1 to Sep 15 – by end of January to obtain the best fares and best selection of airlines.
|
||||
|
||||
For travel from November 20 to November 26 (Thanksgiving), by end of June if possible.
|
||||
|
||||
For travel from December 10, 2007 to January 10, 2008, by end of August 2007 at the latest.
|
||||
|
||||
For travel to Florida anytime – as soon as possible. ]]></text>
|
||||
</newsitem>
|
||||
</news>
|
||||
4
site/data/passportinfo.xml
Executable file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<passports>
|
||||
|
||||
</passports>
|
||||
8
site/data/users/users.xml
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<users>
|
||||
<user id='1'>
|
||||
<username>fti</username>
|
||||
<password>7721ff4a5c6355b08966519cb51b5c5f0ff1b492</password>
|
||||
<role>admin</role>
|
||||
</user>
|
||||
</users>
|
||||
15
site/en/admin/creditcards.delete.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<h2>Administrate FTI: Credit Cards</h2>
|
||||
<p>
|
||||
Are you sure you want to delete credit card information for
|
||||
<?php echo $this->data['card']->card_name ?>?
|
||||
</p>
|
||||
<p>
|
||||
<form action="creditcards.php" method="post" accept-charset="utf-8">
|
||||
<input type="hidden" name="id" value="<?php echo $this->data['card']['id'] ?>" id="id"/>
|
||||
<input type="hidden" name="do" value="reallydelete" id="do"/>
|
||||
<p>
|
||||
<input type="submit" value="Yes, delete info"/>
|
||||
No, return to <a href='/admin/creditcards.php'>credit card list</a>.
|
||||
</p>
|
||||
</form>
|
||||
</p>
|
||||
29
site/en/admin/creditcards.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<h2>Administrate FTI: Credit Cards</h2>
|
||||
<p>
|
||||
Below is a list of all the credit cards you have on file. You can view
|
||||
the full credit card information, or delete the information.
|
||||
</p>
|
||||
<p>
|
||||
Remember to delete credit card information as soon as possible to reduce to
|
||||
risk of information being stolen.
|
||||
</p>
|
||||
<div class='admin_summary_box'>
|
||||
<h3>All Credit Card Information</h3>
|
||||
<?php if(count($this->data['creditcards']) > 0): ?>
|
||||
<table class='summary_table'>
|
||||
<?php for($c = 0; $c < count($this->data['creditcards']); $c++): ?>
|
||||
<tr>
|
||||
<td class='summary_data'>
|
||||
<?php echo $this->data['creditcards'][$c]->card_name ?>
|
||||
</td>
|
||||
<td class='summary_actions'>
|
||||
<a href='/admin/creditcards.php?do=view&id=<?php echo $this->data['creditcards'][$c]['id'] ?>'>View</a>
|
||||
<a href='/admin/creditcards.php?do=delete&id=<?php echo $this->data['creditcards'][$c]['id'] ?>'>Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endfor; ?>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<p>There are currently no credit cards on file.</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
24
site/en/admin/creditcards.view.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<h2>Administrate FTI: Credit Cards</h2>
|
||||
<p>
|
||||
Below is the credit card information for the card you selected.
|
||||
</p>
|
||||
<p>
|
||||
Return to
|
||||
<a href='/admin/creditcards.php'>credit card list</a>.
|
||||
</p>
|
||||
<p>
|
||||
<a href='/admin/creditcards.php?do=delete&id=<?php echo $this->data['card']['id'] ?>'>
|
||||
Delete this card
|
||||
</a>
|
||||
</p>
|
||||
<div class='admin_summary_box' id='creditcards_summary'>
|
||||
<h3>Credit Card Information</h3>
|
||||
<table class='data_table'>
|
||||
<?php foreach($this->data['card'] as $key => $val): ?>
|
||||
<tr>
|
||||
<td class='data_key'><?php echo ucfirst(str_replace('_',' ',$key)) ?></td>
|
||||
<td class='data_value'><?php echo $val ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</div>
|
||||
68
site/en/admin/home.php
Normal file
@@ -0,0 +1,68 @@
|
||||
<h2>Administrate FTI</h2>
|
||||
<p>
|
||||
Welcome, John.
|
||||
</p>
|
||||
<div class='admin_summary_box' id='news_summary'>
|
||||
<h3>Recent News Items</h3>
|
||||
<p>
|
||||
<a href='/admin/news.php?do=add'>Add news post</a>
|
||||
</p>
|
||||
<?php if(count($this->data['news']) > 0): ?>
|
||||
<table class='summary_table'>
|
||||
<?php for($c = 0; ($c < 10 && $c < count($this->data['news'])); $c++): ?>
|
||||
<tr>
|
||||
<td class='summary_data'><?php echo $this->data['news'][$c]->title ?></td>
|
||||
<td class='summary_actions'>
|
||||
<a href='/admin/news.php?do=edit&id=<?php echo $this->data['news'][$c]['id'] ?>'>Edit</a>
|
||||
<a href='/admin/news.php?do=delete&id=<?php echo $this->data['news'][$c]['id'] ?>'>Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endfor; ?>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<p>There are currently no news posts on the home page.</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class='admin_summary_box' id='creditcards_summary'>
|
||||
<h3>Recent Credit Card Information</h3>
|
||||
<?php if(count($this->data['creditcards']) > 0): ?>
|
||||
<table class='summary_table'>
|
||||
<?php for($c = 0; ($c < 10 && $c < count($this->data['creditcards'])); $c++): ?>
|
||||
<tr>
|
||||
<td class='summary_data'>
|
||||
<?php echo $this->data['creditcards'][$c]->card_name ?>
|
||||
</td>
|
||||
<td class='summary_actions'>
|
||||
<a href='/admin/creditcards.php?do=view&id=<?php echo $this->data['creditcards'][$c]['id'] ?>'>View</a>
|
||||
<a href='/admin/creditcards.php?do=delete&id=<?php echo $this->data['creditcards'][$c]['id'] ?>'>Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endfor; ?>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<p>There is currently no credit card information on file.</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class='admin_summary_box'>
|
||||
<h3>Recent Passport Information</h3>
|
||||
<?php if(count($this->data['passports']) > 0): ?>
|
||||
<table class='summary_table'>
|
||||
<?php for($c = 0; ($c < 10 && $c < count($this->data['passports'])); $c++): ?>
|
||||
<tr>
|
||||
<td class='summary_data'>
|
||||
<?php echo $this->data['passports'][$c]->name ?>
|
||||
</td>
|
||||
<td class='summary_actions'>
|
||||
<a href='/admin/passports.php?do=view&id=<?php echo $this->data['passports'][$c]['id'] ?>'>View</a>
|
||||
<a href='/admin/passports.php?do=delete&id=<?php echo $this->data['passports'][$c]['id'] ?>'>Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endfor; ?>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<p>There are currently no passports on file.</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
74
site/en/admin/linksandnumbers.add.edit.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<h2>Administrate FTI: Links and Numbers</h2>
|
||||
<p>
|
||||
<?php if(isset($this->data['editing'])): ?>
|
||||
Edit the links and numbers item below and click on "Save item" at the bottom
|
||||
of the page when you are done.
|
||||
<?php else: ?>
|
||||
Add a links and numbers item to the links and numbers page by filling out the form below.
|
||||
<?php endif; ?>
|
||||
</p>
|
||||
<p>
|
||||
You make bold and italics text by selecting the text that you want to make
|
||||
bold or italics inside the "News text" box and clicking either the bold (b)
|
||||
button or the italics (i) button on the top right of the news box.
|
||||
</p>
|
||||
<p>
|
||||
Similarly, select any text that you want to make a link and click on
|
||||
the link button. A window will pop up and prompt you for the URL
|
||||
that you would like that text to link to.
|
||||
</p>
|
||||
<p>
|
||||
You can create two types of Links and Numbers items: Pages and External links.
|
||||
To create an External link, select that option from the "Type" list, enter
|
||||
a title for the link and put the URL for the link (only the URL) in the "Text"
|
||||
box.
|
||||
</p>
|
||||
<p>
|
||||
To create a regular Page, select that option for the "Type" list, enter a
|
||||
title that will appear on the Links and Numbers page and put the
|
||||
text for the page in the "Text" page.
|
||||
</p>
|
||||
<div class='admin_summary_box'>
|
||||
<h3><?php echo isset($this->data['editing']) ? 'Edit' : 'Add' ?> Links and Numbers Item</h3>
|
||||
<form action="linksandnumbers.php" method="post" id='linksandnumbers_form' accept-charset="utf-8">
|
||||
<input type="hidden" name="do" value="really<?php echo isset($this->data['item']) ? 'edit' : 'add' ?>" id="do"/>
|
||||
<?php if(isset($this->data['editing'])): ?>
|
||||
<input type='hidden' name='id' value='<?php echo $this->data['item']['id'] ?>' id='id'/>
|
||||
<?php endif; ?>
|
||||
<p class='field'>
|
||||
<label for='title'>Title</label>
|
||||
<input type="text" name="title"
|
||||
value="<?php echo isset($this->data['editing']) ? htmlspecialchars($this->data['item']->title) : '' ?>"
|
||||
id="title" class='long' />
|
||||
</p>
|
||||
<p class='field'>
|
||||
<label for='subtitle'>Subtitle</label>
|
||||
<input type="text" name="subtitle"
|
||||
value="<?php echo isset($this->data['editing']) ? htmlspecialchars($this->data['item']->subtitle) : '' ?>"
|
||||
id="subtitle" class='long' />
|
||||
</p>
|
||||
<p class='field'>
|
||||
<label for='type'>Type</label>
|
||||
<select name='type' id='type'>
|
||||
<?php
|
||||
foreach(array('External link','Page') as $type):
|
||||
$xmlType = strtolower(str_replace(' ','_',$type));
|
||||
if(isset($this->data['editing']) && $xmlType == (string)$this->data['item']->type):
|
||||
echo "<option value='$xmlType' selected='selected'>".$type."</option>";
|
||||
else:
|
||||
echo "<option value='$xmlType'>".$type."</option>";
|
||||
endif;
|
||||
endforeach;
|
||||
?>
|
||||
</select>
|
||||
</p>
|
||||
<p class='field'>
|
||||
<label for='text'>Links and numbers text</label>
|
||||
<?php include 'textboxbuttons.php' ?>
|
||||
<textarea id='text' name='text'><?php
|
||||
echo isset($this->data['editing']) ? preg_replace("#<!\[\CDATA\[(.*)]]>#","$1",(string)$this->data['item']->text) : ''
|
||||
?></textarea>
|
||||
</p>
|
||||
<p><input type="submit" value="<?php echo isset($this->data['editing']) ? 'Save' : 'Add' ?> item"></p>
|
||||
</form>
|
||||
</div>
|
||||
19
site/en/admin/linksandnumbers.delete.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<h2>Administrate FTI: Links and Number</h2>
|
||||
<p>
|
||||
Please decide if you really want to delete this links and numbers item below.
|
||||
</p>
|
||||
<div class='admin_summary_box'>
|
||||
<h3>Delete Links and Numbers Item</h3>
|
||||
<p>
|
||||
Do you really want to delete the links and numbers item
|
||||
"<?php echo $this->data['item']->title ?>"?
|
||||
</p>
|
||||
<form action="linksandnumbers.php" method="post" id='linksandnumbers_form' accept-charset="utf-8">
|
||||
<input type="hidden" name="do" value="reallydelete" id="do"/>
|
||||
<input type="hidden" name="id" value="<?php echo $this->data['item']['id'] ?>" id="id"/>
|
||||
<p>
|
||||
<input type="submit" value="Delete news item">
|
||||
<a href='linksandnumbers.php' title="Don't delete links and numbers item">No, return to links and numbers items list</a>
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
22
site/en/admin/linksandnumbers.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<h2>Administrate FTI: Links and Numbers</h2>
|
||||
<p>
|
||||
Below is a list of all the links and numbers items on the Links and
|
||||
Numbers page of FTI. You can add, edit or delete links and numbers items.
|
||||
</p>
|
||||
<div class='admin_summary_box' id='news_summary'>
|
||||
<h3>All Links and Numbers Items</h3>
|
||||
<p>
|
||||
<a href='/admin/linksandnumbers.php?do=add'>Add Links and Number Item</a>
|
||||
</p>
|
||||
<table class='summary_table'>
|
||||
<?php for($c = 0; $c < count($this->data['linksandnumbers']); $c++): ?>
|
||||
<tr>
|
||||
<td class='summary_data'><?php echo $this->data['linksandnumbers'][$c]->title ?></td>
|
||||
<td class='summary_actions'>
|
||||
<a href='/admin/linksandnumbers.php?do=edit&id=<?php echo $this->data['linksandnumbers'][$c]['id'] ?>'>Edit</a>
|
||||
<a href='/admin/linksandnumbers.php?do=delete&id=<?php echo $this->data['linksandnumbers'][$c]['id'] ?>'>Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endfor; ?>
|
||||
</table>
|
||||
</div>
|
||||
17
site/en/admin/login.php
Normal file
@@ -0,0 +1,17 @@
|
||||
<div class='login-box'>
|
||||
<h2>Login</h2>
|
||||
<form action="login.php" method="post" accept-charset="utf-8">
|
||||
<p class='field'>
|
||||
<label for='username'>Username</label>
|
||||
<input type="text" name="username" value="" id="username"/>
|
||||
</p>
|
||||
<p class='field'>
|
||||
<label for='password'>Password</label>
|
||||
<input type="password" name="password" value="" id="password"/>
|
||||
</p>
|
||||
<p><input type="submit" value="Login →"></p>
|
||||
</form>
|
||||
<p>
|
||||
« <a href='/' title='Home page'>Go to home page</a>
|
||||
</p>
|
||||
</div>
|
||||
7
site/en/admin/menu.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<ul id='admin_nav'>
|
||||
<li id='index_link'><a href='index.php'>Home</a></li>
|
||||
<li id='news_link'><a href='news.php'>News</a></li>
|
||||
<li id='creditcards_link'><a href='creditcards.php'>Credit Card Information</a></li>
|
||||
<li id='passports_link'><a href='passports.php'>Passports</a></li>
|
||||
<li id='linksandnumbers_link'><a href='linksandnumbers.php'>Links and Numbers</a></li>
|
||||
</ul>
|
||||
42
site/en/admin/news.add.edit.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<h2>Administrate FTI: News</h2>
|
||||
<p>
|
||||
<?php if(isset($this->data['editing'])): ?>
|
||||
Edit the news post below and click on "Save news item" at the bottom
|
||||
of the page when you are done.
|
||||
<?php else: ?>
|
||||
Add a news post to the front page by filling out the form below.
|
||||
<?php endif; ?>
|
||||
</p>
|
||||
<p>
|
||||
You make bold and italics text by selecting the text that you want to make
|
||||
bold or italics inside the "News text" box and clicking either the bold (b)
|
||||
button or the italics (i) button on the top right of the news box.
|
||||
</p>
|
||||
<p>
|
||||
Similarly, select any text that you want to make a link and click on
|
||||
the link button. A window will pop up and prompt you for the URL
|
||||
that you would like that text to link to.
|
||||
</p>
|
||||
<div class='admin_summary_box'>
|
||||
<h3><?php echo isset($this->data['editing']) ? 'Edit' : 'Add' ?> News Item</h3>
|
||||
<form action="news.php" method="post" id='news_form' accept-charset="utf-8">
|
||||
<input type="hidden" name="do" value="really<?php echo isset($this->data['newsitem']) ? 'edit' : 'add' ?>" id="do"/>
|
||||
<?php if(isset($this->data['editing'])): ?>
|
||||
<input type='hidden' name='id' value='<?php echo $this->data['newsitem']['id'] ?>' id='id'/>
|
||||
<?php endif; ?>
|
||||
<p class='field'>
|
||||
<label for='title'>Title</label>
|
||||
<input type="text" name="title"
|
||||
value="<?php echo isset($this->data['editing']) ? htmlspecialchars($this->data['newsitem']->title) : '' ?>"
|
||||
id="title" class='long' />
|
||||
</p>
|
||||
<p class='field'>
|
||||
<label for='text'>News text</label>
|
||||
<?php include 'textboxbuttons.php' ?>
|
||||
<textarea id='text' name='text'><?php
|
||||
echo isset($this->data['editing']) ? preg_replace("#<!\[\CDATA\[(.*)]]>#","$1",(string)$this->data['newsitem']->text) : ''
|
||||
?></textarea>
|
||||
</p>
|
||||
<p><input type="submit" value="<?php echo isset($this->data['editing']) ? 'Save' : 'Add' ?> news item"></p>
|
||||
</form>
|
||||
</div>
|
||||
19
site/en/admin/news.delete.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<h2>Administrate FTI: News</h2>
|
||||
<p>
|
||||
Please decide if you really want to delete this item below.
|
||||
</p>
|
||||
<div class='admin_summary_box'>
|
||||
<h3>Delete News Item</h3>
|
||||
<p>
|
||||
Do you really want to delete the news item
|
||||
"<?php echo $this->data['newsitem']->title ?>"?
|
||||
</p>
|
||||
<form action="news.php" method="post" id='news_form' accept-charset="utf-8">
|
||||
<input type="hidden" name="do" value="reallydelete" id="do"/>
|
||||
<input type="hidden" name="id" value="<?php echo $this->data['newsitem']['id'] ?>" id="id"/>
|
||||
<p>
|
||||
<input type="submit" value="Delete news item">
|
||||
<a href='news.php' title="Don't delete news item">No, don't delete news item</a>
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
22
site/en/admin/news.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<h2>Administrate FTI: News</h2>
|
||||
<p>
|
||||
Below is a list of all the news posts on the front page of FTI. You
|
||||
can add a news post, edit current news posts or delete current news posts.
|
||||
</p>
|
||||
<div class='admin_summary_box' id='news_summary'>
|
||||
<h3>All News Items</h3>
|
||||
<p>
|
||||
<a href='/admin/news.php?do=add'>Add news post</a>
|
||||
</p>
|
||||
<table class='summary_table'>
|
||||
<?php for($c = 0; $c < count($this->data['news']); $c++): ?>
|
||||
<tr>
|
||||
<td class='summary_data'><?php echo $this->data['news'][$c]->title ?></td>
|
||||
<td class='summary_actions'>
|
||||
<a href='/admin/news.php?do=edit&id=<?php echo $this->data['news'][$c]['id'] ?>'>Edit</a>
|
||||
<a href='/admin/news.php?do=delete&id=<?php echo $this->data['news'][$c]['id'] ?>'>Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endfor; ?>
|
||||
</table>
|
||||
</div>
|
||||
15
site/en/admin/passports.delete.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<h2>Administrate FTI: Passports</h2>
|
||||
<p>
|
||||
Are you sure you want to delete passport information for
|
||||
<?php echo $this->data['passport']->name ?>?
|
||||
</p>
|
||||
<p>
|
||||
<form action="passports.php" method="post" accept-charset="utf-8">
|
||||
<input type="hidden" name="id" value="<?php echo $this->data['passport']['id'] ?>" id="id"/>
|
||||
<input type="hidden" name="do" value="reallydelete" id="do"/>
|
||||
<p>
|
||||
<input type="submit" value="Yes, delete info"/>
|
||||
No, return to <a href='/admin/passports.php'>passport list</a>.
|
||||
</p>
|
||||
</form>
|
||||
</p>
|
||||
29
site/en/admin/passports.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<h2>Administrate FTI: Passports</h2>
|
||||
<p>
|
||||
Below is a list of all the passports you have on file. You can view
|
||||
the full passport information, or delete the information.
|
||||
</p>
|
||||
<p>
|
||||
Remember to delete passport information as soon as possible to reduce to
|
||||
risk of information being stolen.
|
||||
</p>
|
||||
<div class='admin_summary_box'>
|
||||
<h3>All Passport Information</h3>
|
||||
<?php if(count($this->data['passports']) > 0): ?>
|
||||
<table class='summary_table'>
|
||||
<?php for($c = 0; $c < count($this->data['passports']); $c++): ?>
|
||||
<tr>
|
||||
<td class='summary_data'>
|
||||
<?php echo $this->data['passports'][$c]->name ?>
|
||||
</td>
|
||||
<td class='summary_actions'>
|
||||
<a href='/admin/passports.php?do=view&id=<?php echo $this->data['passports'][$c]['id'] ?>'>View</a>
|
||||
<a href='/admin/passports.php?do=delete&id=<?php echo $this->data['passports'][$c]['id'] ?>'>Delete</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endfor; ?>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<p>There are currently no passports on file.</p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
24
site/en/admin/passports.view.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<h2>Administrate FTI: Passports</h2>
|
||||
<p>
|
||||
Below is the passport information for the passport you selected.
|
||||
</p>
|
||||
<p>
|
||||
Return to
|
||||
<a href='/admin/passports.php'>passport list</a>.
|
||||
</p>
|
||||
<p>
|
||||
<a href='/admin/passports.php?do=delete&id=<?php echo $this->data['passport']['id'] ?>'>
|
||||
Delete this passport
|
||||
</a>
|
||||
</p>
|
||||
<div class='admin_summary_box' id='passports_summary'>
|
||||
<h3>Passport Information</h3>
|
||||
<table class='data_table'>
|
||||
<?php foreach($this->data['passport'] as $key => $val): ?>
|
||||
<tr>
|
||||
<td class='data_key'><?php echo ucfirst(str_replace('_',' ',$key)) ?></td>
|
||||
<td class='data_value'><?php echo $val ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
</div>
|
||||
5
site/en/admin/textboxbuttons.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<div class='form_button_group'>
|
||||
<a href='javascript:void(0);' id='bold_btn' class='form_button' title='bold'><strong>b</strong></a>
|
||||
<a href='javascript:void(0);' id='italics_btn' class='form_button' title='Italics'><em>i</em></a>
|
||||
<a href='javascript:void(0);' id='link_btn' class='form_button' title='Link'>link</a>
|
||||
</div>
|
||||
130
site/en/bookingrequest.php
Normal file
@@ -0,0 +1,130 @@
|
||||
<div class='page-box-center'>
|
||||
<h2>Begin a Booking Request</h2>
|
||||
<p>
|
||||
To submit a booking request to Friendship Tours, simply fill out the
|
||||
form below with your information and click on "Review Information". After
|
||||
reviewing your information, if it is all correct, click on "Submit" to send
|
||||
us your request.
|
||||
</p>
|
||||
<form action="bookingrequest.php" method="post" accept-charset="utf-8" id='bookingrequest_form'>
|
||||
<fieldset>
|
||||
<legend>Travel Information</legend>
|
||||
<p class='field_medium'>
|
||||
Have you booked with us before?
|
||||
<select name='booked_with_us_before' id='booked_with_us_before'>
|
||||
<?php foreach(array('Yes','No') as $option): ?>
|
||||
<option <?php echo ($_POST['booked_with_us_before'] == $option) ? "selected='selected'" : ''; ?>><?php echo $option ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</p>
|
||||
<p>
|
||||
<strong>Passengers</strong><br />
|
||||
Please use the names exactly as they appear on the form of ID that
|
||||
you will be using when you travel. The US government requires that the
|
||||
names match exactly. The US government also requires the gender and
|
||||
the birthdate of each passenger, regardless of age.
|
||||
</p>
|
||||
<table class='passengers'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>First name</th>
|
||||
<th>Middle name</th>
|
||||
<th>Last name</th>
|
||||
<th>Gender</th>
|
||||
<th>Birthdate</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php for($idx = 0; $idx < (isset($this->data['info']) ? count($this->data['info']['FirstName']) : 4); $idx++): ?>
|
||||
<tr passengernumber='<?php echo $idx + 1; ?>'>
|
||||
<th>Passenger <?php echo $idx + 1; ?></th>
|
||||
<td>
|
||||
<input type="text" name="FirstName[]" value="<?php echo (isset($this->data['info']) ? $this->data['info']['FirstName'][$idx] : "") ?>"/>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="MiddleName[]" value="<?php echo (isset($this->data['info']) ? $this->data['info']['MiddleName'][$idx] : "") ?>"/>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" name="LastName[]" value="<?php echo (isset($this->data['info']) ? $this->data['info']['LastName'][$idx] : "") ?>"/>
|
||||
</td>
|
||||
<td>
|
||||
<select name="Gender[]">
|
||||
<?php foreach(array('Male','Female') as $option): ?>
|
||||
<option <?php echo (isset($this->data["info"]) ? $this->data["info"]["Gender"][$idx] : "Male") == $option ? "selected='selected'" : ''; ?>><?php echo $option ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<input name="Birthdate[]" type="text" class="date-input" value="<?php echo (isset($this->data['info']) ? $this->data['info']['Birthdate'][$idx] : "") ?>"/>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endfor; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<button class='passenger-btn' id="AddPassengerBtn">+ Add passenger</button>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>Departure Information</legend>
|
||||
<p class='field'>
|
||||
Departure city
|
||||
<input type="text" name="departure_city" value="<?php echo $this->data['info']['departure_city'] ?>" id="departure_city"/>
|
||||
</p>
|
||||
<p class='field'>
|
||||
Alt. departure city
|
||||
<input type="text" name="alt_departure_city" value="<?php echo $this->data['info']['alt_departure_city'] ?>" id="alt_departure_city"/>
|
||||
</p>
|
||||
<p class='field_long'>
|
||||
Departure date or range of dates if flexible
|
||||
<textarea name='departure_dates' id='departure_dates'><?php echo $this->data['info']['departure_dates'] ?></textarea>
|
||||
</p>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>Arrival Information</legend>
|
||||
<p class='field'>
|
||||
Arrival city
|
||||
<input type="text" name="arrival_city" value="<?php echo $this->data['info']['arrival_city'] ?>" id="arrival_city"/>
|
||||
</p>
|
||||
<p class='field_long'>
|
||||
Alternate arrival city (or other cities and dates on a multi-city trip)
|
||||
<textarea name='alt_arrival_cities' id='alt_arrival_cities'><?php echo $this->data['info']['alt_arrival_cities'] ?></textarea>
|
||||
</p>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>Return Information</legend>
|
||||
<p class='field_long'>
|
||||
Return date (or range of dates if flexible)
|
||||
<textarea name='return_dates' id='return_dates'><?php echo $this->data['info']['return_dates'] ?></textarea>
|
||||
</p>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>Miscellaneous Information</legend>
|
||||
<p class='field_long'>
|
||||
Frequent flyer program and number for each traveler
|
||||
<textarea name='frequent_flyer_information' id='frequent_flyer_information'><?php echo $this->data['info']['frequent_flyer_information'] ?></textarea>
|
||||
</p>
|
||||
<p class='field_medium'>
|
||||
Aisle or window seat preferred?
|
||||
<select name='window_or_aisle' id='window_or_aisle'>
|
||||
<?php foreach(array('Aisle','Window') as $option): ?>
|
||||
<option <?php echo ($_POST['window_or_aisle'] == $option) ? "selected='selected'" : ''; ?>><?php echo $option ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<span class='field_details'>Bulkhead and exit rows are blocked by the airlines.</span>
|
||||
</p>
|
||||
<p class='field_medium'>
|
||||
Preferred method of payment
|
||||
<select name='preferred_payment_method' id='preferred_payment_method'>
|
||||
<?php foreach(array('Check','Euros','Credit card','Bill mission') as $option): ?>
|
||||
<option <?php echo ($_POST['preferred_payment_method'] == $option) ? "selected='selected'" : ''; ?>><?php echo $option ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</p>
|
||||
<p class='field_medium'>
|
||||
E-mail address
|
||||
<input type="text" name="email_address" value="<?php echo $this->data['info']['email_address'] ?>" id="email_address"/>
|
||||
</p>
|
||||
</fieldset>
|
||||
<p><input type="submit" value="Review information" name='review_submit' id='review_submit'/></p>
|
||||
</form>
|
||||
</div>
|
||||
69
site/en/bookingrequest_review.php
Normal file
@@ -0,0 +1,69 @@
|
||||
<div class='page-box-center'>
|
||||
<h2>Review Your Booking Request Information</h2>
|
||||
<p>
|
||||
Please review the information that you have entered. Click on the "Edit"
|
||||
button below if you need to change anything. Otherwise, if everything is
|
||||
correct, click on the "Submit" button to send us your booking request.
|
||||
</p>
|
||||
<form action="bookingrequest.php" method="post" accept-charset="utf-8">
|
||||
<table class='data_table'>
|
||||
<?php foreach($this->data['info'] as $key => $val): ?>
|
||||
<?php if($key == 'review_submit'): continue; ?>
|
||||
<?php elseif($key == "FirstName"): continue; ?>
|
||||
<?php elseif($key == "MiddleName"): continue; ?>
|
||||
<?php elseif($key == "LastName"): continue; ?>
|
||||
<?php elseif($key == "Gender"): continue; ?>
|
||||
<?php elseif($key == "Birthdate"): continue; ?>
|
||||
<?php endif; ?>
|
||||
<tr>
|
||||
<td><strong><?php echo ucfirst(str_replace('_',' ',$key)) ?></strong></td>
|
||||
<td>
|
||||
<?php echo nl2br($val); ?>
|
||||
<input type="hidden" name="<?php echo $key ?>" value="<?php echo $val ?>" id="<?php echo $key ?>"/>
|
||||
</td>
|
||||
</tr>
|
||||
<?php if($key == "booked_with_us_before"): ?>
|
||||
<tr>
|
||||
<td><strong>Passengers</strong></td>
|
||||
<td>
|
||||
<table class='passengers-review'>
|
||||
<tbody>
|
||||
<?php for($idx = 0; $idx < count($this->data["info"]["FirstName"]); $idx++): ?>
|
||||
<?php if(!empty($this->data["info"]["FirstName"][$idx])): ?>
|
||||
<tr>
|
||||
<td>
|
||||
<?php echo $this->data["info"]["FirstName"][$idx] ?>
|
||||
<input type="hidden" name="FirstName[]" value="<?php echo $this->data["info"]["FirstName"][$idx] ?>" />
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $this->data["info"]["MiddleName"][$idx] ?>
|
||||
<input type="hidden" name="MiddleName[]" value="<?php echo $this->data["info"]["MiddleName"][$idx] ?>" />
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $this->data["info"]["LastName"][$idx] ?>
|
||||
<input type="hidden" name="LastName[]" value="<?php echo $this->data["info"]["LastName"][$idx] ?>" />
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $this->data["info"]["Gender"][$idx] ?>
|
||||
<input type="hidden" name="Gender[]" value="<?php echo $this->data["info"]["Gender"][$idx] ?>" />
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $this->data["info"]["Birthdate"][$idx] ?>
|
||||
<input type="hidden" name="Birthdate[]" value="<?php echo $this->data["info"]["Birthdate"][$idx] ?>" />
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php endfor; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
<p>
|
||||
<input type='submit' value='Edit Information' name='edit' id='edit'/>
|
||||
<input type="submit" value="Submit Request →" name='submit' id='submit'/>
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
177
site/en/creditcard.php
Normal file
@@ -0,0 +1,177 @@
|
||||
<div class='page-box-center'>
|
||||
<h2>Send your credit card information</h2>
|
||||
<p>
|
||||
You are now using a secure connection through which your credit card
|
||||
information will be sent. Just to be sure though, make sure the Address
|
||||
box at the top of your browser reads "https://" at the beginning of the
|
||||
address and not "http://". Note the 's' after "http". If there is no 's'
|
||||
after the "http" please go to the
|
||||
<a href='https://fti.powweb.com/creditcard.php' title='Secure credit card form'>secure form</a>.
|
||||
This same page will reload, but it will now be from a secure connection.
|
||||
</p>
|
||||
<p>
|
||||
<strong>Please note:</strong> All fields are required!
|
||||
</p>
|
||||
<form action="creditcard.php" method="post" accept-charset="utf-8" id='creditcard_form'>
|
||||
<fieldset>
|
||||
<legend>Credit Card Information</legend>
|
||||
<p class='field'>
|
||||
Type of Credit Card
|
||||
<select name="card_type" id="card_type">
|
||||
<option selected="selected" value="Visa">Visa</option>
|
||||
<option value="MasterCard">MasterCard</option>
|
||||
<option value="Discover">Discover</option>
|
||||
<option value="American_Express">American Express</option>
|
||||
<option value="Diners_Club">Diner's Club</option>
|
||||
<option value="JCB">JCB</option>
|
||||
<option value="TP">TP</option>
|
||||
</select>
|
||||
</p>
|
||||
<p class='field'>
|
||||
Cardholder's Name
|
||||
<input type="text" name="card_name" id="card_name" />
|
||||
<span class="field_details">Your name as it appears on the card.</span>
|
||||
</p>
|
||||
<p class='field'>
|
||||
Credit Card Number
|
||||
<input type="text" name="card_number" id="card_number" />
|
||||
</p>
|
||||
<p class='field'>
|
||||
Security Code Number
|
||||
<input type="text" size="4" name="card_cvv" id="card_cvv" />
|
||||
<span class='field_details'>Click <a href="javascript:void(0)" id='cvv_help'>here</a> for help with the CVV number.</span>
|
||||
</p>
|
||||
<p class='date'>
|
||||
Expiration Date (mm/yyyy)
|
||||
<span class='date_fields'>
|
||||
<select name="card_expiration_month" id="card_expiration_month">
|
||||
<option>01</option>
|
||||
<option>02</option>
|
||||
<option>03</option>
|
||||
<option>04</option>
|
||||
<option>05</option>
|
||||
<option>06</option>
|
||||
<option>07</option>
|
||||
<option>08</option>
|
||||
<option>09</option>
|
||||
<option>10</option>
|
||||
<option>11</option>
|
||||
<option>12</option>
|
||||
</select>
|
||||
<select name="card_expiration_year" id="card_expiration_year">
|
||||
<?php foreach(range(date('Y'),date('Y')+20) as $year): ?>
|
||||
<option><?php echo $year ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</span>
|
||||
</p>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>Billing Address</legend>
|
||||
<p class='field'>
|
||||
Full Name
|
||||
<input type="text" size="20" name="billing_full_name" id="billing_full_name" />
|
||||
</p>
|
||||
<p class='field'>
|
||||
Address
|
||||
<input type="text" size="25" name="billing_address_line1" id="billing_address_line1" />
|
||||
</p>
|
||||
<p class='field'>
|
||||
|
||||
<input type="text" size="25" name="billing_address_line2" id="billing_address_line2" />
|
||||
</p>
|
||||
<p class='field'>
|
||||
City
|
||||
<input type="text" size="25" name="billing_city" id="billing_city" />
|
||||
</p>
|
||||
<p class='field'>
|
||||
State/Province/Region
|
||||
<input type="text" size="25" name="billing_state" id="billing_state" />
|
||||
</p>
|
||||
<p class='field'>
|
||||
ZIP/Postal Code
|
||||
<input type="text" size="10" name="billing_postal_code" id="billing_postal_code" />
|
||||
</p>
|
||||
<p class='field'>
|
||||
Country
|
||||
<select name="billing_country" id="billing_country">
|
||||
<option selected="selected"> United States</option><option>Afghanistan</option><option>Albania</option>
|
||||
<option>Algeria</option><option>American Samoa</option><option>Andorra</option><option>Anguilla</option>
|
||||
<option>Antarctica</option><option>Antigua And Barbuda</option><option>Argentina</option>
|
||||
<option>Armenia</option><option>Aruba</option><option>Australia</option>
|
||||
<option>Austria</option><option>Azerbaijan</option><option>Bahamas</option>
|
||||
<option>Bahrain</option><option>Bangladesh</option><option>Barbados</option>
|
||||
<option>Belarus</option><option>Belgium</option><option>Belize</option>
|
||||
<option>Benin</option><option>Bermuda</option><option>Bhutan</option>
|
||||
<option>Bolivia</option><option>Bosnia and Herzegovina</option><option>Botswana</option>
|
||||
<option>Bouvet Island</option><option>Brazil</option><option>British Indian Ocean Territory</option>
|
||||
<option>Brunei Darussalam</option><option>Bulgaria</option><option>Burkina Faso</option>
|
||||
<option>Burundi</option><option>Cambodia</option><option>Cameroon</option><option>Canada</option>
|
||||
<option>Cape Verde</option><option>Cayman Islands</option><option>Central African Republic</option>
|
||||
<option>Chad</option><option>Chile</option><option>China</option><option>Christmas Island</option>
|
||||
<option>Cocos (Keeling) Islands</option><option>Colombia</option><option>Comoros</option>
|
||||
<option>Congo</option><option>Congo, the Democratic Republic of the</option><option>Cook Islands</option>
|
||||
<option>Costa Rica</option><option>Cote d'Ivoire</option><option>Croatia</option><option>Cyprus</option>
|
||||
<option>Czech Republic</option><option>Denmark</option><option>Djibouti</option><option>Dominica</option>
|
||||
<option>Dominican Republic</option><option>East Timor</option><option>Ecuador</option><option>Egypt</option>
|
||||
<option>El Salvador</option><option>England</option><option>Equatorial Guinea</option><option>Eritrea</option>
|
||||
<option>Espana</option><option>Estonia</option><option>Ethiopia</option><option>Falkland Islands</option>
|
||||
<option>Faroe Islands</option><option>Fiji</option><option>Finland</option><option>France</option>
|
||||
<option>French Guiana</option><option>French Polynesia</option><option>French Southern Territories</option>
|
||||
<option>Gabon</option><option>Gambia</option><option>Georgia</option><option>Germany</option>
|
||||
<option>Ghana</option><option>Gibraltar</option><option>Great Britain</option><option>Greece</option>
|
||||
<option>Greenland</option><option>Grenada</option><option>Guadeloupe</option><option>Guam</option>
|
||||
<option>Guatemala</option><option>Guinea</option><option>Guinea-Bissau</option><option>Guyana</option>
|
||||
<option>Haiti</option><option>Heard and Mc Donald Islands</option><option>Honduras</option>
|
||||
<option>Hong Kong</option><option>Hungary</option><option>Iceland</option><option>India</option>
|
||||
<option>Indonesia</option><option>Ireland</option><option>Israel</option><option>Italy</option>
|
||||
<option>Jamaica</option><option>Japan</option><option>Jordan</option><option>Kazakhstan</option>
|
||||
<option>Kenya</option><option>Kiribati</option><option>Korea, Republic of</option><option>Korea (South)</option>
|
||||
<option>Kuwait</option><option>Kyrgyzstan</option><option>Lao People's Democratic Republic</option>
|
||||
<option>Latvia</option><option>Lebanon</option><option>Lesotho</option><option>Liberia</option>
|
||||
<option>Liechtenstein</option><option>Lithuania</option><option>Luxembourg</option><option>Macau</option>
|
||||
<option>Macedonia</option><option>Madagascar</option><option>Malawi</option><option>Malaysia</option>
|
||||
<option>Maldives</option><option>Mali</option><option>Malta</option><option>Marshall Islands</option>
|
||||
<option>Martinique</option><option>Mauritania</option><option>Mauritius</option><option>Mayotte</option>
|
||||
<option>Mexico</option><option>Micronesia, Federated States of</option><option>Moldova, Republic of</option>
|
||||
<option>Monaco</option><option>Mongolia</option><option>Montserrat</option><option>Morocco</option>
|
||||
<option>Mozambique</option><option>Namibia</option><option>Nauru</option><option>Nepal</option>
|
||||
<option>Netherlands</option><option>Netherlands Antilles</option><option>New Caledonia</option>
|
||||
<option>New Zealand</option><option>Nicaragua</option><option>Niger</option><option>Nigeria</option>
|
||||
<option>Niue</option><option>Norfolk Island</option><option>Northern Ireland</option>
|
||||
<option>Northern Mariana Islands</option><option>Norway</option><option>Oman</option>
|
||||
<option>Pakistan</option><option>Palau</option><option>Panama</option><option>Papua New Guinea</option>
|
||||
<option>Paraguay</option><option>Peru</option><option>Philippines</option><option>Pitcairn</option>
|
||||
<option>Poland</option><option>Portugal</option><option>Puerto Rico</option><option>Qatar</option>
|
||||
<option>Reunion</option><option>Romania</option><option>Russia</option><option>Russian Federation</option>
|
||||
<option>Rwanda</option><option>Saint Kitts and Nevis</option><option>Saint Lucia</option>
|
||||
<option>Saint Vincent and the Grenadines</option><option>Samoa (Independent)</option>
|
||||
<option>San Marino</option><option>Sao Tome and Principe</option><option>Saudi Arabia</option>
|
||||
<option>Scotland</option><option>Senegal</option><option>Seychelles</option><option>Sierra Leone</option>
|
||||
<option>Singapore</option><option>Slovakia</option><option>Slovenia</option><option>Solomon Islands</option>
|
||||
<option>Somalia</option><option>South Africa</option><option>South Georgia and the South Sandwich Islands</option>
|
||||
<option>South Korea</option><option>Spain</option><option>Sri Lanka</option><option>St. Helena</option>
|
||||
<option>St. Pierre and Miquelon</option><option>Suriname</option><option>Svalbard and Jan Mayen Islands</option>
|
||||
<option>Swaziland</option><option>Sweden</option><option>Switzerland</option><option>Taiwan</option>
|
||||
<option>Tajikistan</option><option>Tanzania</option><option>Thailand</option><option>Togo</option>
|
||||
<option>Tokelau</option><option>Tonga</option><option>Trinidad</option><option>Trinidad and Tobago</option>
|
||||
<option>Tunisia</option><option>Turkey</option><option>Turkmenistan</option><option>Turks and Caicos Islands</option>
|
||||
<option>Tuvalu</option><option>Uganda</option><option>Ukraine</option><option>United Arab Emirates</option>
|
||||
<option>United Kingdom</option><option>United States</option><option>United States Minor Outlying Islands</option>
|
||||
<option>Uruguay</option><option>USA</option><option>Uzbekistan</option><option>Vanuatu</option>
|
||||
<option>Vatican City State (Holy See)</option><option>Venezuela</option><option>Viet Nam</option>
|
||||
<option>Virgin Islands (British)</option><option>Virgin Islands (U.S.)</option><option>Wales</option>
|
||||
<option>Wallis and Futuna Islands</option><option>Western Sahara</option><option>Yemen</option>
|
||||
<option>Yugoslavia</option><option>Zambia</option><option>Zimbabwe</option>
|
||||
</select>
|
||||
</p>
|
||||
<p class='field'>
|
||||
E-mail Address
|
||||
<input type="text" size="25" name="billing_email" id="billing_email" />
|
||||
</p>
|
||||
</fieldset>
|
||||
<p>
|
||||
<input type="submit" value="Submit Information">
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
10
site/en/footer.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<p>
|
||||
Copyright: Friendship Tours International<br />
|
||||
Site dedicated in memory of Paul E. Nielsen<br />
|
||||
Site designed and maintained by <a href='http://benramey.com' title='Ben Ramey'>Ben Ramey</a>
|
||||
</p>
|
||||
|
||||
<form action="http://www.arccorp.com/join/arc_check.jsp" method="post">
|
||||
<input type="hidden" id="checkNumber" name="checkNumber" value="24590171" />
|
||||
<input type="image" src="http://www.arccorp.com/img/accBlk.gif" alt="Click to Verify" title="Click to verify" />
|
||||
</form>
|
||||
6
site/en/header.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<a id='top'></a>
|
||||
<h1>
|
||||
<a href='index.php' title='Friendship Tours International'>
|
||||
Friendship Tours International
|
||||
</a>
|
||||
</h1>
|
||||
8
site/en/history.php
Normal file
@@ -0,0 +1,8 @@
|
||||
<div class='page-box-center'>
|
||||
<h2>History of Friendship Tours International</h2>
|
||||
<p>Friendship Tours came into existence in 1979 as a result of brainstorming between a missionary residing in Vienna, Austria and a businessman in Holland, Michigan, USA. The missionary was travelling frequently into then-communist Eastern Europe. He was not able to state his true reasons for his frequent travels (to disciple and train Christian leaders in those countries). He needed a better "public" reason or "cover" for his travels than being a teacher. The two men came up with the idea of a tour company. This company would organize tours that could tour various countries in Eastern Europe, thus bringing tourists and much-needed western currency to these countries. Friendship Tours was incorporated in the state of Michigan in 1979. This strategy worked well, actually allowing several missionaries to use the company to allow them greater access to travel throughout Eastern Europe.</p>
|
||||
<p>In 1982, John Nielsen moved to Vienna, Austria to work in the mission office. Among other things, one of his responsibilities was to continue to allow Friendship Tours (FTI) to be a viable entity for access by missionaries to Eastern Europe. However, John also wanted to see FTI become a vehicle to help missionaries with their own travel arrangements. John vigorously pursued the least expensive flights, whether for those traveling back to the USA for home assignments, or for ministry travel within Europe. Initially this service was provided only to missionaries employed by the mission board John served with. By 1988, this expanded to serving a handful of missions. By 1992, word had spread through the mission grapevine of John's knack for tracking down economical flights. Since then, John has been working full-time to help missionaries with their travel needs.</p>
|
||||
<p>In 1998, John relocated from Vienna to Brainerd, MN. This has allowed John to research and offer even greater travel bargains to missionaries, being able to compare airfares he can obtain on either side of the Atlantic, then purchasing the tickets wherever is most economical.</p>
|
||||
<p>FTI currently serves over 300 missionaries serving with over 30 mission boards from its base in Brainerd, MN. The original reason for the formation of FTI is actually still being used. No less than two missionaries are continuing to gain access to countries closed to traditional missionaries through association with the company. Due to the sensitive nature of this ministry, the locations can not be mentioned.</p>
|
||||
<p>Thank you for your interest in this ministry to missionaries.</p>
|
||||
</div>
|
||||
58
site/en/home.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<p class='intro'>
|
||||
Thank you for visiting our web site. Friendship Tours International (FTI)
|
||||
is a travel agency that specializes in travel planning for Christian
|
||||
organizations and individuals. We strive to give you the best possible
|
||||
fares for your trip, as we realize the budget constraints of many non-profit
|
||||
organizations. Please take a moment to browse our site and feel free to send
|
||||
us your comments.
|
||||
</p>
|
||||
|
||||
<div id='news-jumper'>
|
||||
<select id='news-jumper-select'>
|
||||
<option value=''>Jump to news post</option>
|
||||
<?php for($c = count($this->data['news']) - 1; $c >= 0; $c--): ?>
|
||||
<option value='news_<?php echo $this->data['news'][$c]['id'] ?>'><?php echo $this->data['news'][$c]->title ?></option>
|
||||
<?php endfor; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div id="news" class='page-box-left'>
|
||||
<h2>News Updates</h2>
|
||||
<?php for($c = count($this->data['news']) - 1; $c >= 0; $c--): ?>
|
||||
<div class="news-item">
|
||||
<h3 id='news_<?php echo $this->data['news'][$c]['id'] ?>'><?php echo $this->data['news'][$c]->title ?></h3>
|
||||
<?php if(count($this->data['news']) > $c): ?>
|
||||
<p class='top-link'>- <a href='#top' title='Go to top of page'>top</a> -</p>
|
||||
<?php endif; ?>
|
||||
<?php echo nl2br(xml_nl_to_paragraph(xml_parse_bbcode((string)$this->data['news'][$c]->text))) ?>
|
||||
</div>
|
||||
<?php endfor; ?>
|
||||
</div>
|
||||
|
||||
<div id="contact-info" class='page-box-right'>
|
||||
<h2>Contact Information</h2>
|
||||
<p>
|
||||
<strong>E-mail:</strong><br />
|
||||
<a href='mailto:travel@friendshiptours.org' title='E-mail Friendship Tours'>
|
||||
travel@friendshiptours.org
|
||||
</a>
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
<strong>Telephone Number:</strong><br />
|
||||
(218) 824-8000
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
<strong>Fax Number:</strong><br />
|
||||
(218) 824-8001
|
||||
</p>
|
||||
<hr />
|
||||
<p>
|
||||
<strong>Address:</strong><br />
|
||||
Friendship Tours International<br />
|
||||
John Nielsen<br />
|
||||
2029 S. 6th Street Ste 106<br />
|
||||
Brainerd, MN 56401<br />
|
||||
USA<br />
|
||||
</p>
|
||||
</div>
|
||||
27
site/en/itinerary_beforecontinuing.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<div class='page-box-center'>
|
||||
<h2>Before you continue!</h2>
|
||||
<p>In order to view your itinerary online, you will need to enter the following information:</p>
|
||||
<ul>
|
||||
<?php if($this->data['itinerary_type'] != 'noinstructions'): ?>
|
||||
<li>
|
||||
Your reservation code (this is a combination of 5 or 6 letters and numbers).
|
||||
Use the special code that John gave you, and NOT the code that is found toward
|
||||
the top of your itinerary either on the printed itinerary you received with
|
||||
your tickets or in an E-mail that was sent to you.
|
||||
</li>
|
||||
<li>
|
||||
Your last name
|
||||
</li>
|
||||
<?php else: ?>
|
||||
<li>
|
||||
Your reservation code (this is a combination of 5 or 6 letters and numbers and can be found toward the top of your itinerary either on
|
||||
the printed itinerary you received with your tickets or in an EMail that was sent to you).
|
||||
</li>
|
||||
<li>
|
||||
Your last name
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
</ul>
|
||||
<p>Thank you! Please click on the link below to continue to view your itinerary.</p>
|
||||
<p><a href="viewyouritinerary.php?type=<?php echo $this->data['itinerary_type'] ?>">Continue to view itinerary</a></p>
|
||||
</div>
|
||||
25
site/en/linksandnumbers.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<div class='page-box-center'>
|
||||
<h2>Links and Numbers</h2>
|
||||
<p>Below are links to other websites and other important information.</p>
|
||||
<ul class='linksandnumbers-list'>
|
||||
<li>
|
||||
<a href="passportinfo.php">Your passport and birthdate information</a>
|
||||
</li>
|
||||
<?php foreach($this->data['items'] as $item): ?>
|
||||
<li>
|
||||
<?php if((string)$item->type == 'page'): ?>
|
||||
<a href="linksandnumbers.php?id=<?php echo $item['id'] ?>">
|
||||
<?php echo $item->title ?>
|
||||
</a>
|
||||
<?php elseif((string)$item->type == 'external_link'): ?>
|
||||
<a href="<?php echo $item->text ?>">
|
||||
<?php echo $item->title ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
<?php if((string)$item->subtitle !== ''): ?>
|
||||
<em>- <?php echo $item->subtitle ?></em>
|
||||
<?php endif; ?>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
4
site/en/linksandnumbers.subpage.php
Normal file
@@ -0,0 +1,4 @@
|
||||
<div class='page-box-center'>
|
||||
<h2><?php echo $this->data['item']->title ?></h2>
|
||||
<?php echo nl2br(xml_nl_to_paragraph(xml_parse_bbcode((string)$this->data['item']->text))) ?>
|
||||
</div>
|
||||
10
site/en/menu.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<ul id='nav'>
|
||||
<li id='home_link'><a href='index.php' title='Home'>Home</a></li>
|
||||
<li id='history_link'><a href='history.php' title='History of FTI'>History of FTI</a></li>
|
||||
<li id='linksandnumbers_link'><a href='linksandnumbers.php' title='Links and numbers'>Links and Numbers</a></li>
|
||||
</ul>
|
||||
<ul id='nav2'>
|
||||
<li id='viewyouritinerary_link'><a href='viewyouritinerary.php' title='View your itinerary'>View Your Itinerary</a></li>
|
||||
<li id='creditcard_link'><a href='https://fti.powweb.com/creditcard.php' title='Use your credit card'>Use Your Credit Card</a></li>
|
||||
<li id='sendemail_link'><a href='mailto:travel@friendshiptours.org' title='Send us and e-mail'>Send Us an E-mail</a></li>
|
||||
</ul>
|
||||
37
site/en/passportinfo.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<div class='page-box-center'>
|
||||
<h2>Passport and birthdate information</h2>
|
||||
<form action="passportinfo.php" method="post" accept-charset="utf-8" id='passportinfo_form'>
|
||||
<p>Please fill out each field.</p>
|
||||
<fieldset class='person'>
|
||||
<legend>Passport Information</legend>
|
||||
<p class='field'>
|
||||
Name as on passport
|
||||
<input type="text" size="30" name="passport_name[]" id="passport_name" />
|
||||
</p>
|
||||
<p class='field'>
|
||||
Birthdate (mm/dd/yyyy)
|
||||
<input type="text" size="10" name="passport_birthdate[]" id="birthdate" />
|
||||
</p>
|
||||
<p class='field'>
|
||||
Passport number
|
||||
<input type="text" size="30" name="passport_number[]" id="passport_number" />
|
||||
</p>
|
||||
<p class='field'>
|
||||
Passport expiration date
|
||||
<input type="text" size="10" name="passport_expirationdate[]" id="passport_expirationdate" />
|
||||
</p>
|
||||
<p class='field'>
|
||||
Country of passport issuance
|
||||
<input type="text" size="30" name="passport_country[]" id="passport_country" />
|
||||
</p>
|
||||
<p><input type="button" name="delete_person" value="- Delete person" class='delete_person' disabled='disabled'/></p>
|
||||
</fieldset>
|
||||
<p>
|
||||
<input type='button' id='add_person' name='add_person' value='+ Add a person'/>
|
||||
</p>
|
||||
<p class='field'>
|
||||
|
||||
<input type="submit" value="Submit Information"/>
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
22
site/en/viewyouritinerary.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<div class='page-box-center'>
|
||||
<h2>View Your Itinerary</h2>
|
||||
<p>
|
||||
If John has not given you any special instructions for viewing your itinerary
|
||||
then click <a href="itinerary_beforecontinuing.php?type=noinstructions">here</a>.
|
||||
</p>
|
||||
<p>Otherwise,</p>
|
||||
<ul>
|
||||
<li>
|
||||
If John mentioned Worldspan, click
|
||||
<a href='itinerary_beforecontinuing.php?type=worldspan'>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
If John mentioned Sabre, click
|
||||
<a href='itinerary_beforecontinuing.php?type=sabre'>here</a>.
|
||||
</li>
|
||||
<li>
|
||||
If John mentioned Amadeus, click
|
||||
<a href='itinerary_beforecontinuing.php?type=amadeus'>here</a>.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
BIN
site/graphics/icon_airplane.jpg
Executable file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
site/graphics/logo.gif
Executable file
|
After Width: | Height: | Size: 11 KiB |
57
site/javascript/admin/textboxbuttons.js
Normal file
@@ -0,0 +1,57 @@
|
||||
/***********************************************
|
||||
* Admin textbox button styles for: friendshiptours.org
|
||||
* Author: Benjamin Ramey
|
||||
* E-mail: ben.ramey@gmail.com
|
||||
* Created: Tue Feb 12 16:40:04 CST 2008
|
||||
***********************************************/
|
||||
$(function() {
|
||||
//
|
||||
// Bold button
|
||||
//
|
||||
$("#bold_btn").click(function() {
|
||||
var textBox = document.getElementById('text');
|
||||
// get the selected text
|
||||
var selectedText = (textBox.value).substring(textBox.selectionStart,textBox.selectionEnd);
|
||||
|
||||
if(selectedText.length > 0)
|
||||
{
|
||||
var boldText = "[b]"+selectedText+"[/b]";
|
||||
textBox.value = (textBox.value).replace(selectedText,boldText);
|
||||
}
|
||||
});
|
||||
//
|
||||
// Italics button
|
||||
//
|
||||
$("#italics_btn").click(function() {
|
||||
var textBox = document.getElementById('text');
|
||||
// get the selected text
|
||||
var selectedText = (textBox.value).substring(textBox.selectionStart,textBox.selectionEnd);
|
||||
|
||||
if(selectedText.length > 0)
|
||||
{
|
||||
var italicsText = "[i]"+selectedText+"[/i]";
|
||||
textBox.value = (textBox.value).replace(selectedText,italicsText);
|
||||
}
|
||||
});
|
||||
//
|
||||
// Link button
|
||||
//
|
||||
$("#link_btn").click(function() {
|
||||
var textBox = document.getElementById('text');
|
||||
// get the selected text
|
||||
var selectedText = (textBox.value).substring(textBox.selectionStart,textBox.selectionEnd);
|
||||
|
||||
if(selectedText.length > 0)
|
||||
{
|
||||
var linkHref = new String();
|
||||
while((linkHref = prompt("Please enter the URL for this link:")).length <= 0)
|
||||
;
|
||||
|
||||
if(linkHref.length > 0)
|
||||
{
|
||||
var italicsText = "[link href="+linkHref+"]"+selectedText+"[/link]";
|
||||
textBox.value = (textBox.value).replace(selectedText,italicsText);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
41
site/javascript/bookingrequest.js
Normal file
@@ -0,0 +1,41 @@
|
||||
//
|
||||
// Javascript for booking request page
|
||||
//
|
||||
// Ben Ramey
|
||||
// November 2009
|
||||
//
|
||||
$(document).ready(
|
||||
function()
|
||||
{
|
||||
$.datepicker.setDefaults({
|
||||
changeYear: true,
|
||||
changeMonth: true,
|
||||
minDate: "-100y",
|
||||
maxDate: "+1y",
|
||||
yearRange: "-100:+1"
|
||||
});
|
||||
|
||||
function AddPassenger(e)
|
||||
{
|
||||
var table = $("table.passengers");
|
||||
var newRow = $("table.passengers>tbody>tr:last-child").clone();
|
||||
var passengerLabelCell = newRow.find("th");
|
||||
var numExistingPassengers = table.find("tbody>tr").length;
|
||||
|
||||
passengerLabelCell.text("Passenger " + Number(numExistingPassengers + 1));
|
||||
newRow.find("input").removeAttr("id").val("");
|
||||
newRow.find("select").val("Male");
|
||||
newRow.find("input.date-input").removeClass("hasDatepicker").datepicker();
|
||||
newRow.attr("passengernumber", numExistingPassengers + 1);
|
||||
|
||||
table.append(newRow);
|
||||
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
// make all the date-input inputs datepickers
|
||||
$("input.date-input").datepicker();
|
||||
|
||||
$("button#AddPassengerBtn").click(AddPassenger);
|
||||
}
|
||||
);
|
||||
77
site/javascript/default.js
Normal file
@@ -0,0 +1,77 @@
|
||||
/***********************************************
|
||||
* Default javascript for: friendshiptours.org
|
||||
* Author: Benjamin Ramey
|
||||
* E-mail: ben.ramey@gmail.com
|
||||
* Created: Tue Dec 18 17:46:35 CST 2007
|
||||
***********************************************/
|
||||
$(function() {
|
||||
//
|
||||
// home page
|
||||
//
|
||||
if($("body").attr("id") == 'index')
|
||||
{
|
||||
$("#news-jumper-select").change(function() {
|
||||
if($(this).val() != '')
|
||||
{
|
||||
document.location = '#'+$(this).val();
|
||||
}
|
||||
});
|
||||
}
|
||||
//
|
||||
// passport info page
|
||||
//
|
||||
else if($("#passportinfo_form"))
|
||||
{
|
||||
$("#add_person").click(function() {
|
||||
var personHtml = "<fieldset class='person'>"+$("fieldset.person:first").html()+"</fieldset>";
|
||||
// insert a new fieldset with passport form after the first one
|
||||
$("fieldset.person:last").after(personHtml);
|
||||
// this element selected next is the fieldset we just added
|
||||
$("fieldset.person:last input.delete_person").attr("disabled",'').click(
|
||||
function() {
|
||||
DeletePassportPerson($(this));
|
||||
return false;
|
||||
});
|
||||
|
||||
// since we just added a person, we have at least two people, so we want
|
||||
// the first person's 'delete person' button enabled
|
||||
$("input.delete_person:first").attr('disabled','');
|
||||
|
||||
return false;
|
||||
});
|
||||
// apply delete person function to click on first delete person button
|
||||
$("input.delete_person").click(function() {
|
||||
DeletePassportPerson($(this));
|
||||
return false;
|
||||
});
|
||||
}
|
||||
//
|
||||
// credit card page
|
||||
//
|
||||
else if($("body").attr('id') == 'creditcard')
|
||||
{
|
||||
$("#cvv_help").click(function() {
|
||||
var message = "The security code is on the back of your card above and to the right of your signature - the last three digits located there.\n\n"
|
||||
+ "For example, a card with the number 1111 2222 3333 4444 will have 4444 123 written on the back.\n\n"
|
||||
+ "In this example, the number 123 is the security code.\n\n"
|
||||
+ "The exception to this is an American Express card. The security code in this case is a a four digit number on the FRONT of the card, above and to the right of the embossed number.";
|
||||
|
||||
alert(message);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
function DeletePassportPerson(buttonElement)
|
||||
{
|
||||
var numButtons = 0;
|
||||
// remove this person
|
||||
buttonElement.parents("fieldset").remove();
|
||||
|
||||
// count the number of buttons we have (which should be the number of
|
||||
// people we have too)
|
||||
$("input.delete_person").each(function() { numButtons++; });
|
||||
// disable the first delete person (so they can't delete ALL people and
|
||||
// submit none)
|
||||
if(numButtons < 2)
|
||||
$("input.delete_person:first").attr('disabled','disabled');
|
||||
}
|
||||
22
site/javascript/jquery-ui.min.js
vendored
Executable file
19
site/javascript/jquery.min.js
vendored
Executable file
62
site/layout/admin_layout.php
Normal file
@@ -0,0 +1,62 @@
|
||||
|
||||
<div id='main'>
|
||||
|
||||
<?php if($this->display['header']): ?>
|
||||
<!--BEGIN HEADER-->
|
||||
<div id='header'>
|
||||
<?php include $this->header; ?>
|
||||
</div>
|
||||
<!--END HEADER-->
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if($this->display['menu']): ?>
|
||||
<p>
|
||||
« <a href='/' title='FTI home page'>Go to home page</a>
|
||||
| <a href='login.php?logout=1' title='Logout'>Logout</a>
|
||||
</p>
|
||||
<!--BEGIN MENU-->
|
||||
<div id='menu'>
|
||||
<?php include $this->menu; ?>
|
||||
</div>
|
||||
<!--END MENU-->
|
||||
<?php endif; ?>
|
||||
|
||||
<!--BEGIN_ERRORS-->
|
||||
<?php if(!empty($this->errors)): ?>
|
||||
<div id='errors'>
|
||||
<ul>
|
||||
<?php foreach($this->errors as $err): ?>
|
||||
<li><?php echo $err ?></li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<!--END_ERRORS-->
|
||||
|
||||
<!--BEGIN_MESSAGES-->
|
||||
<?php if(!empty($this->messages)): ?>
|
||||
<div id='messages'>
|
||||
<ul>
|
||||
<?php foreach($this->messages as $msg): ?>
|
||||
<li><?php echo $msg ?></li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<!--END_MESSAGES-->
|
||||
|
||||
<div id='content'>
|
||||
<!--BEGIN_CONTENT-->
|
||||
<?php include $this->content; ?>
|
||||
<!--END_CONTENT-->
|
||||
</div>
|
||||
|
||||
<?php if($this->display['footer']): ?>
|
||||
<!--BEGIN FOOTER-->
|
||||
<div id='footer'>
|
||||
<?php include $this->footer; ?>
|
||||
</div>
|
||||
<!--END FOOTER-->
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
65
site/layout/default_layout.php
Executable file
@@ -0,0 +1,65 @@
|
||||
|
||||
<div id='main'>
|
||||
|
||||
<?php if($this->display['header']): ?>
|
||||
<!--BEGIN HEADER-->
|
||||
<div id='header'>
|
||||
<?php include $this->header; ?>
|
||||
</div>
|
||||
<!--END HEADER-->
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if($this->display['menu']): ?>
|
||||
<!--BEGIN MENU-->
|
||||
<div id='menu'>
|
||||
<?php include $this->menu; ?>
|
||||
</div>
|
||||
|
||||
<p class='sub-link'>
|
||||
<a href='bookingrequest.php' title='Begin a booking request'>
|
||||
Begin a Booking Request
|
||||
</a>
|
||||
</p>
|
||||
<!--END MENU-->
|
||||
<?php endif; ?>
|
||||
|
||||
<!--BEGIN_ERRORS-->
|
||||
<?php if(!empty($this->errors)): ?>
|
||||
<div id='errors'>
|
||||
<ul>
|
||||
<?php foreach($this->errors as $err): ?>
|
||||
<li><?php echo $err ?></li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<!--END_ERRORS-->
|
||||
|
||||
<!--BEGIN_MESSAGES-->
|
||||
<?php if(!empty($this->messages)): ?>
|
||||
<div id='messages'>
|
||||
<ul>
|
||||
<?php foreach($this->messages as $msg): ?>
|
||||
<li><?php echo $msg ?></li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<!--END_MESSAGES-->
|
||||
|
||||
<div id='content'>
|
||||
<!--BEGIN_CONTENT-->
|
||||
<?php include $this->content; ?>
|
||||
<!--END_CONTENT-->
|
||||
</div>
|
||||
|
||||
<div id='clearfooter'></div>
|
||||
|
||||
<?php if($this->display['footer']): ?>
|
||||
<!--BEGIN FOOTER-->
|
||||
<div id='footer'>
|
||||
<?php include $this->footer; ?>
|
||||
</div>
|
||||
<!--END FOOTER-->
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
26
site/layout/html.php
Executable file
@@ -0,0 +1,26 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title><?php echo $this->title ?></title>
|
||||
<?php
|
||||
|
||||
# print out all of our CSS file links
|
||||
foreach($this->cssFiles as $file)
|
||||
{
|
||||
print "<link href='$file' rel='stylesheet' type='text/css' />\n";
|
||||
}
|
||||
|
||||
# print out all of our Javascript file links
|
||||
foreach($this->jsFiles as $file)
|
||||
{
|
||||
print "<script type='text/javascript' src='$file'></script>\n";
|
||||
}
|
||||
|
||||
?>
|
||||
</head>
|
||||
<body id='<?php echo $this->pageName ?>'>
|
||||
<?php include $this->layout ?>
|
||||
</body>
|
||||
</html>
|
||||
4
site/layout/iframe_layout.php
Normal file
@@ -0,0 +1,4 @@
|
||||
<p class='iframe-link'>
|
||||
<a href='/' title='Friendship Tours International Home page'>Return to Friendship Tours International</a>
|
||||
</p>
|
||||
<iframe src='<?php echo $this->data['iframe_src'] ?>'/>
|
||||
27
travelinsurance.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
include 'php/classes/page.php';
|
||||
|
||||
$page = new Page();
|
||||
|
||||
$page->attr('title','Travel Insurance');
|
||||
$page->layout('iframe_layout.php');
|
||||
|
||||
$iframeSrc = '';
|
||||
switch(isset($_GET['type']) ? $_GET['type'] : '')
|
||||
{
|
||||
case 'cruisett':
|
||||
$iframeSrc = 'http://www.travelguard.com/agentlink.asp?ta_arc=24590171&header=false&sitecolor=778899&pcode=005600';
|
||||
break;
|
||||
case 'protectassist':
|
||||
$iframeSrc = 'http://www.travelguard.com/agentlink.asp?ta_arc=24590171&header=false&sitecolor=778899&pcode=005700';
|
||||
break;
|
||||
default:
|
||||
header('Location: linksandnumbers.php?id=4');
|
||||
break;
|
||||
}
|
||||
$page->data('iframe_src', $iframeSrc);
|
||||
|
||||
$page->process();
|
||||
|
||||
?>
|
||||
34
viewyouritinerary.php
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
include 'php/classes/page.php';
|
||||
|
||||
$page = new Page();
|
||||
|
||||
$page->attr('title','View Your Itinerary');
|
||||
$page->layout('iframe_layout.php');
|
||||
|
||||
$iframeSrc = '';
|
||||
switch(isset($_GET['type']) ? $_GET['type'] : '')
|
||||
{
|
||||
case 'noinstructions':
|
||||
$iframeSrc = 'https://viewtrip.com/';
|
||||
break;
|
||||
case 'worldspan':
|
||||
$iframeSrc = 'http://www.mytripandmore.com';
|
||||
break;
|
||||
case 'sabre':
|
||||
$iframeSrc = 'https://www.virtuallythere.com/new/homePage.html?pnr=&name=&language=0&style=&host=1W&clocktype=12&Finali=0&res=0';
|
||||
break;
|
||||
case 'amadeus':
|
||||
$iframeSrc = 'https://www.checkmytrip.com/ITN/LoginServlet?SITE=ITN&LANGUAGE=US';
|
||||
break;
|
||||
default:
|
||||
$page->layout('default_layout.php');
|
||||
$page->content('viewyouritinerary.php');
|
||||
break;
|
||||
}
|
||||
$page->data('iframe_src', $iframeSrc);
|
||||
|
||||
$page->process();
|
||||
|
||||
?>
|
||||