/*
 *   script.js
 *   Copyright by Gästehaus Familie Schäfer
 *   Created by Robin Dinse 2011.
 */

/*
 *   Map Settings
 */

var map_lat = 51.23181;
var map_lon = 6.76700;
var map_zoom = 12;


/*
 *   Slideshow Settings
 */

var slideshow_canvas;
var slideshow_imagesPath = "slideshow/";
var slideshow_interval = 5000;
var slideshow_timeOutID;
var slideshow_waitingForEffectTimeoutID;
var slideshow_waitingForImageLoadingTimoutID;
var slideshow_atImage = 0;
var slideshow_playing = false;
var slideshow_playingEffect = false;
var slideshow_images = [
    ["1a.jpg",   "bottom", new Image() ],
    ["1.jpg",    "bottom", new Image() ],
    ["1b.jpg",   "bottom", new Image() ],
    ["1c.jpg", 	 "bottom", new Image() ],
  //["lina.jpg", "bottom", new Image() ],
    ["2.jpg",    "bottom", new Image() ],
  //["3.jpg",    "bottom", new Image() ],
    ["4.jpg",    "top",    new Image() ],
    ["5.jpg",    "bottom", new Image() ],
    ["6.jpg",    "bottom", new Image() ]
];


/*
 *   onLoad
 */

$(function()
{
        // Calendar
        var element = document.getElementById("datechooser");
        element.onselectstart = function () { return false; } // IE
        element.onmousedown = function () { return false; }   // Mozilla, WebKit, Opera
        setTimeout("rcalendar_initCalendar()",  1000);
        setTimeout("rcalendar_refreshSheets()", 1000);
        
        // Slideshow
        slideshow_canvas = document.getElementById("slideshow_canvas");
        slideshow_timeOutID = setTimeout("slideshow_play()", slideshow_interval);
        
        // Map
		var map = new L.Map('map_canvas');
		
		var cloudmadeAPIKey = '251afbd6b6694c399a171ee3b2463958', cloudmadeMapStyle = '997',
		    cloudmadeUrl = 'http://{s}.tile.cloudmade.com/'+cloudmadeAPIKey+'/'+cloudmadeMapStyle+'/256/{z}/{x}/{y}.png',
		    cloudmadeAttrib = 'Data &copy; OpenStreetMap contributors, Imagery &copy; CloudMade',
		    cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttrib});
		
		var duesseldorf = new L.LatLng(map_lat, map_lon);
		map.setView(duesseldorf, map_zoom).addLayer(cloudmade);
		
		var markerLocation = new L.LatLng(51.237464, 6.779031);
		var marker = new L.Marker(markerLocation);
		map.addLayer(marker);
		console.log(marker);
});


/*
 *   Slideshow
 */

function slideshow_setimage(image) {
    
    if(slideshow_playingEffect)
    {
        // Wait until fading is done
        slideshow_waitingForEffectTimeoutID = setTimeout("slideshow_setimage("+image+")", 10);
        return;
    }
    
    if(image == undefined)
        image = slideshow_atImage;
    
    slideshow_atImage = image;
    
    // load image
    if( slideshow_images[image][2].src == "" )
        slideshow_images[image][2].src = slideshow_imagesPath + slideshow_images[image][0];
    
    if( slideshow_images[image][2].complete == true) {
        // if done loading show image with fade-over effect
        imageElement = slideshow_images[image][2];
        imageElement.style.width = "100%";
        
        switch(slideshow_images[image][1])
        {
            case "top":
                imageElement.style.position = "absolute";
                imageElement.style.top = 0;
                break;
            case "middle":
                imageElement.style.position = "absolute";
                imageElement.style.top = 0;
                break;
            case "bottom":
                imageElement.style.position = "absolute";
                imageElement.style.bottom = 0;
                break;
        }
        imageElement.style.opacity = 0;
        imageElement.style.zindex = 2;
        imageElement.id = "slideshow_image_b";
        imageElement.opac = 0;
        
        slideshow_canvas.appendChild(imageElement);
        
        slideshow_fadeImage();
        
    } else {
        slideshow_images[image][2].onload = function () { slideshow_setimage() };
    }
} 

function slideshow_play() {
    if(slideshow_playing) {
        slideshow_atImage++;
        if(slideshow_atImage > slideshow_images.length-1)
            slideshow_atImage = 0;
        slideshow_setimage();
        
        slideshow_timeOutID = setTimeout("slideshow_play()", 5000);
    }
}

