// --------------------------------------------------------------------------------------
// (c) Patrick Arns 2012 http://www.patrick-arns.de
// --------------------------------------------------------------------------------------

// --------------------------------------------------------------------------------------
// Hilfsfunktionen ...
// --------------------------------------------------------------------------------------

(function($,sr)
{
  var debounce = function (func, threshold, execAsap) {
      var timeout;
 
      return function debounced () {
          var obj = this, args = arguments;
          function delayed () {
              if (!execAsap)
                  func.apply(obj, args);
              timeout = null; 
          };
 
          if (timeout)
              clearTimeout(timeout);
          else if (execAsap)
              func.apply(obj, args);
 
          timeout = setTimeout(delayed, threshold || 1000); 
      };
  }
	// smartresize 
	jQuery.fn[sr] = function(fn){  return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); };
 
})(jQuery,'smartresize');

// --------------------------------------------------------------------------------------
// Hauptevents ...
// --------------------------------------------------------------------------------------

$(document).ready(function() 
{    
    $("#logo").css({opacity: 0});
    $("#logo").show();
    
    $("#logo").animate({
        opacity: 0.1
    }, "2000", function () {
        $("#loader").fadeIn("2000", function() {
            $(this).stop();
            intializeClock();
                
            $("#dock").animate({
                marginBottom: "0px"
            }, 500, function() {
                $(this).stop();
                $("#menu").animate({
                    marginTop: "0"});
                
                 $("#loader").fadeOut("2000");
                 $("#logo").animate({
                    opacity: 1
                 }, function() {
                    $(this).stop();
                 });
                 
                 // Welches Fenster war als letztes aktiv?
                 if (window.location.hash == "") {
                    //showDialog("welcome", true);
                 } else {                    
                    handleHash();
                 }
                 
                 // HashChange Event binden ...
                 $(window).on('hashchange', onHashChange);

                 // Auf den Polaroid-Hintergrund warten, damit die Bilder nicht ohne diesen angezeigt werden!
                 $("#pol_loader").ready(function() {
                    initializePolaroid();
                 });
            });
        });
    });  
});

$(window).smartresize(function(){  
	randomizePolaroidsPos();
});

// --------------------------------------------------------------------------------------
// Polaroid Funktionen ...
// --------------------------------------------------------------------------------------

function initializePolaroid()
{
    $.getJSON('helper/json/polaroid_images/', function(data) {
        $.each(data, function(key, val) {
            addPolaroid(key, val.polaroid, val.lightbox);
        });
    });
}

function addPolaroid(polaroidID, polaroidImage, lightBoxImage)
{
    var polID = 'p_' + polaroidID;
    var polSelector = '#' + polID;      
    var tempVal = Math.round(Math.random());
    
	if(tempVal == 1) {
		var rotDegrees = randomXToY(320, 360);    // Rotation links
	} else {
		var rotDegrees = randomXToY(0, 40);       // Rotation rechts
	}
	
    var css = 
        '-webkit-transform : rotate(' + rotDegrees + 'deg);' +  // Webkit
        '-moz-transform : rotate(' + rotDegrees + 'deg);' +     // Firefox
        'tranform : rotate(' + rotDegrees + 'deg)';             // CSS3
        
        
        css="";
        
    var polaroidTemplate = $('<div class="polaroid" id="' + polID + '" style="' + css + '"><img src="' + polaroidImage + '"/></div>');
    
    polaroidTemplate.find("img").load(function(){
        var wiw = $("#main").width() - 150;
        var wih = $("#main").height() - 150;
            
        $(this).parent().animate({
            left: Math.random()* wiw + 150,
            top: Math.random()* wih + 150
        }, function() {
            $(this).stop();
        });
        
        var box = $('<a class="fancybox" href="' + lightBoxImage + '" data-fancybox-group="bg_polaroids" />');
        $(this).wrap(box);
        
        box.disableSelection();
        
        polaroidTemplate.mouseup(function(e){
                if(!dragging) {
                    zindexnr++;
                    var cssObj = { 'z-index' : zindexnr }; 
                    $(this).css(cssObj);
                }
        });
        
        var zindexnr = 1;
        var dragging = false;
        
        polaroidTemplate.draggable({
                cursor: 'pointer',
                start: function(event, ui) {
                        dragging = true;
                        zindexnr++;
                        var cssObj = { 'box-shadow' : '#222 5px 10px 10px', // added in case CSS3 is standard
                                '-webkit-box-shadow' : '#222 5px 10px 10px', // safari only
                                'margin-left' : '-150px',
                                'margin-top' : '-150px',
                                'z-index' : zindexnr };
                        $(this).css(cssObj);
                },
                stop: function(event, ui) {
                        var cssObj = { 'box-shadow' : '', // added in case CSS3 is standard
                                '-webkit-box-shadow' : '', // safari only
                                'margin-left' : '-150px',
                                'margin-top' : '-150px' };
                        $(this).css(cssObj);
                        dragging = false;
                }
        });
    });
    
    polaroidTemplate.appendTo("#main");
    
    $(this).disableSelection();
    $(this).parent().disableSelection();
    $(".fancybox").fancybox();
}

