// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Subscribe & Unsubscribe Validation (subscribe.pl)
function SubscribeFormVal(){
    var ErrorMsg = "";
    var Email = document.SubscribeForm.Emailaddr.value;

    ErrorMsg=ValidateField(Email,"Email","Mandatory","Bad","|¦<>\\/",ErrorMsg);

    if (Email != ""){
        ErrorMsg=EmailCheck(Email,ErrorMsg);
        }

    // Display Error messages and return
    ErrorMsg=ErrorMsg.replace(/<br>/gi,"\n");
    if (ErrorMsg != "") {
        alert(ErrorMsg);
        return false;
        }
    else {
        document.SubscribeForm.Valid.value = "2";
        return true;
        }
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Contact Form Validation (contact.pl)
function ContactFormVal(){
    var ErrorMsg = "";
    // Get field values from HTML form
    var Name = document.ContactForm.Name.value;
    var Email = document.ContactForm.Emailaddr.value;
    var Msg = document.ContactForm.Message.value;
    var Addr = document.ContactForm.Address.value;
    var Num1 = document.ContactForm.Num1.value;
    var Num2 = document.ContactForm.Num2.value;
    var Subj=GetSelectedListboxItem("ContactForm","Subject");
    
    ErrorMsg=ValidateField(Email,"Email","Mandatory","Bad","|¦<>\\/",ErrorMsg);
    ErrorMsg=ValidateField(Name,"Name","Mandatory","Bad","|¦<>\\/",ErrorMsg);
    ErrorMsg=ValidateField(Msg,"Message","Mandatory","Bad","|¦<>\\/",ErrorMsg);
    ErrorMsg=ValidateField(Addr,"Address","Optional","Bad","|¦<>\\/",ErrorMsg);
    ErrorMsg=ValidateField(Num1,"Number 1","Optional","Good","0123456789 ",ErrorMsg);
    ErrorMsg=ValidateField(Num2,"Number 2","Optional","Good","0123456789 ",ErrorMsg);

    if (Subj == "Select a subject..."){
        ErrorMsg = ErrorMsg + "Please select a subject from the list<br>";
        }

    // Validate Email address, this will populate errormsg with an error if invalid
    if (Email != ""){
        EmailCheck(Email,ErrorMsg);
        }
    
    // Display Error messages and return
    ErrorMsg=ErrorMsg.replace(/<br>/gi,"\n");
    if (ErrorMsg != "") {
        alert(ErrorMsg);
        return false;
        }
    else {
        document.ContactForm.Valid.value = "2";
        return true;
        }
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Subscribe To Announcements Form Validation (announcementsubscribe.pl)
function ValidateSubAnnounceForm(){
    var ErrorMsg = "";
    // Get field values from HTML form
    var FirstName = document.SubAnnounceForm.FirstName.value;
    var LastName = document.SubAnnounceForm.LastName.value;
    var Email = document.SubAnnounceForm.Emailaddr.value;

    ErrorMsg=ValidateField(FirstName,"First Name","Mandatory","Bad","|¦<>\\/",ErrorMsg);
    ErrorMsg=ValidateField(LastName,"Last Name","Mandatory","Bad","|¦<>\\/",ErrorMsg);
    ErrorMsg=ValidateField(Email,"Email","Mandatory","Bad","|¦<>\\/",ErrorMsg);

    if (Email != ""){
        EmailCheck(Email,ErrorMsg);
        }
    
    // Display Error messages and return
    ErrorMsg=ErrorMsg.replace(/<br>/gi,"\n");
    if (ErrorMsg != "") {
        alert(ErrorMsg);
        return false;
        }
    else {
        document.SubAnnounceForm.Valid.value = "2";
        // get Date/Time and plant cookie with details
        var dts=GetDateTime();

        if (SubButn == "Subscribe"){
            // Set Cookie with | between first & last names
            var Person = FirstName+"|"+LastName+"|"+dts;
            createCookie("FAOS1",Person,1000);
            }
        else {
            // Erase Cookie on Unsubscribe
            eraseCookie("FAOS1");
            }
        return true;
        }
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Runs on-load of homepage and gets users first & last name from cookie (index.shtml)
function GetNameOnLoad(){
    var welcome_msg="<a href='subannouncements.shtml'>Members, click here to subscribe to club announcements</a>";
	// Fetch cookie value
	var cookie_value = readCookie("FAOS1");
	// Check if its null
    if (cookie_value != null) {
        // If there is a cookie then display welcome message, otherwise message above
        var name_array=cookie_value.split("|");         // Split cookie at |
        var Person=name_array[0]+" "+name_array[1]; // Get first and last names
        var LastVisit = "Last visit: "+name_array[2];
        var welcome_msg = "Welcome back "+name_array[0]+" "+LastVisit;
        // populate cookie with curent time
        var dts=GetDateTime();
        var Person=name_array[0]+"|"+name_array[1]+"|"+dts;
        createCookie("FAOS1",Person,1000);
        }
    document.getElementById("welcome").innerHTML = welcome_msg;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Gets value of the Submit button pressed and sets global variable (announcementsubscribe.pl)
function SubmitFunction(value){
    SubButn = value;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Homepage Image Swap Code (index.shtml)
// Switches between the first two homepage images starting at position 1 and 51
function ImageSwap(id){
    DefineShowDetails();
    var rc=DisplayImg(id);              // Display picture & text
    if (rc == "YES"){
        var delay = 10000;		// Dealy in mS (normal)
        }
    else {
        var delay = 0;		        // Dealy in mS (nothing to display)
        }
    if (id == 1){
        id=51;
        setTimeout("ImageSwap(51)",delay);
        }
    else {
        called=1;
        setTimeout("ImageSwap(1)",delay);
        }
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Display the Image defeined by "showID" (index.shtml)
function DisplayImg(showID) {
    SetupPaths();
    DefineShowDetails();
    var showname = shows[showID+1];
    var showstartdate = new Date(shows[showID+6]);
    var showenddate = new Date(shows[showID+7]);
    var today = new Date();

    var ms_to_go_start = showstartdate-today;			// mS to start of show
    var ms_to_go_end = showenddate-today;

    var s_days = new String(ms_to_go_start/86400000);		// Days to start of show
    var e_days = new String(ms_to_go_end/86400000);

    var num_days_to_start = Math.ceil(s_days);			// Round Up to nearest number
    var num_days_to_end = Math.ceil(e_days);

    var msg = "";
    var disp="YES";                         // Default displaying words and pic to YES
    var msg1 = "<b>"+showname+"<br>";       // Bold the showname and add a <br>
    var msg3="</b>";						// Close the Bold font

    // Work out start date status
    if (num_days_to_start > 1) {
        var s_status = "Future";
        }
    if (num_days_to_start == 1) {
        var s_status = "Tomorrow";
        }
    if (num_days_to_start == 0) {
        var s_status = "Now";
        }
    if (num_days_to_start < 0) {
        var s_status = "Past";
        }
    // Work out end date status
    if (num_days_to_end > 1) {
        var e_status = "Future";
        }
    if (num_days_to_end == 1) {
        var e_status = "Tomorrow";
        }
    if (num_days_to_end == 0) {
        var e_status = "Now";
        }
    if (num_days_to_end < 0) {
        var e_status = "Past";
        }
    // Work out Message to display
    if (s_status == "Future"){
        var msg2 = "Starts in " + num_days_to_start + " days";
        }
    if (s_status == "Tomorrow"){
        var msg2 = "Starts tomorrow";
        }
    if (s_status == "Now" && e_status == "Future"){
        var msg2 = "Starts today";
        }
    if (s_status == "Past" && e_status == "Future"){
        var msg2 = "Now on";
        }
    if (s_status == "Now" && e_status == "Now"){
        var msg2 = "Now on";
        }
    if (s_status == "Past" && e_status == "Now"){
        var msg2 = "Ends today";
        }
    if (e_status == "Tomorrow"){
        var msg2 = "Ends tomorrow";
        }
    if (e_status == "Past"){
        var msg1 = "";
        var msg2 = "";
        var msg3 = "";
        var disp="NO";                    // If show is in the past set disp = NO
        }

    // Assign messages to ID in HTML
    var msg=msg1+msg2+msg3;

    // Only display words if disp = YES
    if (disp == "YES"){
    	document.getElementById("screenmsg").innerHTML = msg;
        }
// Dont display any text if disp = "NO"
//     else {
//    	document.getElementById("screenmsg").innerHTML = "";
//    	return disp;
//        }

    if (disp == "YES"){
        var ImgName=shows[showID+21];
        var ImgPath=DynImages+"/"+ImgName;
        document.images['ImageSwap'].src = ImgPath;
        if (shows[showID+5]!=""){
            document.getElementById("linkto").innerHTML = '<b><A href='+shows[showID+5]+'>More &#187;</A></b>';
            }
        else {
            document.getElementById("linkto").innerHTML = "&nbsp;";
            }
    	return disp;
        }
// Dont display a new image if disp = "NO"
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Table used on Homepage and Productions page (index.shtml, productions.shtml)
function CreateTable(rows,cols) {
    // Table headings - not normally changed
    var tblhdr=new Array(4);
    tblhdr[1]="Production";
    tblhdr[2]="What";
    tblhdr[3]="When";
    tblhdr[4]="Where";

    // Get show details
    DefineShowDetails();

    // Adjust table if no third show details
    if (disporder3==0){
        var rows=rows-1;
        }

    // Wrap text around Seniors or Juniors
    shows[1]="Next "+shows[1]+" Show";
    shows[51]="Next "+shows[51]+" Show";
    shows[101]="Next "+shows[101]+" Show";

    // Wrap anchor around Venue, only if there is a venue declared
    if (shows[4]!=""){
        shows[4]='<A TARGET="new" HREF="'+shows[5]+'">'+shows[4]+'</A>';
        }
    if (shows[54]!=""){
        shows[54]='<A TARGET="new" HREF="'+shows[55]+'">'+shows[54]+'</A>';
        }
    if (shows[104]!=""){
        shows[104]='<A TARGET="new" HREF="'+shows[105]+'">'+shows[104]+'</A>';
        }

    // Wrap anchor around details page, only if there is a value declared
    if (shows[6]!=""){
        shows[2]='<A HREF="'+shows[6]+'">'+shows[2]+'</A>';
        }
    if (shows[56]!=""){
        shows[52]='<A HREF="'+shows[56]+'">'+shows[52]+'</A>';
        }
    if (shows[106]!=""){
        shows[102]='<A HREF="'+shows[106]+'">'+shows[102]+'</A>';
        }

    // Define Table HTML
    var tablehdr='<table class="style1a">';
    var tableftr="</table>";
    var trhdr="<tr>";
    var trftr="</tr>";
    var tdhdr='<td class="style6a">';
    var tdftr="</td>";
    var thhdr='<th class="style1">';
    var thftr="</th>";

    // Build Table
    var html=tablehdr;
    for (var r=1;r<=rows;r++){
        html+=trhdr;				// Do rows
        for (c=1;c<=cols;c++){
           if (r==1){
                html+=thhdr;
                html+="<b>"+tblhdr[c]+"</b>";
                html+=thftr;
                }
            else if (r==2) {
                html+=tdhdr;
                html+=shows[c+disporder1-1];
                html+=tdftr;
                }
            else if (r==3){
                html+=tdhdr;
                html+=shows[c+disporder2-1];
                html+=tdftr;
                }
            else if (r==4){
                html+=tdhdr;
                html+=shows[c+disporder3-1];
                html+=tdftr;
                }
            }
        html+=trftr;
        }
    html +=tableftr;
    // Print table
    document.getElementById("productionstable").innerHTML = html;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Privacy Statement window launch (all pages via footer privacy link)
function openwindow0(){
    window.open("","newwindow",'toolbar=0,location=0,scrollbar=0,width=400,height=160,leftmargin=0,topmargin=0,marginwidth=0,marginheight=0,resizable=0,left=50,top=50');
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// About Statement window launch (all pages via footer about link)
function openwindow1(){
    window.open("","newwindow",'toolbar=0,location=0,scrollbar=0,width=400,height=240,leftmargin=0,topmargin=0,marginwidth=0,marginheight=0,resizable=0,left=50,top=50');
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Validate the FAOS Guestbook AddGuestForm (addguest.pl)
function AddGuestFormVal(){
    var ErrorMsg = "";
    var Name = document.AddGuestForm.Name.value;
    var Email = document.AddGuestForm.Email.value;
    var Comment = document.AddGuestForm.Comment.value;

    // Get listbox value for Show
    var Show=GetSelectedListboxItem("AddGuestForm","Show");

    // Check that mandatory fields are completed
    ErrorMsg=ValidateField(Name,"Name","Mandatory","Bad","|¦<>\\/",ErrorMsg);
    ErrorMsg=ValidateField(Email,"Email","Mandatory","Bad","|¦<>\\/",ErrorMsg);
    ErrorMsg=ValidateField(Comment,"Comment","Mandatory","Bad","|¦<>\\/",ErrorMsg);

    if (Show=="Select Show..." || Show==null){
        ErrorMsg = ErrorMsg + "Show not selected \n";
        }
    if ((Email == "")||(Email == "Optional")){
        document.AddGuestForm.Email.value = "Withheld";
        Email = "Withheld";
        }
    // Validate Email address, this will populate errormsg with an error if invalid
    if (Email != "Withheld"){
        ErrorMsg=EmailCheck(Email,ErrorMsg);
        }

    // Check for enough spaces in Comment
    ErrorMsg=SpaceCheck(Comment,ErrorMsg);
    
    // Display Error messages and return
    ErrorMsg=ErrorMsg.replace(/<br>/gi,"\n");
    if (ErrorMsg != "") {
        alert(ErrorMsg);
        document.AddGuestForm.Valid.value = "0";
        document.AddGuestForm.Email.value = "Optional";
        return false;
        }
    else {
        var msgtime = GetDateTime();
        document.AddGuestForm.DateTime.value = msgtime;
        document.AddGuestForm.Valid.value = "2";
        return true;
        }
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Clears Email address field when user clicks (addguest.pl)
function ClearAddr(){
    document.AddGuestForm.Email.value="";
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Run the AddGuest Form (guestbook.shtml)
function RunAddGuest(){
    SetupPaths();
    location.href=PerlRoot+"/addguest.pl"+"?Valid=2";
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Run the AddGuest Form (guestbook.shtml)
function RunViewGuest(){
    SetupPaths();
    location.href=PerlRoot+"/viewguest.pl"+"?StartRow=0";
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Clear the no Javascript message (guestbookmain.htm))
function ClrJSMsg(){
    document.getElementById("jsmsg").innerHTML = "";
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Advanced Tickets Order Form Validation (tickets.pl)
function AdvTicketFormVal(){
    var ErrorMsg = "";
    // Get field values from HTML form
    var Seats = document.AdvTicketForm.Seats.value;
    var Name = document.AdvTicketForm.Name.value;
    var Email = document.AdvTicketForm.Email.value;
    var Perf=GetSelectedListboxItem("AdvTicketForm","Performance");
    var Row=GetSelectedListboxItem("AdvTicketForm","Row");

    // Check that mandatory fields are completed
    if (Perf == "Select Performance..."){
        ErrorMsg=ErrorMsg+"Please select a Performance from the list \n";
        }
    if (Row == "Select Row..."){
        ErrorMsg=ErrorMsg+"Please select a Row from the list \n";
        }
    ErrorMsg=ValidateField(Seats,"Seats","Mandatory","Good","0123456789, ",ErrorMsg);
    ErrorMsg=ValidateField(Name,"Name","Mandatory","Bad","|¦<>\\/",ErrorMsg);
    ErrorMsg=ValidateField(Email,"Email","Mandatory","Bad","|¦<>\\/",ErrorMsg);
    // Validate Email address, this will populate errormsg with an error if invalid
    if (Email != ""){
        ErrorMsg=EmailCheck(Email,ErrorMsg);
        }

    // Display Error messages and return
    ErrorMsg=ErrorMsg.replace(/<br>/gi,"\n");
    if (ErrorMsg != "") {
        alert(ErrorMsg);
        return false;
        }
    else {
        document.AdvTicketForm.Valid.value = "2";
        return true;
        }
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Find out date and divert to correct tickets page (tickets.shtml)
function ticket_page() {
    SetupTicketDates();
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Get Tickets Dates and production Name (notickets.shtml)
function noticket_page() {
    GetTicketDates("NoTicketsPage");
    GetProdName("R",1,0);
    GetSeatingPlan();
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Get Tickets Dates and production Name (advtickets.shtml)
function advticket_page() {
    GetTicketDates("AdvTicketsPage")
    GetTicketPrices("Seniors");
    GetProdName("R",2,0);
    GetContactNumber('Seniors')
    GetSeatingPlan();
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Get Tickets Dates and production Name (boxtickets.shtml)
function boxticket_page() {
    GetTicketDates("BoxTicketsPage")
    GetTicketPrices("Seniors");
    GetProdName("R",1,0);
    GetSeatingPlan();
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Divert to appropriate page if no Tickets or Juniors Tickets are being sold
// Get Dates that the tickets are available from in Ms (tickets.shtml)
function SetupTicketDates(){
    DefineShowDetails();
    var os=tickets;
    var os=GetRealOffset(os);
    if (tickets == 0){                      // No tickets are being sold
        location.href = 'nextshow.shtml';   // Re-direct to nextshow.shtml
        return;
        }
    // We are selling tickets
    // Get Show Type (Seniors or Juniors)
    var showtype=shows[os+0];
    // Re-Direct to appropriate tickets page
    if (showtype == "Juniors"){                     // If Juniors Show selling tickets
        location.href = 'onlinetickets.shtml';	    // Go to onlinetickets.shtml
        }
    else if(showtype == "Seniors"){
        var DateObj=new Date(shows[os+7]);      // Get Date Object (Show Ends)
        var showends=DateObj.getTime();         // Get Ms
    	var DateObj = new Date(shows[os+8]);    // Get Date Object (Adv Tickets Opens)
        var switch_date1=DateObj.getTime();     // Get Ms
    	var DateObj = new Date(shows[os+9]);    // Get Date Object (Adv Tickets Closes)
        var switch_date2=DateObj.getTime();     // Get Ms
    	var DateObj = new Date(shows[os+10]);   // Get Date Object (BoxOffice Opens)
        var switch_date3=DateObj.getTime();     // Get Ms
        SwitchTicketsPage(switch_date1,switch_date2,switch_date3,showends);
        }
	}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Divert user to correct tickets page (notickets.shtml, advtickets.shtml, or boxtickets.shtml)
// Depends on number of Ms to go is >0 or <0 for date1 and date2
function SwitchTicketsPage(switch_date1, switch_date2, switch_date3, showends) {
    var Today = new Date();                        // Get todays date object
    var TodayMs=Today.getTime();                   // Get Ms from object
    var ms_to_go1 = switch_date1-TodayMs;          // Get ms to go until adv tkts opens
    var ms_to_go2 = switch_date2-TodayMs;          // Get ms to go until adv tkts closes
    var ms_to_go3 = switch_date3-TodayMs;          // Get ms to go until box off opens
    var ms_to_go4 = showends-TodayMs;              // Get ms to go until showends
    ms_to_go4=ms_to_go4+86400000;                  // Add 1 day in ms so that show ends at the end of the day
//    alert ("Today="+TodayMs+"\nAdvOp="+switch_date1+"\nAdvCl="+switch_date2+"\nBoxOp="+switch_date3+"\nShowends="+showends);
//    alert("ms2date1="+ms_to_go1+"\nms2date2="+ms_to_go2+"\nms2date3="+ms_to_go3+"\nms2showends="+ms_to_go4);

    if (ms_to_go1 >= 0 ){
        location.href = 'notickets.shtml';      // If ms to go is >0 goto notickets.shtml
        }
    else {                                      // Otherwise go here and do second check
        if (ms_to_go2 >= 0 ){
            location.href = 'advtickets.shtml';	// If ms to go >0 goto advtickets.shtml
            }
    	else {                                  // Otherwise go here and do third check
            location.href = 'boxtickets.shtml';	// If negative number goto boxtickets.shtml
            }
        }
    if (ms_to_go4 < 0){
        location.href = 'nextshow.shtml';       // If positive number goto nextshow.shtml
        }
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Get all dates related to selling Tickets, display where necessary
function GetTicketDates(page) {
    DefineShowDetails();
    var os=tickets;
    var os=GetRealOffset(os);

    // Build Advanced Tickets Opens Date
    var DateObj = new Date(shows[os+8]);
    var dd=DateObj.getDate();     
    var mm=DateObj.getMonth()+1;
    var yyyy=DateObj.getFullYear();
    var mmm=FindMonth(mm);
    var adv_screen_date=dd+"-"+mmm+"-"+yyyy;
    // Build Advanced Tickets Closes Date
    var DateObj = new Date(shows[os+9]);
    var dd=DateObj.getDate();
    var mm=DateObj.getMonth()+1;
    var yyyy=DateObj.getFullYear();
    var mmm=FindMonth(mm);
    var adv_close_screen_date=dd+"-"+mmm+"-"+yyyy;
    // Build Box-Office Opens Date
    var DateObj = new Date(shows[os+10]);
    var dd=DateObj.getDate();
    var mm=DateObj.getMonth()+1;
    var yyyy=DateObj.getFullYear();
    var mmm=FindMonth(mm);
    var box_open_screen_date=dd+"-"+mmm+"-"+yyyy;

    // NOTE! Also change default number on tickets.shtml for user with JS switched off
    var adv_contact_num = shows[os+11];

    if (page == "BoxTicketsPage"){
        document.getElementById("boxopens").innerHTML = '<b>' + box_open_screen_date + '</b>';
        }
    if (page == "AdvTicketsPage"){
        document.getElementById("boxopens").innerHTML = '<b>' + box_open_screen_date + '</b>';
        document.getElementById("advcloses").innerHTML = '<b>' + adv_close_screen_date + '</b>';
        document.getElementById("contactnum").innerHTML = adv_contact_num;
        }
    if (page == "NoTicketsPage"){
        document.getElementById("advopens").innerHTML = '<b>' + adv_screen_date + '</b>';
        document.getElementById("boxopens").innerHTML = '<b>' + box_open_screen_date + '</b>';
        document.getElementById("advcloses").innerHTML = '<b>' + adv_close_screen_date + '</b>';
        }
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Display text for ticket prices
// Param0=Seniors or Juniors
function GetTicketPrices(cast){
    DefineShowDetails();
    if (cast=="Seniors") { var os=tickets; }
    else if (cast="Juniors") { var os=juniors; }
    var os=GetRealOffset(os);
    // Seniors Ticket Prices
    var SnrTicketTue = shows[os+12];                // Tuesday Price
    var SnrTicketWed = shows[os+13];                // Wednesday price
    var SnrTicketThu = shows[os+14];                // Thursday Price
    var SnrTicketFri = shows[os+15];                // Friday Price
    var SnrTicketSatMat = shows[os+16];             // Saturday Matinee Price
    var SnrTicketSatEve = shows[os+17];             // Saturday Evening Price
    var SnrTicketStu = shows[os+18];                // Students&Children Price
    var SnrTicketDis = shows[os+19];                // Disabled Price
    // Juniors Ticket Prices
    var JnrTicketAdu = shows[os+24];                // Juniors Adult Price
    var JnrTicketChi = shows[os+25];                // Juniors Child / OAP Price
    var JnrTicketFam = shows[os+26];                // Juniors Family Price
    var JnrTicketDis = shows[os+27];                // Juniors Disabled Price

    if (cast=="Seniors"){
        document.getElementById("SnrTicketTue").innerHTML = SnrTicketTue;
        document.getElementById("SnrTicketWed").innerHTML = SnrTicketWed;
        document.getElementById("SnrTicketThu").innerHTML = SnrTicketThu;
        document.getElementById("SnrTicketFri").innerHTML = SnrTicketFri;
        document.getElementById("SnrTicketSatMat").innerHTML = SnrTicketSatMat;
        document.getElementById("SnrTicketSatEve").innerHTML = SnrTicketSatEve;
        document.getElementById("SnrTicketStu").innerHTML = SnrTicketStu;
        document.getElementById("SnrTicketDis").innerHTML = SnrTicketDis;
        }
    else if (cast=="Juniors"){
        if (JnrTicketAdu == ""){ JnrTicketAdu="TBA";}
        if (JnrTicketChi == ""){ JnrTicketChi="TBA";}
        if (JnrTicketFam == ""){ JnrTicketFam="TBA";}
        if (JnrTicketDis == ""){ JnrTicketDis="TBA";}
        document.getElementById("JnrTicketAdu").innerHTML = JnrTicketAdu;
        document.getElementById("JnrTicketChi").innerHTML = JnrTicketChi;
        document.getElementById("JnrTicketFam").innerHTML = JnrTicketFam;
        document.getElementById("JnrTicketDis").innerHTML = JnrTicketDis;
        }
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Display text for Seniors Seating Plan
function GetSeatingPlan(){
    DefineShowDetails();
    var os=GetRealOffset(1);
    var SeatingPlan = shows[os+20];
    var SeatingPlan = "<a href="+SeatingPlan+">Seating Plan</a>";
    document.getElementById("SeatingPlan").innerHTML = SeatingPlan;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Display text for Tickets Contact Number
// Param0=Seniors or Juniors
function GetContactNumber(cast){
    DefineShowDetails();
    if (cast=="Seniors"){
        var os=tickets;
        var os=GetRealOffset(os);
        var contactnum = shows[os+11];               // Seniors Contact Number
        }
    else {
        var os=juniors;
        var os=GetRealOffset(os);
        var contactnum = shows[os+28];               // Juniors Contact Number
        }
    document.getElementById("contactnum").innerHTML = contactnum;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Display text for the Show Start Times
function GetShowStartTimes(cast){
    DefineShowDetails();
    if (cast=="Seniors"){ var os=rehearsals; }
    else if (cast="Juniors") { var os=juniors; }    
    var os=GetRealOffset(os);
    var EveningStart = shows[os+22];
    var MatineeStart = shows[os+23];
    if (MatineeStart == ""){ MatineeStart="N/A"; }
    document.getElementById("EveningStart").innerHTML = EveningStart;
    document.getElementById("MatineeStart").innerHTML = MatineeStart;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Get Dates for Shows (in a form that can be displayed)
function GetDates(cast){
    DefineShowDetails();
    if (cast=="Seniors") { var os=rehearsals; }
    else if (cast="Juniors") { var os=juniors; }
    var os=GetRealOffset(os);
    var DateRange=shows[os+2];
    document.getElementById("DateRange").innerHTML = DateRange;
    if (shows[os+23] != ""){
        document.getElementById("Matinee").innerHTML = "Includes a Matinee on the Saturday<br>";
        }
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Get the Production Name and dates and display where needed
// Param0=Stage; R=Rehearsing, A=Auditioning (Seniors), J=Juniors
// Param1=Number of times the name is displayed
// Param2=Number of times the dates are displayed
function GetProdName(stage,n,d){
    DefineShowDetails();
    if (stage=="R"){ 
        var os=rehearsals;
        }
    else if (stage=="A"){
        var os=auditions;
        }
    else if (stage=="J"){
        var os=juniors;
        }
    var os=GetRealOffset(os);
    var current_production = shows[os+1];

    var show_dates = shows[os+2];
    switch(n){
        case 0:
        break;
        case 1:
        document.getElementById("production").innerHTML = current_production;
        break;
        case 2:
        document.getElementById("production").innerHTML = current_production;
        document.getElementById("production1").innerHTML = current_production;
        break;
        }
    switch(d){
        case 0:
        break;
        case 1:
        document.getElementById("dates").innerHTML = show_dates;
        break;
        }
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Get the Venue Details and display where needed
// Param0=Seniors or Juniors
function GetVenueDetails(cast) {
    DefineShowDetails();
    if (cast=="Seniors"){var os=rehearsals;}
    else if (cast=="Juniors"){var os=juniors;}
    var os=GetRealOffset(os);
    var venue = shows[os+3];
    var venue_url = shows [os+4];
    var venuetext = "<a href='"+venue_url+"' target='_new'>"+venue+"</a>";
    document.getElementById("venue").innerHTML = venuetext;
    }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Executes the script or runs the page defined by 'destination'
// Param0=DestinationURL
function Execute(destination) {
    location.href=destination;
    }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Validate Private Documents Form (privatedocs.pl)
function PrivateDocsFormVal(){
    var ErrorMsg = "";
    var Name = document.PrivateDocsForm.Name.value;
    var PW = document.PrivateDocsForm.PW.value;

    // Check that mandatory fields are completed
    ErrorMsg=ValidateField(Name,"Name","Mandatory","Bad","|¦<>\\/",ErrorMsg);
    ErrorMsg=ValidateField(PW,"Password","Mandatory","Bad","|¦<>\\/",ErrorMsg);

    // Check Cookies
    ErrorMsg=CookieTest1(ErrorMsg);

    // Display Error messages and return
    ErrorMsg=ErrorMsg.replace(/<br>/gi,"\n");
    if (ErrorMsg != "") {
        alert(ErrorMsg);
        document.PrivateDocsForm.Valid.value = "0";
        return false;
        }
    else {
        document.PrivateDocsForm.Valid.value = "2";
        return true;
        }
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 				Called Functions
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Validate Specified field
// Param0=field, Param1=Field Name, Param2=Madatory or Optional
// Param3=chars to check, Param4=Errorstring (error gets appended)
function ValidateField(field,fieldtext,ftype,checks,chars,errorstr){
    var valerr="";
    //alert("Checking: Field="+field+" Field Text="+fieldtext+" Type of Test="+ftype+" Chars="+chars+" ErrorStr="+errorstr);
    if (ftype == "Mandatory"){
        if(field == ""){  // Field is mandaory
            var valerr=fieldtext+" Missing<br>";
            }
        else {
            if (checks=="Good"){
                var valerr=GoodCharChk(field,chars,fieldtext,errorstr);
                }
            else {
                var valerr=BadCharChk(field,chars,fieldtext,errorstr);
                }
            }
        }
    else {      // Field is Optional
        if(field != ""){
            if (checks=="Good"){
                var valerr=GoodCharChk(field,chars,fieldtext,errorstr);
                }
            else {
                var valerr=BadCharChk(field,chars,fieldtext,errorstr);
                }
            }
        }
    return errorstr+valerr;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Looks for wanted characters in a string. Returns Error
// Param0=String to check
// Param1=Valid characters that must only exist in String
// Param2=Field Name
function GoodCharChk(strtocheck,GoodChars,fieldname){
    var ErrorString="";
    var strlen=strtocheck.length;
    var goodlen=GoodChars.length;
    var i,s,x,g,m;
    for (i=0;i<strlen;i++) {
        s=strtocheck.charAt(i);
        m=false;
        for (x=0;x<goodlen;x++){
            g=GoodChars.charAt(x);
            if (s == g){
                // Char in string does matches one in GoodChars, breakout
                 m=true;
                 break;
                }
            }
        if (m==false){
            ErrorString="Invalid character found in "+fieldname+". Characters can only be "+GoodChars+"<br>";
            return ErrorString
            }
        }
    return ErrorString;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Looks for unwanted characters in a string. Returns Error
// Param0=String to check
// Param1=Invalid characters that must not exist in String
// Param2=Field Name
function BadCharChk(strtocheck,BadChars,field){
    var ErrorString="";
    var strlen=strtocheck.length;
    var badlen=BadChars.length;
    var i,s,x,b;
    for (i=0;i<strlen;i++) {
        s=strtocheck.charAt(i);
        for (x=0;x<badlen;x++){
            b=BadChars.charAt(x);
            if (s == b){
                // Char in string matches one in BadChars
                ErrorString="Invalid character found in "+field+" ("+BadChars+")<br>";
                return ErrorString;
                }
            }
        }
    return ErrorString;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Email validation function. Plagiarized from http://www.smartwebby.com/dhtml/
// Param0=Email Address to check. Param1=Errorstring (error gets appended)
function EmailCheck(str,errorstr) {
	var at="@";
	var dot=".";
	var lat=str.indexOf(at);
	var lstr=str.length;
	var ldot=str.indexOf(dot);
	if (str.indexOf(at)==-1){
	    var errormsg = "Invalid EMail address<br>";
            errorstr=errorstr+errormsg;
            return errorstr;
	   }
	if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
	    var errormsg = "Invalid EMail address<br>";
            errorstr=errorstr+errormsg;
	    return errorstr;
	   }
	if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
	    var errormsg = "Invalid EMail address<br>";
            errorstr=errorstr+errormsg;
	    return errorstr;
	   }
	if (str.indexOf(at,(lat+1))!=-1){
	    var errormsg = "Invalid EMail address<br>";
            errorstr=errorstr+errormsg;
	    return errorstr;
	   }
	if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
	    var errormsg = "Invalid EMail address<br>";
            errorstr=errorstr+errormsg;
	    return errorstr;
	   }
	if (str.indexOf(dot,(lat+2))==-1){
	    var errormsg = "Invalid EMail address<br>";
            errorstr=errorstr+errormsg;
	    return errorstr;
	   }
	if (str.indexOf(" ")!=-1){
	    errormsg = "Invalid EMail address<br>";
            errorstr=errorstr+errormsg;
	    return errorstr;
	   }
    return errorstr;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Get Date and time ()Plagiarized from http://www.quirksmode.org/js/date.html)
function GetDateTime(){
    var today=new Date();
    var year=takeYear(today);
    var year=leadingZero(year);
    var month=today.getMonth()+1;
    var shrtmnth=FindMonth(month);
    var day=today.getDate();
    var hours=leadingZero(today.getHours());
    var mins=leadingZero(today.getMinutes());
    var time4html=day+'-'+shrtmnth+'-'+year+' '+hours+':'+mins;
    return time4html;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Finds out the correct year - Used with GetDateTime()
function takeYear(theDate){
	var x = theDate.getFullYear();
	var y = x % 100;
	y += (y < 38) ? 2000 : 1900;
    y = y-2000;     // Shorten the year to 2 characters, OK for a thousand years
	return y;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Return MMM (month) from the number supplied. Used with GetDateTime()
function FindMonth(m){
    var Months=new Array("---","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
    return Months[m];
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Adds leading zeros to numbers less than 10 - Used with GetDateTime()
function leadingZero(nr){
	if (nr < 10) nr = "0" + nr;
	return nr;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Cookie Handling Code = createCookie / readCookie / eraseCookie
// This is the generic JS to set, read and erase cookies
// http://www.quirksmode.org/js/cookies.html
function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
		}
	else {
        var expires = "";
        }
	document.cookie = name+"="+value+expires+"; path=/";
	}
function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
	return null;
	}
function eraseCookie(name) {
	createCookie(name,"",-1);
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Generic Get Selected Listbox Item
// Param0=FormName, Param1=ListboxName
function GetSelectedListboxItem(FormName,ListBox) {
    var len = eval("document."+FormName+"."+ListBox+".length");
    var i = 0;
    var chosen = 0;
    for (i = 0; i < len; i++) {
        if (eval("document."+FormName+"."+ListBox+"[i].selected")) {
            chosen = eval("document."+FormName+"."+ListBox+"[i].value");
            }
        }
    return chosen;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Funtion to check for spaces in a string (addguest.pl)
function SpaceCheck(strng, errmsg){
    var num_spaces=0;
    var len=strng.length;
    for (var s = 0; s < len; s++) {
        var eachchar=strng.charAt(s);
        var ret=eachchar.indexOf(" ");
        if (ret != -1){
            num_spaces = num_spaces+1;
            }
        }
    var divlen = len/25;            // For every 25 chars there should be 1 space
    if (num_spaces < divlen){
        errmsg = errmsg + "Not enough spaces in your Message \n";
        }
    return errmsg;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Dynamic Version by: Nannette Thacker http://www.shiningstar.net
// Original by :  Ronnie T. Moore Web Site:  The JavaScript Source
// Slightly modified by the author of this website :-)
function textcounter() {
    var field = document.AddGuestForm.Comment;
    var maxlimit = 500;
    if (field.value.length > maxlimit){                     // if too long...trim it!
        field.value = field.value.substring(0, maxlimit);
        }
    else {                                                  // otherwise, update 'characters left' counter
        document.getElementById("counter").innerHTML = maxlimit-field.value.length;
        }
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Get the Real Offset value. setupshows.js holds the show number, 1,2 or 3
// This needs to be converted into the start point of the "shows" array 
function GetRealOffset(os) {
    if (os == 1){ os=1; }
    else if (os == 2){ os=51;}
    else if (os == 3){ os=101;}
    return os;
    }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Cookie test, tests if cookies are enabled (privatedocs.pl)
function CookieTest1(ErrorString){
    createCookie("FAOSCookieTest","CookieTest",1); // Create cookie
    var cv=readCookie("FAOSCookieTest");           // Read cookie
    if (cv == "CookieTest"){
        eraseCookie("FAOSCookieTest");             // Erase cookie
        return ErrorString;
        }
    else{
        ErrorString=ErrorString+"Cookies must be enabled<br>";
        return ErrorString;
        }
    }
