﻿/// <reference path="http://www.infobasis.com/sandpit/jQuery-Intellisense/jQuery.intellisense.js" />

var obj = null;
var golfcourses = false;
function checkHover() {
    if (obj) {
        obj.find('ul').hide();
        obj.find('.iframe').hide();
    } //if
} //checkHover

Date.format = 'dd mmm yyyy';

var truncatecount = 850;
var dofTstart;
var dofTend;
var disableDays;
var partyMembersArray = [];
var roomUpgradeCost = 0;
var singleRoomCost = 0;
var noOfNights;
var iNumberRounds;


function roomTypeFocus() {
    $(this).attr("oldval", $(this).val());
    //alert($(this).val());
}

function roomNameChange() {
    var thisId = $(this).val();
    var thisName = $(this).attr("name");
    $("#EnquiryForm select[class*='RoomName']").each(function() {
        if ($(this).val() == thisId && $(this).attr("name") !== thisName) {
            $(this)[0].selectedIndex = 0;
            return false;
        }
    });
}

function cardTypeChange() {
    if ($(this).val() == 'Switch/Maestro') {
        $("#issueNumberRow").show();
    } else {
        $("#issueNumberRow").hide();
    }
}

function billingAddressChange() {

    var thisSelected = $("#EnquiryForm input[name='BillingAddressOption']:checked").val();
    if (thisSelected == 'Alternative') {
        $("#altBillingAddress").show();
    } else if (thisSelected == 'Same') {
        $("#altBillingAddress").hide();
    }

}

function recipientAddressChange() {

    var thisSelected = $("#EnquiryForm input[name='RecipientAddressOption']:checked").val();
    if (thisSelected == 'Alternative') {
        $("#altRecipientAddress").show();
    } else if (thisSelected == 'Same') {
        $("#altRecipientAddress").hide();
    }

}


function paymentAmountChange() {

    var thisSelected = $("#EnquiryForm input[name='PaymentOption']:checked").val();
    if (thisSelected == 'Deposit') {
        $("#EnquiryForm div.deposit").show();
        $("#MinimumDeposit").attr("checked", "checked");
    } else if (thisSelected == 'Full') {
        $("#EnquiryForm div.deposit").hide();
        $("#MinimumDeposit").removeAttr("checked");
    }

}


function priceChange() {

    var roomUpgradesCount = 0;
    var singleRoomsCount = 0;

    var roomUpgradeSubTotal = 0;
    var singleRoomSubTotal = 0;

    roomUpgradesCount = $("#EnquiryForm input[name*='Upgrade']:checked").length;

    $(".RoomType").each(function() {
        if ($(this).val() == 'Single') {
            singleRoomsCount++;
        }
    });

    if (roomUpgradeCost > 0) {

        var roomUpgradeHtml = '<td>' + roomUpgradesCount + ' Room Upgrade'
        if (roomUpgradesCount > 1) {
            roomUpgradeHtml += 's';
        }
        roomUpgradeHtml += ' @ £' + roomUpgradeCost.toFixed(2) + ' for ' + noOfNights + ' Night';
        if (noOfNights > 1) {
            roomUpgradeHtml += 's';
        }

        roomUpgradeSubTotal = roomUpgradeCost * noOfNights * roomUpgradesCount;

        roomUpgradeHtml += '</td><td><strong>£' + roomUpgradeSubTotal.toFixed(2) + '</strong></td>';
        $("#roomUpgradeTotal").html(roomUpgradeHtml);

    }

    if (singleRoomCost > 0) {

        var singleRoomHtml = '<td>' + singleRoomsCount + ' Single Room'
        if (singleRoomsCount > 1) {
            singleRoomHtml += 's';
        }
        singleRoomHtml += ' @ £' + singleRoomCost.toFixed(2) + ' for ' + noOfNights + ' Night';
        if (noOfNights > 1) {
            singleRoomHtml += 's';
        }
        //alert(singleRoomCost + ' * ' + noOfNights + ' * ' + singleRoomsCount);
        //alert(singleRoomCost * noOfNights * singleRoomsCount);
        singleRoomSubTotal = singleRoomCost * noOfNights * singleRoomsCount;

        singleRoomHtml += '</td><td><strong>£' + singleRoomSubTotal.toFixed(2) + '</strong></td>';
        $("#singleRoomTotal").html(singleRoomHtml);

    }

    updateTotal(singleRoomSubTotal + roomUpgradeSubTotal);
}

function updateTotal(thisTotal) {

    $("#EnquiryForm .total").each(function() {
        thisTotal += Number($(this).text().replace('£', ''));
    });

    $(".totalPrice").html("£" + thisTotal.toFixed(2));
}