function slideshow_fadeImage() {
    slideshow_playingEffect = true;
    var imageElement = document.getElementById("slideshow_image_b");
    
    if(imageElement.opac + 0.09 > 1)
    {
        imageElement.opac = 1;
    } else {
        imageElement.opac += 0.09;
    }
    
    imageElement.style.opacity = imageElement.opac;
    if(typeof imageElement.filters != 'undefined')
        imageElement.style.filter = "alpha(opacity=" + Math.round(imageElement.opac*100)+")";
    
    if(imageElement.opac < 1) {
        setTimeout("slideshow_fadeImage()", 40);
    } else {
        var imageElementA = document.getElementById("slideshow_image_a");
        imageElementA.parentElement.removeChild(imageElementA);
        imageElement.style.zindex = 0;
        imageElement.id = "slideshow_image_a";
        slideshow_playingEffect = false;
    }
}

function slideshow_toggle_play(type) {
    switch( type )
    {
    case undefined:
        
        // Prevent image from appearing in case it is loading
        slideshow_images[slideshow_atImage][2].onload = function () { };
        
        slideshow_atImage++;
        if(slideshow_atImage > slideshow_images.length-1)
            slideshow_atImage = 0;
        clearTimeout(slideshow_waitingForEffectTimeoutID);
        slideshow_setimage();
        
        // Hide text above Photos
        var hoverTextElement = document.getElementById("slideshow_hover_text");
        if(hoverTextElement.style.opacity != "0" && !hoverTextElement.animating )
        {
            hoverTextElement.animating = true;
            setTimeout( function() { reffect_hideElement("slideshow_hover_text"); }, 700);
        }
        /*
        
        Old Slideshow Function
        
        if(slideshow_playing)
        {
            console.log("stopping");
            slideshow_playing = false;
            clearTimeout(slideshow_timeOutID);
        } else {
            console.log("playing");
            slideshow_playing = true;
            clearTimeout(slideshow_waitingForEffectTimeoutID);
            slideshow_play();
        }
        
        */
        break;
    case "hover":
        /*
        if(slideshow_playing)
        {
            console.log("stopping hover");
            slideshow_playing = false;
            clearTimeout(slideshow_timeOutID);
        }
        */
    }
    
}

/*
 *   Calendar
 */

var rcalendar_month_names = [ "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" ];
var rcalendar_weekday_names = [ "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag" ];
var rcalendar_weekday_names_abb = [ "SO", "MO", "DI", "MI", "DO", "FR", "SA" ];

var rcalendar_startWeekWith = 1;
var rcalendar_hightlightWeekend = true;

var rcalendar_now = new Date();
var rcalendar_atMonth = new Date();

var rcalendar_date_A_description = "ANKUNFT";
var rcalendar_date_A = new Date();
rcalendar_date_A.setDate(rcalendar_now.getDate() + 0);
var rcalendar_date_B_description = "ABFAHRT";
var rcalendar_date_B = new Date();
rcalendar_date_B.setDate(rcalendar_now.getDate() + 1);
var rcalendar_activeDate;

var rcalendar_calendarElement;
var rcalendar_calendarDescriptionElement;
var rcalendar_calendarDaysElement;
var rcalendar_calendarDaysElement;
var rcalendar_sheetAYearElement;
var rcalendar_sheetADayElement;
var rcalendar_sheetAMonthElement;
var rcalendar_sheetBYearElement;
var rcalendar_sheetBDayElement;
var rcalendar_sheetBMonthElement;
var rcalendar_isFading;
var rcalendar_isFadingInterval

function rcalendar_initCalendar( )
{
    // Gather HTML Elements
    rcalendar_calendarElement               = document.getElementById("rcalendar");
    rcalendar_calendarDescriptionElement    = document.getElementById("rcalendar_description");
    rcalendar_calendarDaysElement           = document.getElementById("days");
    rcalendar_calendarMonthElement          = document.getElementById("rcalendar_month");
    rcalendar_sheetAYearElement             = document.getElementById("year_A");
    rcalendar_sheetADayElement              = document.getElementById("day_A");
    rcalendar_sheetAMonthElement            = document.getElementById("month_A");
    rcalendar_sheetBYearElement             = document.getElementById("year_B");
    rcalendar_sheetBDayElement              = document.getElementById("day_B");
    rcalendar_sheetBMonthElement            = document.getElementById("month_B");
    
    // Set Sheet A to active (because this might be the first one the visitor will set)
    
    rcalendar_activeDate = "A";
    
    // Create Day Table
    
    var tableElement = document.createElement("table");
    var tbodyElement = document.createElement("tbody");
    for( var row = 0; row < 6; row++ )
    {
        var rowElement = document.createElement("tr");
        for( var cell = 0; cell < 7; cell++ )
        {
            var cellElement = document.createElement("td");
            cellElement.id = "calendar_cell" + (row*7 + cell);
            rowElement.appendChild(cellElement);
        }
        tbodyElement.appendChild(rowElement);
    }
    
    tableElement.appendChild(tbodyElement);
    rcalendar_calendarDaysElement.appendChild(tableElement);
    
    // Fill Table with Days
    rcalendar_displayCalenderMonth();
}