function randomizePolaroidsPos() 
{
	var wiw = $("#main").width() - 150;
    var wih = $("#main").height() - 150;

	$(".polaroid").each(function() {
		$(this).animate({
            left: Math.random()* wiw + 150,
            top: Math.random()* wih + 150
        }, function() {
            $(this).stop();
        });
   });
}

// http://roshanbh.com.np/2008/09/get-random-number-range-two-numbers-javascript.html
function randomXToY(minVal,maxVal,floatVal) 
{
    var randVal = minVal+(Math.random()*(maxVal-minVal));
    return typeof floatVal=='undefined'?Math.round(randVal):randVal.toFixed(floatVal);
}

// --------------------------------------------------------------------------------------
// Dialog Funktionen ...
// --------------------------------------------------------------------------------------

function handleHash()
{
    var windowStr = window.location.hash.substr(1);
    var functionParam = ""; 
    var windowName = "";
    
    var sepPos = windowStr.indexOf("/");
                        
    if (sepPos > 0) {
        windowName = windowStr.substr(0, sepPos);
        functionParam = windowStr.substr(sepPos + 1); 
    } else {
        windowName = windowStr;
    }
    
    showDialog(windowName, functionParam, true);
}

function showDialog(dialogName)
{
    showDialog(dialogName, false);
}

function showDialog(dialogName, force)
{
    showDialog(dialogName, "", false);
}

function showDialog(dialogName, functionName, force)
{    
    if (window.location.hash.substr(1) != dialogName || force)
    {
        var dialogID = "#d_" + dialogName;
        var dialog = $(dialogID);
        
        // ACHTUNG!! JQueryUI Bug!! Wenn der Dialog noch nicht initialisiert wurde
        // liefert dialog('isOpen') IMMER ein Objekt zur�ck! 
        // Deshalb IMMER NUR MIT !== true oder == true abfragen !!
        if (dialog.dialog('isOpen') !== true) {
            var documentHeight = $(document).height() - 40 - 210;
            var documentWidth = $(document).width() * 0.95;
            var xPos = $(document).width() / 2 - documentWidth / 2;
            
            if (documentHeight < 600) {
                documentHeight = $(document).height() - 40 - 30;
            }
            
            dialog.dialog({
                show: "fade",
                hide: "fade",
                width: documentWidth,
                height: documentHeight,
                position: [xPos, 40]
            });
            
            // Content via AJAX laden, wenn n�tig ...
            if (dialog.hasClass("ajax_content")) {
               dialog.load("ajax/" + dialogName, function() {
                    
                    $(this).find(".dialog_page_back").fadeIn(500);
                    $(this).find(".dialog_page_content").fadeIn(500);
                    
                    // Hintergrundbild laden ...
                    $.getJSON('helper/json/random_background_image/', function(data) {
                        setDialogBackground(dialogID, data.background_image);
                    });
                });
            } else {
                dialog.find(".dialog_page_back").show();
                dialog.find(".dialog_page_content").show();
                
                // Hintergrundbild laden ...
                $.getJSON('helper/json/random_background_image/', function(data) {
                    setDialogBackground(dialogID, data.background_image);
                });
            }
            
            dialog.on("dialogclose", onDialogClose);
            dialog.on("dialogfocus", onDialogFocus);
        }
                
        dialog.dialog("show");
        dialog.dialog("moveToTop");
        
        // Gallerie schlie�en, wenn wir nur auf #bilder sind ...
        if (dialogName == "bilder" && functionName == "")
            closeGallery();
        
        $("#currentTitle").html(dialog.dialog("option", "title"));
        
        // Neuen Titel setzen, der Tag "title" wird leider von jQuery entfernt ...
        document.title = dialog.dialog("option", "title") + ' - Patrick-Arns.de';
        
        // M�ssen wir noch was aufrufen?
        if (functionName != "") {
            var splitPos = functionName.indexOf("/");
            
            if (splitPos > 0) {
                var theFunction = functionName.substr(0, splitPos);
                var functionParam = functionName.substr(splitPos + 1);
                
                if (theFunction == "gallery" && functionParam != ""){
                    showGallery(functionParam);
                }
            }
        }
    }
}