function roomTypeChange() {

    var singleRoomsCount = 0;

    $(".RoomType").each(function() {
        if ($(this).val() == 'Single') {
            singleRoomsCount++;
        }
    });

    //alert($(this).attr("oldval"));
    if ($(this).val() == 'Single') {
        if ($(this).attr("oldval") == 'Single') {
            return false;
        }
    } else {
        if (!(partyMembersArray.length % 2 == 0) && singleRoomsCount == 0) {
            $(this).find("option[value='Single']").attr("selected", "selected");
            return false;
        }
        if ($(this).attr("oldval") == 'Double' || $(this).attr("oldval") == 'Twin') {
            return false;
        }
    }

    var lastRoomId = $("#EnquiryForm .RoomRow:last .RoomType").attr("name").replace("_Type", "").replace("Room", "");

    if ($(this).val() == 'Single') {
        //changed to Single
        $(this).parents(".RoomRow").find(".RoomName2").remove();
        $("#EnquiryForm .RoomRow:last").after(createRoomRow(Number(lastRoomId) + 1, 'Single'));
    } else {
        //changed to Double/Twin
        var arr = jQuery.makeArray($(".RoomType"));
        arr.reverse();
        $(arr).each(function() {
            if ($(this).val() == 'Single') {
                $(this).parents(".RoomRow").remove();
                return false;
            }
        });
        $(this).parents(".RoomRow").replaceWith(createRoomRow($(this).attr("name").replace("_Type", "").replace("Room", ""), $(this).val()));

        //fix room numbers
        var RoomId = 1;
        $(".RoomRow").each(function() {
            var thiscurrentRoomId = $(this).find(".RoomType").attr("name").replace("_Type", "").replace("Room", "");
            $(this).find("strong:contains('Room')").each(function() {
                $(this).text($(this).text().replace(thiscurrentRoomId, RoomId));
            });
            $(this).find("*[name]").each(function() {
                $(this).attr("name", $(this).attr("name").replace("Room" + thiscurrentRoomId, "Room" + RoomId));
            });
            RoomId++;
        });

    }

    priceChange();
    $(this).blur();
    $("#EnquiryForm .RoomType").bind("focus", roomTypeFocus);
    $("#EnquiryForm .RoomType").bind("change", roomTypeChange);
    $("#EnquiryForm input[name*='Upgrade']").bind("click", priceChange);
    $("#EnquiryForm select[class*='RoomName']").bind("change", roomNameChange);
}

function createRoomRow(RoomId, RoomType) {

    var rtnHTML;

    rtnHTML = '<tr class="RoomRow">';
    rtnHTML += '  <td><strong>Room ' + RoomId + '</strong></td>';
    rtnHTML += '  <td><select name="Room' + RoomId + '_Type" class="RoomType">';
    if (RoomType == 'Twin') {
        rtnHTML += '	  <option selected="selected">Twin</option>';
    } else {
        rtnHTML += '	  <option>Twin</option>';
    }
    if (RoomType == 'Double') {
        rtnHTML += '	  <option selected="selected">Double</option>';
    } else {
        rtnHTML += '	  <option>Double</option>';
    }
    if (singleRoomCost > 0) {
        if (RoomType == 'Single') {
            rtnHTML += '	  <option selected="selected">Single</option>';
        } else {
            rtnHTML += '	  <option>Single</option>';
        }
    }
    rtnHTML += '	</select></td>';
    rtnHTML += '  <td class="noborder"><select name="Room' + RoomId + '_Name1" class="RoomName1 required">';
    rtnHTML += '	  <option value="">-- Select --</option>';
    for (var i = 0; i < partyMembersArray.length; i++) {
        rtnHTML += '  <option value="' + partyMembersArray[i][0] + '">' + partyMembersArray[i][1] + '</option>';
    }
    rtnHTML += '	</select></td>';
    if (RoomType == 'Single') {
        rtnHTML += '  <td></td>';
    } else {
        rtnHTML += '  <td><select name="Room' + RoomId + '_Name2" class="RoomName2 required">';
        rtnHTML += '	  <option value="">-- Select --</option>';
        for (var i = 0; i < partyMembersArray.length; i++) {
            rtnHTML += '  <option value="' + partyMembersArray[i][0] + '">' + partyMembersArray[i][1] + '</option>';
        }
        rtnHTML += '	</select></td>';
    }
    if (roomUpgradeCost > 0) {
        rtnHTML += '  <td class="noborder"><input type="checkbox" name="Room' + RoomId + '_Upgrade" value="' + roomUpgradeCost.toFixed(2) + '" /></td>';
        rtnHTML += '  <td> (£' + roomUpgradeCost.toFixed(2) + ') </td>';
    }
    rtnHTML += '</tr>';

    return (rtnHTML);

}
function changeTab() {
    $('#venue_tabbedcontent > ul li a').removeClass("current");
    $(this).addClass("current");
    $('#venue_tabbedcontent > div').hide();
    $('#venue_tabbedcontent').find($(this).attr('href')).show();
    if ($(this).attr('href') == '#Location') {
        $('#map').jmap('CheckResize', { pointLatLng: [lat, lng] });
    }
    return false;
}