function rcalendar_displayCalenderMonth()
{    
    if( rcalendar_activeDate == "A" )
    {
        var mSelectedDate = rcalendar_date_A;
        setHTMLElementInnerHTML(rcalendar_calendarDescriptionElement, rcalendar_date_A_description);
    }
    if( rcalendar_activeDate == "B" )
    {
        var mSelectedDate = rcalendar_date_B;
        setHTMLElementInnerHTML(rcalendar_calendarDescriptionElement, rcalendar_date_B_description);
    }
    
    var month = rcalendar_atMonth; // cause it's shorter
    
    setHTMLElementInnerHTML(rcalendar_calendarMonthElement, rcalendar_month_names[month.getMonth()] + " " + month.getFullYear());
    
    var mFirstDayOfMonth = new Date(month);
    mFirstDayOfMonth.setDate(1);
    var mWeekdayOfFirstDayOfMonth = (mFirstDayOfMonth.getDay() - rcalendar_startWeekWith) % 6;
    
    for( var day = 0; day < 42; day++ )
    {
        var dayElement = document.getElementById("calendar_cell" + day);
        var dayElementClasses = "";
        
        var mDay = new Date(month);
        mDay.setDate( day+1 - mWeekdayOfFirstDayOfMonth );
        
        if( month.getMonth() != mDay.getMonth() )
        {
            // Current Day is not part of current Month
            dayElementClasses += "unavailable ";
            if( month.getTime() > mDay.getTime() )
                dayElement.onclick = function() { rcalendar_gotoPreviousMonth(); }
            if( month.getTime() < mDay.getTime() )
                dayElement.onclick = function() { rcalendar_gotoNextMonth(); }
        } else {
            var earliestDate = new Date(rcalendar_now);
            if(rcalendar_activeDate == "B")
                earliestDate.setDate(earliestDate.getDate() + 1);
            
            if( mDay.getTime() >= earliestDate.getTime() )
            {
                // If Day is not in the past, an eligible Day
                dayElement.date = mDay;
                dayElement.onclick = function()
                {
                    // Save Date and hide Calendar
                    if( rcalendar_activeDate == "A" )
                    {
                        if(this.date.getTime() >= rcalendar_date_B.getTime())
                        {
                             // Rearrange B if A is later than B
                             rcalendar_date_B = new Date(this.date);
                             rcalendar_date_B.setDate(this.date.getDate() + 1);
                        }
                        rcalendar_date_A = this.date;
                    }
                    if( rcalendar_activeDate == "B" )
                    {
                         // Rearrange A if B is earlier than B
                         if(rcalendar_date_A.getTime() >= this.date.getTime())
                         {
                             rcalendar_date_A = new Date(this.date);
                             rcalendar_date_A.setDate(this.date.getDate() - 1);
                         }
                        rcalendar_date_B = this.date;
                    }
                    
                    rcalendar_displayCalenderMonth();
                    rcalendar_refreshSheets();
                    rcalendar_hideCalendar();
                };
                
                if( rcalendar_hightlightWeekend && ( mDay.getDay() == 0 ) )
                    dayElementClasses += "weekend ";
                    
            } else {
                dayElement.onclick = function() {};
                dayElementClasses += "unavailable ";
            }
        }
        
        if( mDay.getDate() == rcalendar_now.getDate() &&
            mDay.getMonth() == rcalendar_now.getMonth() &&
            mDay.getYear() == rcalendar_now.getYear())
                dayElementClasses += "today ";
        
        if( mDay.getDate() == mSelectedDate.getDate() &&
            mDay.getMonth() == mSelectedDate.getMonth() &&
            mDay.getYear() == mSelectedDate.getYear())
                dayElementClasses += "selected ";
        else if( (mDay.getTime() <= rcalendar_date_B.getTime()) && (mDay.getTime() >= rcalendar_date_A.getTime()) )
                dayElementClasses += "selectedDays ";
        
        dayElement.className = dayElementClasses;
        setHTMLElementInnerHTML(dayElement, mDay.getDate());
    }
    
}

function rcalendar_gotoNextMonth(  )
{
    if(rcalendar_isFading) return;
    rcalendar_atMonth.setMonth( rcalendar_atMonth.getMonth() + 1 );
    rcalendar_displayCalenderMonth();
}

