/**
 * Contains common functions for use on front-end
 *
 * @version $Revision: 1.3 $
 * @requires jQuery UI - Datepicker component
 */
createPackage('nl.grip.cms', 'cms');

/**
 * arrays for use later on
 */
cms.ImagePreloader = function()
{
    var images = [];

    return {

        images : images,

        /**
         * Adds image to preload stack
         * The stack is processed in preloadImages()
         * @param string src The image src
         * @return void
         */
        add : function(src)
        {
            if (!in_array(src, this.images)) {
                this.images.push(src);
            }
        },

        /**
         * Preloads images set
         * @return void
         */
        preloadAll : function()
        {
            if (this.images.length > 0) {
                for (var i = 0; i < this.images.length; i++) {
                    this.preload(this.images[i]);
                }
            }
        },

        /**
         * Adds image (invisible) to body so that it will be preloaded
         * @return void
         */
        preload : function(src)
        {
            // FIXME this doesn't cache the image
            $.get(src);
        }
    };
}();

cms.BannerRandomizer = function()
{
    var banners = {};

    return  {

        banners : banners,

        add : function(selector, bannerData)
        {
            this.banners[selector] = bannerData;
        },

        displayRandomBanner : function()
        {
            for (var selector in this.banners) {

                var obj = $(selector);
                if (obj.length) {

                    // randomize

                    // collect the weights
                    var bannerWeights = [];
                    for (var i in this.banners[selector]) {
                        bannerWeights[i] = this.banners[selector][i].weight;
                    }

                    // pick a random banner
                    var bannerPosition = cms.arrayFactorRand(bannerWeights);

                    var banner = this.banners[selector][bannerPosition];
                    if (banner) {

                        // collect the weights
                        var visualWeights = [];
                        for (var j in banner.visuals) {
                            visualWeights[j] = banner.visuals[j].weight;
                        }

                        // now, pick a random visual for this banner
                        var visualPosition = cms.arrayFactorRand(visualWeights);

                        var visual = banner.visuals[visualPosition];
                        if (visual) {

                            var html;

                            if (visual.type === 'application/x-shockwave-flash') {

                                // Flash banner
                                html = $('<object>').attr({'type' : visual.type, 'width' : visual.width, 'height' : visual.height, 'data' : visual.filename});

                                // params
                                html.append('<param name="FlashVars" value="' + 'clickTag=' + banner.url + '&external=' + ((banner.external == 1) ? 'true' : 'false') + '">');
                                html.append('<param name="movie" value="' + visual.filename + '">');
                                html.append('<param name="wmode" value="' + (visual.wmode || 'transparent') + '">');
                                html.append('<param name="menu" value="' + (visual.menu || 'false') + '">');

                            } else {

                                // normal banner
                                var html = $('<a>').attr('href', banner.url);
                                var img = $('<img>').attr({'src' : visual.filename, 'alt' : visual.title});

                                if (banner.external == 1) {
                                    html.attr({'rel' : 'external', 'target' : '_blank'});
                                }

                                html.append(img);

                            }

                            // output the banner
                            obj.append(html);

                        }
                    }
                }
            }
        }
    }
}();


cms.DatePicker = function()
{
    var datepickers = [];

    return {
        datepickers : datepickers,

        add : function(id)
        {
            datepickers.push(id);
        },

        load : function()
        {
            if (datepickers.length > 0) {
                for (var i = 0; i < datepickers.length; i++) {

                    var input = $('#' + datepickers[i]);

                    input.datepicker();
                    input.parents('.input').addClass('datecal');
                }
            }
        }
    }
}();

cms.Lang = function()
{
    var texts = {};

    return {
        texts : texts,

        getText : function(id)
        {
            return texts[id];
        },

        setText : function(id, text)
        {
            texts[id] = text;
        }
    }
}();

cms.getFragmentParams = function()
{
    var res = null;
    var fragment = window.location.hash;

    if (fragment != '') {

        var parts = fragment.substr(1, fragment.length).split(';');

        if (parts.length > 1) {

            res = {};

            for (var i = 0; i < parts.length; i++) {

                part = parts[i];
                pos = part.search('=')

                if (pos) {
                    key = part.substr(0,pos);
                    value = part.substr(pos + 1, part.length - pos - 1);
                    res[key] = value;
                }
            }
        }
    }

    return res;

}

/**
 * Returns random element from array using weight factors as values
 * @param Array factors The array holding the factors (integers)
 * @return mixed The 'lucky' key
 */
cms.arrayFactorRand = function(factors)
{
    var factorTotals = 0;
    var factorEnds = [];
    var luckyKey = false;

    for (i in factors) {
        factorTotals += factors[i];
        factorEnds[i] = factorTotals;
    }

    var luckyNumber = Math.random() * factorTotals;

    for (i in factors) {
        if (factorEnds[i] > luckyNumber) {
            luckyKey = i;
            break;
        }
    }

    return luckyKey;
}

function initPage()
{
    // make all external links open in new page
    $('a[rel~="external"]').attr('target', '_blank');

    // print links
    $('*[rel~="print"]').click(function(){window.print();});

    // preview selector

    // back link

}

// add body-load events
$(initPage);
$(EventUtils.Delegate.create(cms.ImagePreloader, 'load', cms.ImagePreloader.preloadAll));
$(EventUtils.Delegate.create(cms.DatePicker, 'load', cms.DatePicker.load));
$(EventUtils.Delegate.create(cms.BannerRandomizer, 'load', cms.BannerRandomizer.displayRandomBanner));