$(function() {


    //$("#venue_tabbedcontent").addClass("javaenabled");

    $('#TeeTimes').hide();
    $('#TeeTimes').before("<div id='TeeTimeMsg'>Please select your date of travel.</div>");
    $('#venue_tabbedcontent > ul li a').bind("click", changeTab);
    $("#venue_tabbedcontent > ul li a:first").trigger("click");

    var selectList = "<option>No Golf</option><option>0700 - 0900</option><option>0900 - 1100</option><option>1100 - 1300</option><option>1300 - 1500</option><option>1500 - 1700</option>";
    var i = 0;

    function teetimeFormChange() {
        if ($('#dateOfTravelOF').val() !== '' && $('#numberOfNights').val() !== '' && $('#numberOfRounds').val() !== '') {
            thisTeeSelect = "<table class='basictbl' cellpadding='0'>";
            var thisCourses;
            var thisCoursesList;
            if (golfcourses) {
                $("#GolfCoursesList li").each(function() {
                    thisCoursesList += "<option>" + $(this).html() + "</option>";
                });
            }
            for (i = 0; i <= Number($('#numberOfNights').val()); i++) {
                var thisLoopDate = Date.fromString($('#dateOfTravelOF').val());
                thisLoopDate.setDate(thisLoopDate.getDate() + i);
                thisTeeSelect += "<tr><td>" + thisLoopDate.formatDate('D dS M Y') + "</td><td class='noborder' style='width:60%'>";
                if (golfcourses) {
                    thisTeeSelect += "<select name='teetimecourse_" + thisLoopDate.formatDate('d_M_Y') + "' style='width:100%'>" + thisCoursesList + "</select><br />";
                }
                thisTeeSelect += "<select name='teetime_" + thisLoopDate.formatDate('d_M_Y') + "' style='width:100%'>" + selectList + "</select></td></tr>";
            }
            thisTeeSelect += "</table>";
            $('#TeeTimeMsg').html("<div id='selectboxes'><strong>Select your Tee Times</strong><br /></div>");
            $('#selectboxes').after(thisTeeSelect);
        }
    }

    $("#EnquiryForm #dateOfTravelOF").bind("change", teetimeFormChange);
    $("#EnquiryForm #numberOfNights").bind("change", teetimeFormChange);
    $("#EnquiryForm #numberOfRounds").bind("change", teetimeFormChange);

    $("#EnquiryForm .RoomType").bind("focus", roomTypeFocus);
    $("#EnquiryForm .RoomType").bind("change", roomTypeChange);
    $("#EnquiryForm input[name*='Upgrade']").bind("click", priceChange);
    $("#EnquiryForm select[class*='RoomName']").bind("change", roomNameChange);

    $("#EnquiryForm input[name='PaymentOption']").bind("click", paymentAmountChange);
    $("#EnquiryForm input[name='BillingAddressOption']").bind("click", billingAddressChange);
    $("#EnquiryForm input[name='RecipientAddressOption']").bind("click", recipientAddressChange);

    $("#cardType").bind("change", cardTypeChange);

    // Venue pages - more less links
    $('#venueCol1').truncate(truncatecount, {
        chars: /\s/,
        trail: [" ( <a href='#more' class='truncate_show'>more</a> )", " ( <a href='#less' class='truncate_hide'>less</a> )"]
    });

    $("input.remove_title").attr("title", "");

    // region list accordian
    $('#regionlist .title').each(function() {
        $(this).find('a.l').bind(
      "click",
        function() {
            $(".title>ul").each(function() {
                $(this).hide();
                $(this).parent().removeClass("current");
            });
            $(this).parent().addClass("current").children('ul').show();
            $(".subtitle>ul").each(function() {
                $(this).hide();
                $(this).parent().removeClass("current");
            });
            $(this).parent().find('.subtitle>ul:first').show().parent().addClass("current");
            return false;
        }
      );
    });

    $('#regionlist .subtitle').each(function() {
        $(this).find('a.lt').bind(
      "click",
        function() {
            $(".subtitle>ul").each(function() {
                $(this).hide();
                $(this).parent().removeClass("current");
            });
            $(this).parent().addClass("current").children('ul').show();
            return false;
        }
      );
    });

    var markDisabledDays = function($td, thisDate, month, year) {
        if (availableDays.length > 0) {
            if (availableDays.indexOf(thisDate.getDayName()) == -1) {
                $td.addClass('disabled');
            }
        }
        //alert(thisDate);
    }

    // forms date picker
    $('#dateOfTravelOF').datePicker();

    $('#dateOfTravel').datePicker({ renderCallback: markDisabledDays });

    if (dofTstart > 0) {
        $('#dateOfTravel').dpSetStartDate(dofTstart.asString());
    }
    if (dofTend > 0) {
        $('#dateOfTravel').dpSetEndDate(dofTend.asString());
    }


    $('#FromDate2').datePicker();

    $('input.date').datePicker();
    $('#FromDate').bind(
		  'dpClosed',
		  function(e, selectedDates) {
		      var d = selectedDates[0];
		      if (d) {
		          d = new Date(d);
		          $('#ToDate').dpSetStartDate(d.addDays(1).asString());
		      }
		  }
	  );
    $('#ToDate').bind(
		  'dpClosed',
		  function(e, selectedDates) {
		      var d = selectedDates[0];
		      if (d) {
		          d = new Date(d);
		          $('#FromDate').dpSetEndDate(d.addDays(-1).asString());
		      }
		  }
	  );

    // rotate testimonials
    $('#sidebar_testimonials').cycle({ timeout: 3000 });

    // tour home - country pictures rotate
    $('.tourbuttons div').cycle({ timeout: 2000 }).cycle('pause').hover(
      function() {
          $(this).cycle('resume');
      },
      function() {
          $(this).cycle('pause');
      }
    );
    $('.tourbuttons').each(function() {
        var href = $(this).attr("href");
        $(this).find('div').bind(
      "click",
        function() {
            window.location = href;
        }
      );
    });

    // rotate images on venue pages, etc
    $('#venue_media').cycle({
        fx: 'fade',
        speed: 'fast',
        timeout: 3000,
        next: '#next2',
        prev: '#prev2',
        pause: 1
    });

    // auto rotate region pictures
    $('#region_media').cycle({ timeout: 3000 });

    // tabs
    $('#tabbedcontent').tabs({ fxAutoHeight: true });
    $('#smalltabbedcontent').tabs({ fxAutoHeight: true });



    // header location, venue name tabs
    $(".headersearchtab").each(function() {
        $(this).bind(
      "click",
        function() {
            $(".headersearchtab").each(function() {
                var src = $(this).attr("style");
                $(this).attr("style", src.replace('-64px 0px', '0px 0px').replace('-219px 0px', '-128px 0px').replace('-376px 0px', '-311px 0px'));
            });
            var src = $(this).attr("style");
            $(this).attr("style", src.replace('0px 0px', '-64px 0px').replace('-128px 0px', '-219px 0px').replace('-311px 0px', '-376px 0px'));
        }
      );
    });

    $(".headersearch .text").each(function() {
        $(this).bind(
      "click",
        function() {
            $(this).attr("value", "").css({ color: "black" }).unbind("click");
        }
      );
    });

    $("#hLocation").submit(function() {
        var str = $("#hLocation > input.text").val();
        if (str == "Enter Location...") {
            alert("Please enter a Location");
            return false;
        } else if (str.length < 3) {
            alert("Location entered is too short");
            return false;
        } else {
            return true;
        }
    });

    $("#hHotelName").submit(function() {
        var str = $("#hHotelName > input.text").val();
        if (str == "Enter Venue Name...") {
            alert("Please enter a Venue Name");
            return false;
        } else if (str.length < 3) {
            alert("Venue Name entered is too short");
            return false;
        } else {
            return true;
        }
    });

    $("#hPostcode").submit(function() {
        var str = $("#hPostcode > input.text").val();
        if (str == "Enter Postcode...") {
            alert("Please enter a Postcode");
            return false;
        } else if (str.length < 2) {
            alert("Postcode entered is too short");
            return false;
        } else {
            return true;
        }
    });

    // newsletter signup
    $("#nSignup").submit(function() {
        var str = $("#nSignup input.text").val();
        if (str == "Sign up for our Newsletter") {
            alert("Please enter an Email Address");
            return false;
        } else if (str.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) == -1) {
            alert("Email Address is invalid");
            return false;
        } else {
            return true;
        }
    });

    $(".newsletter .text").each(function() {
        $(this).bind(
      "click",
        function() {
            $(this).attr("value", "").css({ color: "black" }).unbind("click");
        }
      );
    });

    // top nav dropdowns with iframes for ie to hide select boxes
    $('#topnav ul li').hover(function() {
        if (obj) {
            obj.find('ul').hide();
            obj.find('.iframe').hide();
            obj = null;
        } //if
        $(this).find('ul').show();
        $(this).find('.iframe').show();
    }, function() {
        obj = $(this);
        setTimeout(
      "checkHover()",
      400);
    });

});