function rcalendar_gotoPreviousMonth(  )
{
    if(rcalendar_isFading) return;
    rcalendar_atMonth.setMonth( rcalendar_atMonth.getMonth() - 1 );
    rcalendar_displayCalenderMonth();
}

function rcalendar_gotoToday(  )
{
    if(rcalendar_isFading) return;
    rcalendar_atMonth = new Date(rcalendar_now);
    rcalendar_displayCalenderMonth();
}

function rcalendar_showCalendar( forSheet )
{
    if(rcalendar_isFading) return;
    rcalendar_activeDate = forSheet;
    rcalendar_displayCalenderMonth();
    rcalendar_isFading = true;
    reffect_showElement(rcalendar_calendarElement.id);    
}

function rcalendar_hideCalendar( )
{
    if(rcalendar_isFading) return;
    rcalendar_isFading = true;
    setTimeout( function() { reffect_hideElement(rcalendar_calendarElement.id); }, 350);
}

function rcalendar_refreshSheets()
{
    setHTMLElementInnerHTML(rcalendar_sheetAYearElement , rcalendar_date_A.getFullYear());
    setHTMLElementInnerHTML(rcalendar_sheetADayElement  , rcalendar_date_A.getDate());
    setHTMLElementInnerHTML(rcalendar_sheetAMonthElement, rcalendar_month_names[rcalendar_date_A.getMonth()]);
    setHTMLElementInnerHTML(rcalendar_sheetBYearElement , rcalendar_date_B.getFullYear());
    setHTMLElementInnerHTML(rcalendar_sheetBDayElement  , rcalendar_date_B.getDate());
    setHTMLElementInnerHTML(rcalendar_sheetBMonthElement, rcalendar_month_names[rcalendar_date_B.getMonth()]);
    
    document.getElementById('input_checkin_monthday').value   = rcalendar_date_A.getDate();
    document.getElementById('input_checkin_year_month').value = rcalendar_date_A.getFullYear()+"-"+(rcalendar_date_A.getMonth()+1);
    document.getElementById('input_checkout_monthday').value  = rcalendar_date_B.getDate();
    document.getElementById('input_checkout_year_month').value= rcalendar_date_B.getFullYear()+"-"+(rcalendar_date_B.getMonth()+1);
}

function reffect_hideElement(elementId) {
    var e = document.getElementById(elementId);
    
    if(e.opac == undefined)
        e.opac = 1.0,
        e.style.display = "block",
        e.style.opacity = 1;
        e.animating = true;
    
    if(e.opac - 0.09 < 0)
        e.opac = 0;
    else
        e.opac -= 0.09;
        
    e.style.opacity = e.opac;
    if(typeof e.filters != 'undefined') e.style.filter = "alpha(opacity=" + Math.round(100*e.opac) + ")"; // IE
    
    if(e.opac > 0) {
        setTimeout("reffect_hideElement(\""+elementId+"\")", 40);
    } else {
        e.style.display = "none";
        e.animating = false;
        e.opac = undefined;
        if(rcalendar_isFading)
            rcalendar_isFading = false;
    }
}

function reffect_showElement(elementId) {
    var e = document.getElementById(elementId);
    
    if(e.opac == undefined)
       e.opac = 0.0,
       e.style.display = "block",
       e.style.opacity = 0;
       e.animating = true;
    
    if(e.opac + 0.04 > 1)
        e.opac = 1;
    else
        e.opac += 0.10;
        
    e.style.opacity = 1-Math.pow(Math.E, -2*Math.E*e.opac);
    if(typeof e.filters != 'undefined') e.style.filter = "alpha(opacity=" + Math.round(100*(1-Math.pow(Math.E, -2*Math.E*e.opac))) + ")"; // IE
    
    if(e.opac < 1) {
        setTimeout("reffect_showElement(\""+elementId+"\")", 40);
    } else {
        e.style.opacity = 1;
        e.animating = false;
        e.opac = undefined;
        if(rcalendar_isFading)
            rcalendar_isFading = false;
    }
}

function setHTMLElementInnerHTML( element, content ) {
    // Dear IE,
    if(!element) {
        return false;
    }
    
    removeChildrenFromNode(element);
        
    if(element.tagName == "DIV" || element.tagName == "TD") {
        var textElement = document.createElement("span");
        textElement.innerHTML = content;
        element.appendChild(textElement);
    }
}

function removeChildrenFromNode(e) {
    if(!e) {
        return false;
    }
    while (e.hasChildNodes()) {
        e.removeChild(e.firstChild);
    }
    return true;
}