function setDialogBackground(dialogID, aPageBackgroundURL)
{   
    var dialog = $(dialogID);
    var orig_image = dialog.find(".dialog_bg_loader");
    
    orig_image.attr("src", aPageBackgroundURL).load(function () {
        dialog.find(".dialog_bg_grid").css({"backgroundImage": "url(images/grid.png)", 'backgroundRepeat': 'repeat'});
        
        orig_image.css({width: "auto", height: "auto"});
        bgImage = $("<img class='dialog_background'>").attr("src", aPageBackgroundURL);
        
        dialog.find(".dialog_bg_image").prepend(bgImage);
        adjustDialogBackgroundImage(dialog);
        
        dialog.find(".dialog_bg_image").fadeIn(1000);
        
        // Resize anpassen ...
        dialog.bind("dialogresize", function(event, ui) {
            adjustDialogBackgroundImage($(this)); 
        });
    });
}

function adjustDialogBackgroundImage(aDialog)
{
    var orig_image = aDialog.find(".dialog_bg_loader");  
    var bgImage = aDialog.find(".dialog_background"); 
    
    var imgRatio = orig_image.width() / orig_image.height();
    var bgWidth = aDialog.width();
    var bgHeight = bgWidth / imgRatio;
            
    if(bgHeight < aDialog.height()) {
        bgHeight = aDialog.height();
        bgWidth = bgHeight * imgRatio;
    }
    
    bgImage.width(bgWidth).height(bgHeight);
}

function onHashChange()
{
    if (window.location.hash != "" && window.location.hash.substr(1) != "") {
        handleHash();
    }   
}

function onDialogClose(event, ui)
{
    window.location.hash = "";
    
    $(this).find(".dialog_page_back").hide();
    $(this).find(".dialog_page_content").hide();
    $(this).find(".dialog_bg_image").hide();
}

function onDialogFocus(event, ui)
{
    var dialogName = $(this).attr("id").substr(2);
    
    if (window.location.hash.substr(1).indexOf(dialogName) != 0)
    {
        $("#currentTitle").html($(this).dialog("option", "title"));
        
        $(window).off('hashchange');
        window.location.hash = dialogName;
        $(window).on('hashchange', onHashChange);
    }   
}

// --------------------------------------------------------------------------------------
// Uhr Funktionen ...
// --------------------------------------------------------------------------------------

function intializeClock()
{
    updateClock();
    setInterval('updateClock()', 30000);
}

function updateClock()
{
    var now = new Date();
    
    var Wochentag = new Array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
    var Monat = new Array("Januar", "Februar", "M&auml;z", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
    
    var Stunden =  now.getHours() < 10 ? "0" +  now.getHours() :  now.getHours();
    var Minuten =  now.getMinutes() < 10 ? "0" +  now.getMinutes() :  now.getMinutes();
        
    var datestring = Wochentag[now.getDay()] + ", " + now.getDate() + ". " + Monat[now.getMonth()] + " " + now.getFullYear() + " " + Stunden + ":" + Minuten;
    $("#clock").html(datestring);
}

// --------------------------------------------------------------------------------------
// Gallerie Funktionen ...
// --------------------------------------------------------------------------------------

function closeGallery() {
    $("#gallery_content").hide();
    $("#gallery_overview").show();
    
    $("#title_overview").show();
    $("#title_gallery").hide();
}

function showGallery(galleryKey) {
    $("#gallery_overview").hide();
    $("#gallery_desc").html(''); 
    $("#gallery_pics").html('<img class="centerLoader" src="images/ajax-loader.gif" />');
    $("#gallery_content").show();
    
    // Gallerie Informationen abrufen ...
    $.getJSON('helper/json/gallery/?gi=' + galleryKey, function(data) {
        $("#title_overview").hide();
        $("#title_gallery").html(data.title).show().lettering();
         
        if (data.infoText != "") { 
            $("#gallery_desc").html(data.infoText);
        } 
    });
    
    // Gallerie Content abrufen ...
    $.getJSON('helper/json/gallery/?g=' + galleryKey, function(data) {
        $("#gallery_pics").html("").append('<ul id="gallery_content_content" class="polaroids"><li><a href="#bilder">Zur&uuml;ck</a></li></ul>');
        $.each(data, function(key, val) {
            addGalleryPicture(val);
        });   
    });
}

function addGalleryPicture(val) {
    var entry = $('<li style="display: none;"><a class="fancybox" href="' + val.pic + '" data-fancybox-group="gallery_' + val.galleryKey + '"><img src="' + val.thumbPic + '" /></a></li>');
    
    entry.find('img').load(function () {
        $(this).parent().parent().fadeIn(500);
    });
    
    $("#gallery_content_content").append(entry);
}

function addGalleryOverviewEntry(val) {
    var title = "'" + val.title + "'";
    var infoText = "'" + val.infoText + "'"; 

    var entry = $('<li><a id="gallery_' + val.galleryKey + '" href="#bilder/gallery/' + val.galleryKey + '" title="' + val.title + '"><img src="' + val.thumbPic + '" alt="' + val.title + '" /></a></li>');
    $("#gallery_overview_content").append(entry);
}