function switchTabbedContent(tabNo) {
    $("#tabbedcontent").triggerTab(tabNo);
    scrollTo(0, 0);
}

function showTab(tabId) {
    $(".headersearch").hide();
    $("#" + tabId).show();
}

function setAsHome(myLink) {
    if (navigator.appName.indexOf('Microsoft') != -1) {
        // IE
        myLink.style.behavior = 'url(#default#homepage)';
        myLink.setHomePage(location.href);
    }
    else if (navigator.appName.indexOf('Netscape') != -1) {
        // Netscape / firefox browsers
        var msg = "Just drag this link onto your 'home' ";
        msg += "button to set this page as your ";
        msg += "default homepage!";
        alert(msg);
    }
    else if (navigator.appName.indexOf('Opera') != -1) {
        // Opera
        var msg = "Please go to Tools - Preferences ";
        msg += "- General and click 'Use current' ";
        msg += "to set this as your homepage! ";
        alert(msg);
    }
    else {
        // Other browsers
        var msg = "Sorry, your browser doesn't allow ";
        msg += "scripts to set the default homepage. ";
        msg += "Please use your browser's 'options' dialog ";
        msg += "to do it! Thank you for your patience. ";
        alert(msg);
    }
}
function bookmarkMe(myUrl, myTitle) {
    if (window.opera && window.print) {
        //******************************//
        // Opera is used
        //******************************//

        var bkmark = document.createElement('a');
        bkmark.setAttribute('rel', 'sidebar');
        bkmark.setAttribute('href', myUrl);
        bkmark.setAttribute('title', myTitle);
        bkmark.click();
    }
    else if (document.all) {
        //******************************//
        // Most probably IE, but even if it's not,
        // we don't want an error to pop up
        // so we use the try-catch structure
        //******************************//

        try {
            window.external.AddFavorite(myUrl, myTitle);
        }
        catch (e) {
            //******************************//
            // oops! not IE. Prompt user for action.
            //******************************//

            var msg = "Sorry, your browser doesn't allow scripts ";
            msg += "to add bookmarks.\n";
            msg += "Please use your browser's keyboard shortcut ";
            msg += "(most commonly CTRL+D) to add a bookmark.";
            alert(msg);
        }
    } else {

        var msg = "Sorry, your browser doesn't allow scripts ";
        msg += "to add bookmarks.\n";
        msg += "Please use your browser's keyboard shortcut ";
        msg += "(most commonly CTRL+D) to add a bookmark.";
        alert(msg);

    }
}

