
/**
 * Site class for ladyFortune site
 *
 * @author Guillermo Thiemann <guille@negdis.de>
 */
var Site = new Class({

    /**
     * The html menu
     * @var Element
     */
    menu: null,

    /**
     * The flash menu
     * @var Element
     */
    flashmenu: null,

    /**
     * The effect for the menu slider
     * @var Fx
     */
    menuFx: null,

    /**
     * The effect for the flashmenu slider
     * @var Fx
     */
    flashmenuFx: null,

    /**
     * The content area of the site
     * @var Element
     */
    contentArea: null,

    /**
     * The player container
     * @var Element
     */
    player: null,

    /**
     * The base url of the site
     * @var String
     */
    baseUrl: null,

    getBaseUrl: function() {
        return this.baseUrl;
    },

    /**
     * The effect for the music-player slider
     * @var Fx
     */
    sliderFx: null,

	/**
	 * Constructor
	 * adds domready event handler and sets the baseUrl of the site
	 *
	 * @param String baseUrl
	 * @access public
	 */
	initialize: function(baseUrl) {
	    this.baseUrl = baseUrl;

	    if (window.ie) {
	        alert("This site is still beta and therefore not optimized for Internet Explorer yet. You might want to visit this page with the Firefox or Opera browser to see flash contents like the music player.")
	    }

		window.addEvent("domready", this.onDomReady.bind(this));

		swfobject.embedSWF(this.baseUrl + "/flash/musicPlayerApp.swf", "player", "700", "250", "9.0.0", "flash/expressInstall.swf");
	},

	/**
	 * DOM-Ready event handler
	 * Initially writes Element properties and
	 * sets their events and event-handlers
	 *
	 * @access public
	 */
	onDomReady:function() {
        this.contentArea = $E('#body');

        this.initSlider();
        this.initLinks();

        if (swfobject.hasFlashPlayerVersion("9.0.0")) {
            this.initMenuSlider();
        }
	},

	/**
	 * Instantiates slider effect for menu
	 */
    initMenuSlider: function() {
        this.menu = $E('#menu');
        this.flashmenu = $E('#flashmenuContainer');

        var btn = new Element('a', {
            'id': 'alternativeMenuBtn',
            'events': {
                'click': function(){
                    this.toggleMenu();
                }.bind(this)
            }
        }).setHTML('Show interactive menu');

        btn.injectBefore('headLinks');

        this.menuFx = new Fx.Slide(this.menu);
        this.flashmenuFx = new Fx.Slide(this.flashmenu, {
            onComplete:function() {
                if (this.flashmenu.hasClass('hidden')) {
                    this.flashmenu.setStyle('visibility','hidden');
                }
            }.bind(this)
        });
        this.menuFx.hide();

        var headerattributes = {
		    id:'flashmenu'
		}
		swfobject.embedSWF(this.baseUrl+"/flash/LadyFortuneHeader.swf", "emptyflashmenu", "700", "500", "9.0.0", "flash/expressInstall.swf",null,null,headerattributes);

    },

	/**
	 * Instantiates slider-effect
	 *
	 * @access private
	 */
	initSlider: function () {
		var playerLink = $E('#footerRight');
		this.player = $E('#player');

        this.sliderFx = new Fx.Slide(this.player, {
            onComplete:function() {
                if (this.player.hasClass('hidden')) {
                    this.player.setStyle('visibility','hidden');
                }
            }.bind(this)
        });

        this.sliderFx.hide();
        this.player.addClass('hidden');
        this.player.setStyle('visibility','hidden');

        playerLink.addEvent('click', function() {
            this.toggleSlider();
        }.bind(this));
	},

	/**
	 * Ajax initialisation for all links on site.
	 * The Optional parent element must have an id
	 *
	 * @param Element parent | Optional
	 * @access private
	 */
	initLinks: function (parent) {
	    if (!parent) {
	        parent = '';
	    } else {
	        parent = '#' + parent.getProperty('id') + ' ';
	    }
        var siteLinks = $ES(parent+'a');
        $each(siteLinks, function(element, index) {
            if (!element.hasClass('ajax')) {
                return;
            }
            element.setProperty('onclick', 'return false;');
			element.addEvent("click", function() {
			   // this.lastLink = element;
			    this.loadContent(element);
			}.bind(this));
		}, this);

		// debug ----------------------------------------------->
        var siteLinks = $ES(parent+'area');
        $each(siteLinks, function(element, index) {
            element.setProperty('onclick', 'return false;');
			element.addEvent("click", function() {
			   // this.lastLink = element;
			    this.loadContent(element);
			}.bind(this));
		}, this);
		// <------------------------------------------------ debug

		var form = $E(parent+'form');
		if (form) {
		    form.setProperty('onsubmit', 'return false;');
		    form.addEvent('submit', function() {
		        //this.lastLink = form;
		        this.sendForm(form);
		    }.bind(this));
		}
		Lightbox.init()//.bind(Lightbox);
	},

	/**
	 * Content-Loaded event handler
	 * re-initializes all links on site
	 * @access private
	 */
	onContentLoaded: function () {
	    this.initLinks(this.contentArea);
	},

	/**
	 * Toggles music-player slider
	 *
	 * @access public
	 */
	toggleSlider: function() {
        /*if (this.player.hasClass('hidden')) {
            this.player.removeClass('hidden');
            this.player.setStyle('visibility','visible');
        } else {
            this.player.addClass('hidden');
        }*/
        this.sliderFx.toggle();
	},

	/**
	 * Toggles the alternative menu slider
	 */
	toggleMenu: function() {
        this.menuFx.toggle();
        if (this.flashmenu.hasClass('hidden')) {
            this.flashmenu.removeClass('hidden');
            this.flashmenu.setStyle('visibility','visible');
        } else {
            this.flashmenu.addClass('hidden');
        }
        this.flashmenuFx.toggle();
	},

	/**
	 * Injects the word 'section' between the baseUrl and the rest of the
	 * given url
	 *
	 * @param String url
	 * @return String
	 * @access public
	 */
	injectAjaxCommand: function (url) {
	    // remove base url:
	    if (url.search(this.baseUrl) != -1) {
	       url = url.substr(this.baseUrl.length);
	    }
	    return this.baseUrl + "/section" + url;
	},

	/**
	 * Loads content of given url into body
	 *
	 * @param String url
	 * @access public
	 */
	loadUrl: function(url) {
	    url = this.injectAjaxCommand(url);
	    var ajax = new Ajax(url, {
	        update:this.contentArea,
	        onSuccess:this.onContentLoaded.bind(this)
	    });
	    ajax.request();
	},

	/**
	 * Loads url of the given link using this.loadUrl
	 *
	 * @param Element link
	 * @access public
	 */
	loadContent: function (link) {
	    var href = link.getProperty('href');
	    this.loadUrl(href);
	},

	/**
	 * Sends a form and loads response into body
	 *
	 * @param Element form
	 * @access public
	 */
	sendForm: function(form) {
	    var href = form.getProperty('action');
	    href = this.injectAjaxCommand(href);
	    form.setProperty('action', href);
	    form.send({
	        update:this.contentArea,
	        onSuccess:this.onContentLoaded.bind(this)
	    });
	}

});