// linked select for dropdowns
(function($) {
    $.fn.linkedSelect = function(url, destination, params) {
        var params = $.extend({
            firstOption: 'Please Select',
            loadingText: 'Loading...'
        }, params);
        var $dest = $(destination);
        return this.each(function() {
            $(this).bind('change', function() {
                var $$ = $(this);
                $dest.attr('disabled', 'false')
                 .append('<option value="">' + params.loadingText + '</option>')
                 .ajaxStart(function() {
                     $$.show();
                 });
                $.getJSON(url, { str: $$.val() }, function(j) {
                    if (j.length > 0) {
                        var options = '<option value="">' + params.firstOption + '</option>';
                        for (var i = 0; i < j.length; i++) {
                            options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
                        }
                    }
                    $dest.removeAttr('disabled')
                    .html(options)
                    .find('option:first')
                    .attr('selected', 'selected');
                }); // end getJSON
            });  // end change
        }); // end return each
    };  // end function
})(jQuery);

jQuery.fn.truncate = function(max, settings) {
    settings = jQuery.extend({
        chars: /\s/,
        trail: ["...", ""]
    }, settings);
    var myResults = {};
    var ie = $.browser.msie;
    function fixIE(o) {
        if (ie) {
            o.style.removeAttribute("filter");
        }
    }
    return this.each(function() {
        var $this = jQuery(this);
        var myStrOrig = $this.html().replace(/\r\n/gim, "");
        var myStr = myStrOrig;
        var myRegEx = /<\/?[^<>]*\/?>/gim;
        var myRegExArray;
        var endTag;
        var myRegExHash = {};
        var myResultsKey = $("*").index(this);
        while ((myRegExArray = myRegEx.exec(myStr)) != null) {
            myRegExHash[myRegExArray.index] = myRegExArray[0];
        }
        myStr = jQuery.trim(myStr.split(myRegEx).join(""));
        if (myStr.length > max) {
            var c;
            while (max < myStr.length) {
                c = myStr.charAt(max);
                if (c.match(settings.chars)) {
                    myStr = myStr.substring(0, max);
                    break;
                }
                max--;
            }
            if (myStrOrig.search(myRegEx) != -1) {
                var endCap = 0;
                for (eachEl in myRegExHash) {
                    myStr = [myStr.substring(0, eachEl), myRegExHash[eachEl], myStr.substring(eachEl, myStr.length)].join("");
                    if (eachEl < myStr.length) {
                        endCap = myStr.length;
                    }
                }
                $this.html([myStr.substring(0, endCap), " . . .", myStr.substring(endCap, myStr.length).replace(/<(\w+)[^>]*>.*<\/\1>/gim, "").replace(/<(br|hr|img|input)[^<>]*\/?>/gim, "")].join(""));
            } else {
                $this.html(myStr);
            }
            myResults[myResultsKey] = myStrOrig;

            if ((myStrOrig.length - endCap) < 200) {

                $this.html(myStrOrig);

            } else {

                $this.html(["<div class='truncatecontent_less'>", $this.html(), settings.trail[0], "</div>", "<div class='truncatecontent_more' style='display: none;'>", myResults[myResultsKey], settings.trail[1], "</div>"].join(""))
                $(".truncate_show", $this).click(function() {
                    $this.find(".truncatecontent_less").hide();
                    $this.find(".truncatecontent_more").show();
                    return false;
                });
                $(".truncate_hide", $this).click(function() {
                    $this.find(".truncatecontent_more").hide();
                    $this.find(".truncatecontent_less").show();
                    return false;
                });

            }
        }
    });
};

// formatDate :
// a PHP date like function, for formatting date strings
// authored by Svend Tofte <www.svendtofte.com>
// the code is in the public domain
//
// see http://www.svendtofte.com/code/date_format/
// and http://www.php.net/date
//
// thanks to 
//  - Daniel Berlin <mail@daniel-berlin.de>,
//    major overhaul and improvements
//  - Matt Bannon,
//    correcting some stupid bugs in my days-in-the-months list!
//
// input : format string
// time : epoch time (seconds, and optional)
//
// if time is not passed, formatting is based on 
// the current "this" date object's set time.
//
// supported switches are
// a, A, B, c, d, D, F, g, G, h, H, i, I (uppercase i), j, l (lowecase L), 
// L, m, M, n, N, O, P, r, s, S, t, U, w, W, y, Y, z, Z
// 
// unsupported (as compared to date in PHP 5.1.3)
// T, e, o

Date.prototype.formatDate = function(input, time) {

    var daysLong = ["Sunday", "Monday", "Tuesday", "Wednesday",
                       "Thursday", "Friday", "Saturday"];
    var daysShort = ["Sun", "Mon", "Tue", "Wed",
                       "Thu", "Fri", "Sat"];
    var monthsShort = ["Jan", "Feb", "Mar", "Apr",
                       "May", "Jun", "Jul", "Aug", "Sep",
                       "Oct", "Nov", "Dec"];
    var monthsLong = ["January", "February", "March", "April",
                       "May", "June", "July", "August", "September",
                       "October", "November", "December"];

    var switches = { // switches object

        a: function() {
            // Lowercase Ante meridiem and Post meridiem
            return date.getHours() > 11 ? "pm" : "am";
        },

        A: function() {
            // Uppercase Ante meridiem and Post meridiem
            return (this.a().toUpperCase());
        },

        B: function() {
            // Swatch internet time. code simply grabbed from ppk,
            // since I was feeling lazy:
            // http://www.xs4all.nl/~ppk/js/beat.html
            var off = (date.getTimezoneOffset() + 60) * 60;
            var theSeconds = (date.getHours() * 3600) +
                             (date.getMinutes() * 60) +
                              date.getSeconds() + off;
            var beat = Math.floor(theSeconds / 86.4);
            if (beat > 1000) beat -= 1000;
            if (beat < 0) beat += 1000;
            if ((String(beat)).length == 1) beat = "00" + beat;
            if ((String(beat)).length == 2) beat = "0" + beat;
            return beat;
        },

        c: function() {
            // ISO 8601 date (e.g.: "2004-02-12T15:19:21+00:00"), as per
            // http://www.cl.cam.ac.uk/~mgk25/iso-time.html
            return (this.Y() + "-" + this.m() + "-" + this.d() + "T" +
                    this.h() + ":" + this.i() + ":" + this.s() + this.P());
        },

        d: function() {
            // Day of the month, 2 digits with leading zeros
            var j = String(this.j());
            return (j.length == 1 ? "0" + j : j);
        },

        D: function() {
            // A textual representation of a day, three letters
            return daysShort[date.getDay()];
        },

        F: function() {
            // A full textual representation of a month
            return monthsLong[date.getMonth()];
        },

        g: function() {
            // 12-hour format of an hour without leading zeros
            return date.getHours() > 12 ? date.getHours() - 12 : date.getHours();
        },

        G: function() {
            // 24-hour format of an hour without leading zeros
            return date.getHours();
        },

        h: function() {
            // 12-hour format of an hour with leading zeros
            var g = String(this.g());
            return (g.length == 1 ? "0" + g : g);
        },

        H: function() {
            // 24-hour format of an hour with leading zeros
            var G = String(this.G());
            return (G.length == 1 ? "0" + G : G);
        },

        i: function() {
            // Minutes with leading zeros
            var min = String(date.getMinutes());
            return (min.length == 1 ? "0" + min : min);
        },

        I: function() {
            // Whether or not the date is in daylight saving time (DST)
            // note that this has no bearing in actual DST mechanics,
            // and is just a pure guess. buyer beware.
            var noDST = new Date("January 1 " + this.Y() + " 00:00:00");
            return (noDST.getTimezoneOffset() ==
                    date.getTimezoneOffset() ? 0 : 1);
        },

        j: function() {
            // Day of the month without leading zeros
            return date.getDate();
        },

        l: function() {
            // A full textual representation of the day of the week
            return daysLong[date.getDay()];
        },

        L: function() {
            // leap year or not. 1 if leap year, 0 if not.
            // the logic should match iso's 8601 standard.
            // http://www.uic.edu/depts/accc/software/isodates/leapyear.html
            var Y = this.Y();
            if (
                (Y % 4 == 0 && Y % 100 != 0) ||
                (Y % 4 == 0 && Y % 100 == 0 && Y % 400 == 0)
                ) {
                return 1;
            } else {
                return 0;
            }
        },

        m: function() {
            // Numeric representation of a month, with leading zeros
            var n = String(this.n());
            return (n.length == 1 ? "0" + n : n);
        },

        M: function() {
            // A short textual representation of a month, three letters
            return monthsShort[date.getMonth()];
        },

        n: function() {
            // Numeric representation of a month, without leading zeros
            return date.getMonth() + 1;
        },

        N: function() {
            // ISO-8601 numeric representation of the day of the week
            var w = this.w();
            return (w == 0 ? 7 : w);
        },

        O: function() {
            // Difference to Greenwich time (GMT) in hours
            var os = Math.abs(date.getTimezoneOffset());
            var h = String(Math.floor(os / 60));
            var m = String(os % 60);
            h.length == 1 ? h = "0" + h : 1;
            m.length == 1 ? m = "0" + m : 1;
            return date.getTimezoneOffset() < 0 ? "+" + h + m : "-" + h + m;
        },

        P: function() {
            // Difference to GMT, with colon between hours and minutes
            var O = this.O();
            return (O.substr(0, 3) + ":" + O.substr(3, 2));
        },

        r: function() {
            // RFC 822 formatted date
            var r; // result
            //  Thu         ,     21               Dec              2000
            r = this.D() + ", " + this.d() + " " + this.M() + " " + this.Y() +
            //    16          :    01          :    07               0200
            " " + this.H() + ":" + this.i() + ":" + this.s() + " " + this.O();
            return r;
        },

        s: function() {
            // Seconds, with leading zeros
            var sec = String(date.getSeconds());
            return (sec.length == 1 ? "0" + sec : sec);
        },

        S: function() {
            // English ordinal suffix for the day of the month, 2 characters
            switch (date.getDate()) {
                case 1: return ("st");
                case 2: return ("nd");
                case 3: return ("rd");
                case 21: return ("st");
                case 22: return ("nd");
                case 23: return ("rd");
                case 31: return ("st");
                default: return ("th");
            }
        },

        t: function() {
            // thanks to Matt Bannon for some much needed code-fixes here!
            var daysinmonths = [null, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
            if (this.L() == 1 && this.n() == 2) return 29; // ~leap day
            return daysinmonths[this.n()];
        },

        U: function() {
            // Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
            return Math.round(date.getTime() / 1000);
        },

        w: function() {
            // Numeric representation of the day of the week
            return date.getDay();
        },

        W: function() {
            // Weeknumber, as per ISO specification:
            // http://www.cl.cam.ac.uk/~mgk25/iso-time.html

            var DoW = this.N();
            var DoY = this.z();

            // If the day is 3 days before New Year's Eve and is Thursday or earlier,
            // it's week 1 of next year.
            var daysToNY = 364 + this.L() - DoY;
            if (daysToNY <= 2 && DoW <= (3 - daysToNY)) {
                return 1;
            }

            // If the day is within 3 days after New Year's Eve and is Friday or later,
            // it belongs to the old year.
            if (DoY <= 2 && DoW >= 5) {
                return new Date(this.Y() - 1, 11, 31).formatDate("W");
            }

            var nyDoW = new Date(this.Y(), 0, 1).getDay();
            nyDoW = nyDoW != 0 ? nyDoW - 1 : 6;

            if (nyDoW <= 3) { // First day of the year is a Thursday or earlier
                return (1 + Math.floor((DoY + nyDoW) / 7));
            } else {  // First day of the year is a Friday or later
                return (1 + Math.floor((DoY - (7 - nyDoW)) / 7));
            }
        },

        y: function() {
            // A two-digit representation of a year
            var y = String(this.Y());
            return y.substring(y.length - 2, y.length);
        },

        Y: function() {
            // A full numeric representation of a year, 4 digits

            // we first check, if getFullYear is supported. if it
            // is, we just use that. ppks code is nice, but wont
            // work with dates outside 1900-2038, or something like that
            if (date.getFullYear) {
                var newDate = new Date("January 1 2001 00:00:00 +0000");
                var x = newDate.getFullYear();
                if (x == 2001) {
                    // i trust the method now
                    return date.getFullYear();
                }
            }
            // else, do this:
            // codes thanks to ppk:
            // http://www.xs4all.nl/~ppk/js/introdate.html
            var x = date.getYear();
            var y = x % 100;
            y += (y < 38) ? 2000 : 1900;
            return y;
        },


        z: function() {
            // The day of the year, zero indexed! 0 through 366
            var t = new Date("January 1 " + this.Y() + " 00:00:00");
            var diff = date.getTime() - t.getTime();
            return Math.floor(diff / 1000 / 60 / 60 / 24);
        },

        Z: function() {
            // Timezone offset in seconds
            return (date.getTimezoneOffset() * -60);
        }

    }

    function getSwitch(str) {
        if (switches[str] != undefined) {
            return switches[str]();
        } else {
            return str;
        }
    }

    var date;
    if (time) {
        var date = new Date(time);
    } else {
        var date = this;
    }

    var formatString = input.split("");
    var i = 0;
    while (i < formatString.length) {
        if (formatString[i] == "\\") {
            // this is our way of allowing users to escape stuff
            formatString.splice(i, 1);
        } else {
            formatString[i] = getSwitch(formatString[i]);
        }
        i++;
    }

    return formatString.join("");
}


// Some (not all) predefined format strings from PHP 5.1.1, which 
// offer standard date representations.
// See: http://www.php.net/manual/en/ref.datetime.php#datetime.constants
//

// Atom      "2005-08-15T15:52:01+00:00"
Date.DATE_ATOM = "Y-m-d\\TH:i:sP";
// ISO-8601  "2005-08-15T15:52:01+0000"
Date.DATE_ISO8601 = "Y-m-d\\TH:i:sO";
// RFC 2822  "Mon, 15 Aug 2005 15:52:01 +0000"
Date.DATE_RFC2822 = "D, d M Y H:i:s O";
// W3C       "2005-08-15T15:52:01+00:00"
Date.DATE_W3C = "Y-m-d\\TH:i:sP";



$(function() {
    $("#siteseal").show();
});


function currentYPosition() {
    // Firefox, Chrome, Opera, Safari
    if (self.pageYOffset) return self.pageYOffset;
    // Internet Explorer 6 - standards mode
    if (document.documentElement && document.documentElement.scrollTop)
        return document.documentElement.scrollTop;
   // Internet Explorer 6, 7 and 8
    if (document.body.scrollTop) return document.body.scrollTop;
    return 0;
}

function smoothScroll(startY, stopY) {
var distance = stopY > startY ? stopY - startY : startY - stopY;
if (distance < 50) {
    scrollTo(0, stopY); return;
}
//var speed = Math.round(distance / 100);
var speed = 3;
var step = Math.round(distance / 25);
var leapY = stopY > startY ? startY + step : startY - step;
var timer = 0;
    for (var i = startY; i > stopY; i -= step) {
        setTimeout("window.scrollTo(0, " + leapY + ")", timer * speed);
        leapY -= step; if (leapY < stopY) leapY = stopY; timer++;
    }
}
