<commit_before>'use strict';

function WorldManager() {
    this.__init__();
}

WorldManager.prototype = {
    previous_world : null,
    current_world  : null,

    current_player_menu: null,

    // Pre-defined worlds.
    world_login    : null,
    world_home     : null,
    world_settings : null,

    world_global   : null,

    world_admin    : null,

    __init__: function() {
        this.world_login = new LoginWorld();
        this.world_home = new HomeWorld();
        this.world_settings = new SettingsWorld();

        this.light_delta = 0;
        this.light_delta_cap = 10;
        this.light_radius = 1000;
    },

    //this.world_home.add_css_scene();

    update_current_world: function(delta) {

        // Temp just for fun, rotate the lights in a circle.
        this.light_delta += delta;
        this.light_percentage = this.light_delta / this.light_delta_cap;
        this.light_0.position.set(cos(this.light_percentage) * 1000, 100, sin(this.light_percentage) * 1000);
        this.light_1.position.set(cos(this.light_percentage + .25 * 10) * 1000, 100, sin(this.light_percentage + .25 * 10) * 1000);
        this.light_2.position.set(cos(this.light_percentage + .50 * 10) * 1000, 100, sin(this.light_percentage + .50 * 10) * 1000);
        this.light_3.position.set(cos(this.light_percentage + .75 * 10) * 1000, 100, sin(this.light_percentage + .75 * 10) * 1000);

        if (GUI_PAUSED_MENU.is_visible()) {
            return;
        }

        // TODO : Double check on what order these should update.

        if (MANAGER_WORLD.current_player_menu.is_visible()) {
            MANAGER_WORLD.current_player_menu.update(delta);
        }

        for (var a = 0; a < this.current_world.root_attachables.length; a++) {
            if (this.current_world.root_attachables[a].has_animation && this.root_attachables[a].requires_animation_update) {
                this.current_world.root_attachables[a].update(delta);
            }
            this.current_world.root_attachables[a].update_all_child_animations_recursively(delta);
        }

        if (!this.current_world.floating_cursor._currently_engaged) {
            this.current_world.update_interactive_objects();
        }

        this.current_world.floating_cursor.update();

        //this.current_world.floating_cursor.update();
    },

    set_current_world: function(world) {
        if (this.current_world !== null) {
            // Before exiting the world make sure to remove the camera reference.
            this.current_world.remove_from_scene(CURRENT_PLAYER.fps_controls.yaw);
            this.current_world.exit_world();

            // TODO : figure out if this is used
            //this.current_world.current_world = false;

            this.previous_world = this.current_world;
        }
        this.current_world = world;
        this.current_floating_cursor = this.current_world.floating_cursor;
        this.current_player_menu = this.current_world.player_menu;

        // Before adding the world make sure to add the camera reference.
        this.current_world.add_to_scene(CURRENT_PLAYER.fps_controls.yaw);
        this.current_world.enter_world();
    },

    key_down_event: function(event) {
        this.current_world.key_down_event_for_interactive_objects(event);
    },

    add_to_all_scenes: function(object) {
        this.world_login.add_to_scene(object);
        this.world_home.add_to_scene(object);
        this.world_settings.add_to_scene(object);

        // TODO : Make sure dynamic worlds are dealt with.
    },

    create_world: function(world) {
        world.player_menu.create();
        world.player_menu.set_to_invisible();

        world.floating_cursor.create();

        var skybox_geometry = new THREE.BoxGeometry(15000, 15000, 15000);
        var skybox_cube = new THREE.Mesh(skybox_geometry, MANAGER_LOADING.sky_box_material);
        skybox_cube.position.set(0, 0, 0);
        world.add_to_scene(skybox_cube);

        // Default hex grid ground.
        var grid = new vg.HexGrid({cellSize: 100});
        grid.generate({size: 10});
        var board = new vg.Board(grid);
        board.generateTilemap({cellSize: 100, tileScale: 0.99});
        world.add_to_scene(board.group);

        // Default lights.
        this.lights = [];

        this.light_0 = new THREE.PointLight(0xccffcc, .4, 0);
        this.light_0.position.set(5, 100, 5);
        world.add_to_scene(this.light_0);

        this.light_1 = new THREE.PointLight(0xff8579, .4, 0);
        this.light_1.position.set(1000, 100, 0);
        world.add_to_scene(this.light_1);

        this.light_2 = new THREE.PointLight(0xb1ff90, .4, 0);
        this.light_2.position.set(0, 100, 1000);
        world.add_to_scene(this.light_2);

        this.light_3 = new THREE.PointLight(0x84b5ff, .4, 0);
        this.light_3.position.set(500, 100, 500);
        world.add_to_scene(this.light_3);
        /////////////////

        var light = new THREE.AmbientLight(0xffffff, .25); // soft white light
        world.add_to_scene(light);

        // Now finally create the actual world.
        world.create();
    }

};

<commit_msg>general updating 65<commit_after>'use strict';

function WorldManager() {
    this.__init__();
}

WorldManager.prototype = {
    previous_world : null,
    current_world  : null,

    current_player_menu: null,

    // Pre-defined worlds.
    world_login    : null,
    world_home     : null,
    world_settings : null,

    world_global   : null,

    world_admin    : null,

    __init__: function() {
        this.world_login = new LoginWorld();
        this.world_home = new HomeWorld();
        this.world_settings = new SettingsWorld();

        this.light_delta = 0;
        this.light_delta_cap = 10;
        this.light_radius = 1000;
    },

    //this.world_home.add_css_scene();

    update_current_world: function(delta) {

        // Temp just for fun, rotate the lights in a circle.
        this.light_delta += delta;
        this.light_percentage = this.light_delta / this.light_delta_cap;
        this.light_0.position.set(cos(this.light_percentage) * 1000, 100, sin(this.light_percentage) * 1000);
        this.light_1.position.set(cos(this.light_percentage + .33 * 10) * 1000, 100, sin(this.light_percentage + .33 * 10) * 1000);
        this.light_2.position.set(cos(this.light_percentage + .66 * 10) * 1000, 100, sin(this.light_percentage + .66 * 10) * 1000);
        this.light_3.position.set(cos(this.light_percentage + .99 * 10) * 1000, 100, sin(this.light_percentage + .99 * 10) * 1000);

        if (GUI_PAUSED_MENU.is_visible()) {
            return;
        }

        // TODO : Double check on what order these should update.

        if (MANAGER_WORLD.current_player_menu.is_visible()) {
            MANAGER_WORLD.current_player_menu.update(delta);
        }

        for (var a = 0; a < this.current_world.root_attachables.length; a++) {
            if (this.current_world.root_attachables[a].has_animation && this.root_attachables[a].requires_animation_update) {
                this.current_world.root_attachables[a].update(delta);
            }
            this.current_world.root_attachables[a].update_all_child_animations_recursively(delta);
        }

        if (!this.current_world.floating_cursor._currently_engaged) {
            this.current_world.update_interactive_objects();
        }

        this.current_world.floating_cursor.update();

        //this.current_world.floating_cursor.update();
    },

    set_current_world: function(world) {
        if (this.current_world !== null) {
            // Before exiting the world make sure to remove the camera reference.
            this.current_world.remove_from_scene(CURRENT_PLAYER.fps_controls.yaw);
            this.current_world.exit_world();

            // TODO : figure out if this is used
            //this.current_world.current_world = false;

            this.previous_world = this.current_world;
        }
        this.current_world = world;
        this.current_floating_cursor = this.current_world.floating_cursor;
        this.current_player_menu = this.current_world.player_menu;

        // Before adding the world make sure to add the camera reference.
        this.current_world.add_to_scene(CURRENT_PLAYER.fps_controls.yaw);
        this.current_world.enter_world();
    },

    key_down_event: function(event) {
        this.current_world.key_down_event_for_interactive_objects(event);
    },

    add_to_all_scenes: function(object) {
        this.world_login.add_to_scene(object);
        this.world_home.add_to_scene(object);
        this.world_settings.add_to_scene(object);

        // TODO : Make sure dynamic worlds are dealt with.
    },

    create_world: function(world) {
        world.player_menu.create();
        world.player_menu.set_to_invisible();

        world.floating_cursor.create();

        var skybox_geometry = new THREE.BoxGeometry(15000, 15000, 15000);
        var skybox_cube = new THREE.Mesh(skybox_geometry, MANAGER_LOADING.sky_box_material);
        skybox_cube.position.set(0, 0, 0);
        world.add_to_scene(skybox_cube);

        // Default hex grid ground.
        var grid = new vg.HexGrid({cellSize: 100});
        grid.generate({size: 10});
        var board = new vg.Board(grid);
        board.generateTilemap({cellSize: 100, tileScale: 0.99});
        world.add_to_scene(board.group);

        // Default lights.
        this.lights = [];

        this.light_0 = new THREE.PointLight(0xccffcc, .4, 0);
        this.light_0.position.set(5, 100, 5);
        world.add_to_scene(this.light_0);

        this.light_1 = new THREE.PointLight(0xff8579, .4, 0);
        this.light_1.position.set(1000, 100, 0);
        world.add_to_scene(this.light_1);

        this.light_2 = new THREE.PointLight(0xb1ff90, .4, 0);
        this.light_2.position.set(0, 100, 1000);
        world.add_to_scene(this.light_2);

        this.light_3 = new THREE.PointLight(0x84b5ff, .4, 0);
        this.light_3.position.set(500, 100, 500);
        world.add_to_scene(this.light_3);
        /////////////////

        var light = new THREE.AmbientLight(0xffffff, .25); // soft white light
        world.add_to_scene(light);

        // Now finally create the actual world.
        world.create();
    }

};

<|endoftext|>


<commit_before>define([
    'jquery',
    '/bower_components/chainpad-crypto/crypto.js',
    '/bower_components/chainpad-netflux/chainpad-netflux.js',
    '/common/toolbar2.js',
    '/common/cryptpad-common.js',
    '/common/visible.js',
    '/common/notify.js',
    '/file/file-crypto.js',
    '/bower_components/tweetnacl/nacl-fast.min.js',
    '/bower_components/file-saver/FileSaver.min.js',
], function ($, Crypto, realtimeInput, Toolbar, Cryptpad, Visible, Notify, FileCrypto) {
    var Messages = Cryptpad.Messages;
    var saveAs = window.saveAs;
    var Nacl = window.nacl;

    var APP = {};

    $(function () {
// TODO race condition with contents() here
    var ifrw = $('#pad-iframe')[0].contentWindow;
    var $iframe = $('#pad-iframe').contents();
    var $form = $iframe.find('#upload-form');
    var $dlform = $iframe.find('#download-form');
    var $label = $form.find('label');
    var $progress = $iframe.find('#progress');
    var $body = $iframe.find('body');

    $body.on('dragover', function (e) { e.preventDefault(); });
    $body.on('drop', function (e) { e.preventDefault(); });

    Cryptpad.addLoadingScreen();

    var Title;

    var myFile;
    var myDataType;

    var uploadMode = false;

    var andThen = function () {
        var $bar = $iframe.find('.toolbar-container');

        var secret;
        var hexFileName;
        if (window.location.hash) {
            secret = Cryptpad.getSecrets();
            if (!secret.keys) { throw new Error("You need a hash"); } // TODO
            hexFileName = Cryptpad.base64ToHex(secret.channel);
        } else {
            uploadMode = true;
        }

        var getTitle = function () {
            var pad = Cryptpad.getRelativeHref(window.location.href);
            var fo = Cryptpad.getStore().getProxy().fo;
            var data = fo.getFileData(pad);
            return data ? data.title : undefined;
        };

        var exportFile = function () {
            var filename = Cryptpad.fixFileName(document.title);
            if (!(typeof(filename) === 'string' && filename)) { return; }
            var blob = new Blob([myFile], {type: myDataType});
            saveAs(blob, filename);
        };

        Title = Cryptpad.createTitle({}, function(){}, Cryptpad);

        var displayed = ['title', 'useradmin', 'newpad', 'limit', 'upgrade'];
        if (secret && hexFileName) {
            displayed.push('fileshare');
        }

        var configTb = {
            displayed: displayed,
            ifrw: ifrw,
            common: Cryptpad,
            title: Title.getTitleConfig(),
            hideDisplayName: true,
            $container: $bar
        };
        var toolbar = APP.toolbar = Toolbar.create(configTb);

        Title.setToolbar(toolbar);

        if (uploadMode) { toolbar.title.hide(); }

        var $rightside = toolbar.$rightside;

        var $export = Cryptpad.createButton('export', true, {}, exportFile);
        $rightside.append($export);

        Title.updateTitle(Cryptpad.initialName || getTitle() || Title.defaultTitle);

        if (!uploadMode) {
            $dlform.show();
            var src = Cryptpad.getBlobPathFromHex(hexFileName);
            var cryptKey = secret.keys && secret.keys.fileKeyStr;
            var key = Nacl.util.decodeBase64(cryptKey);

            FileCrypto.fetchDecryptedMetadata(src, key, function (e, metadata) {
                if (e) { return void console.error(e); }
                var title = document.title = metadata.name;
                Title.updateTitle(title || Title.defaultTitle);

                Cryptpad.removeLoadingScreen();
                var decrypting = false;
                $dlform.find('#dl, #progress').click(function () {
                    if (decrypting) { return; }
                    if (myFile) { return void exportFile(); }
                    decrypting = true;

                    return Cryptpad.fetch(src, function (e, u8) {
                        if (e) {
                            decrypting = false;
                            return void Cryptpad.alert(e);
                        }

                        // now decrypt the u8
                        if (!u8 || !u8.length) {
                            return void Cryptpad.errorLoadingScreen(e);
                        }

                        FileCrypto.decrypt(u8, key, function (e, data) {
                            if (e) {
                                decrypting = false;
                                return console.error(e);
                            }
                            console.log(data);
                            var title = document.title = data.metadata.name;
                            myFile = data.content;
                            myDataType = data.metadata.type;
                            Title.updateTitle(title || Title.defaultTitle);
                            exportFile();
                            decrypting = false;
                        }, function (progress) {
                            var p = progress * 100 +'%';
                            $progress.width(p);
                            console.error(progress);
                        });
                    });
                });
            });
            return;
        }

        if (!Cryptpad.isLoggedIn()) {
            return Cryptpad.alert(Messages.upload_mustLogin, function () {
                if (sessionStorage) {
                    sessionStorage.redirectTo = window.location.href;
                }
                window.location.href = '/login/';
            });
        }

        $form.css({
            display: 'block',
        });

        var FM = Cryptpad.createFileManager();

        $form.find("#file").on('change', function (e) {
            var file = e.target.files[0];
            FM.handleFile(file);
        });

        //FM.createDropArea($form, $label, handleFile);
        FM.createUploader($form, $label, $body);

        // we're in upload mode
        Cryptpad.removeLoadingScreen();
    };

    Cryptpad.ready(function () {
        andThen();
        Cryptpad.reportAppUsage();
    });

    });
});
<commit_msg>Fix a race condition in the file app<commit_after>define([
    'jquery',
    '/bower_components/chainpad-crypto/crypto.js',
    '/bower_components/chainpad-netflux/chainpad-netflux.js',
    '/common/toolbar2.js',
    '/common/cryptpad-common.js',
    '/common/visible.js',
    '/common/notify.js',
    '/file/file-crypto.js',
    '/bower_components/tweetnacl/nacl-fast.min.js',
    '/bower_components/file-saver/FileSaver.min.js',
], function ($, Crypto, realtimeInput, Toolbar, Cryptpad, Visible, Notify, FileCrypto) {
    var Messages = Cryptpad.Messages;
    var saveAs = window.saveAs;
    var Nacl = window.nacl;

    var APP = {};

    $(function () {

    var andThen = function () {
        var ifrw = $('#pad-iframe')[0].contentWindow;
        var $iframe = $('#pad-iframe').contents();
        var $form = $iframe.find('#upload-form');
        var $dlform = $iframe.find('#download-form');
        var $label = $form.find('label');
        var $progress = $iframe.find('#progress');
        var $body = $iframe.find('body');

        $body.on('dragover', function (e) { e.preventDefault(); });
        $body.on('drop', function (e) { e.preventDefault(); });

        Cryptpad.addLoadingScreen();

        var Title;

        var myFile;
        var myDataType;

        var uploadMode = false;

        var $bar = $iframe.find('.toolbar-container');

        var secret;
        var hexFileName;
        if (window.location.hash) {
            secret = Cryptpad.getSecrets();
            if (!secret.keys) { throw new Error("You need a hash"); } // TODO
            hexFileName = Cryptpad.base64ToHex(secret.channel);
        } else {
            uploadMode = true;
        }

        var getTitle = function () {
            var pad = Cryptpad.getRelativeHref(window.location.href);
            var fo = Cryptpad.getStore().getProxy().fo;
            var data = fo.getFileData(pad);
            return data ? data.title : undefined;
        };

        var exportFile = function () {
            var filename = Cryptpad.fixFileName(document.title);
            if (!(typeof(filename) === 'string' && filename)) { return; }
            var blob = new Blob([myFile], {type: myDataType});
            saveAs(blob, filename);
        };

        Title = Cryptpad.createTitle({}, function(){}, Cryptpad);

        var displayed = ['title', 'useradmin', 'newpad', 'limit', 'upgrade'];
        if (secret && hexFileName) {
            displayed.push('fileshare');
        }

        var configTb = {
            displayed: displayed,
            ifrw: ifrw,
            common: Cryptpad,
            title: Title.getTitleConfig(),
            hideDisplayName: true,
            $container: $bar
        };
        var toolbar = APP.toolbar = Toolbar.create(configTb);

        Title.setToolbar(toolbar);

        if (uploadMode) { toolbar.title.hide(); }

        var $rightside = toolbar.$rightside;

        var $export = Cryptpad.createButton('export', true, {}, exportFile);
        $rightside.append($export);

        Title.updateTitle(Cryptpad.initialName || getTitle() || Title.defaultTitle);

        if (!uploadMode) {
            $dlform.show();
            var src = Cryptpad.getBlobPathFromHex(hexFileName);
            var cryptKey = secret.keys && secret.keys.fileKeyStr;
            var key = Nacl.util.decodeBase64(cryptKey);

            FileCrypto.fetchDecryptedMetadata(src, key, function (e, metadata) {
                if (e) { return void console.error(e); }
                var title = document.title = metadata.name;
                Title.updateTitle(title || Title.defaultTitle);

                Cryptpad.removeLoadingScreen();
                var decrypting = false;
                $dlform.find('#dl, #progress').click(function () {
                    if (decrypting) { return; }
                    if (myFile) { return void exportFile(); }
                    decrypting = true;

                    return Cryptpad.fetch(src, function (e, u8) {
                        if (e) {
                            decrypting = false;
                            return void Cryptpad.alert(e);
                        }

                        // now decrypt the u8
                        if (!u8 || !u8.length) {
                            return void Cryptpad.errorLoadingScreen(e);
                        }

                        FileCrypto.decrypt(u8, key, function (e, data) {
                            if (e) {
                                decrypting = false;
                                return console.error(e);
                            }
                            console.log(data);
                            var title = document.title = data.metadata.name;
                            myFile = data.content;
                            myDataType = data.metadata.type;
                            Title.updateTitle(title || Title.defaultTitle);
                            exportFile();
                            decrypting = false;
                        }, function (progress) {
                            var p = progress * 100 +'%';
                            $progress.width(p);
                            console.error(progress);
                        });
                    });
                });
            });
            return;
        }

        if (!Cryptpad.isLoggedIn()) {
            return Cryptpad.alert(Messages.upload_mustLogin, function () {
                if (sessionStorage) {
                    sessionStorage.redirectTo = window.location.href;
                }
                window.location.href = '/login/';
            });
        }

        $form.css({
            display: 'block',
        });

        var FM = Cryptpad.createFileManager();

        $form.find("#file").on('change', function (e) {
            var file = e.target.files[0];
            FM.handleFile(file);
        });

        //FM.createDropArea($form, $label, handleFile);
        FM.createUploader($form, $label, $body);

        // we're in upload mode
        Cryptpad.removeLoadingScreen();
    };

    Cryptpad.ready(function () {
        andThen();
        Cryptpad.reportAppUsage();
    });

    });
});
<|endoftext|>


<commit_before>

(function(){

	var content_key = 'games_1950';
	var content = {};

	content = {

		'decade': '1950',
		'games': [
			{
		        'type': 'game', // game or console
		        'name': 'NIMROD',
		        'authors': ['Edward Uhler Condon'],
		        'company': ['Ferranti'],
		        'year': '1951',
		        'date': '05-05-1951', // Day, Month, Year
		        'headline': 'First Electronic Game',
		        'resume': [
		            'Usando um painel de luzes para a sua exibição, ',
					'ele foi projetado exclusivamente para jogar o jogo de Nim. ',
					'Este foi o primeiro exemplo de um computador digital projetado ',
					'especificamente para jogar um jogo. ',
					'O criador do NIMATRON foi Edward Uhler Condon.',
					'A ideia do jogo era simples e já existia fora do mundo',
					'tecnológico. O NIMROD usava painéis de luzes para simular',
					'as peças usadas no já conhecido jogo Nim'
		        ].join(''),
		 		'full_text': [
		            'Em 5 de maio de 1951, o computador NIMROD, criado pela Ferranti, ',
					'foi apresentado no Festival da Grã-Bretanha. ',
		            'A empresa era focada em segurança eletrônica e em seu tempo livre',
		            'Edward Uhler Condon utilizou a ferramentas disponíveis e criou ',
		            'o NIMATRON cujo foco era simular o jogo antigo NIM, antes jogado com pedras. ',
		            'As pedras foram trocadas por um painel com luzes e o controle era um totem. ',
		            'O objetivo do jogo era deixar o adversário, nesse caso o computador, ',
					'com a última peça. O jogador poderia remover quantas peças quisesse ',
					'de uma linha, por vez. Só que em 90% das vezes o computador vencia.',
					'O jogo fez um sucesso enorme nas feiras em que foi exposto, fazendo',
					'com que muitas pessoas se aventurassem a jogá-lo. Em algumas exposições,',
					'até pessoas importantes como embaixadores jogaram o jogo.',
					'Em Berlim, as pessoas esquecerma da cerveja que estava sendo distribuída',
					'gratuitamente no local para concentrar a atenção na exposição do jogo'
		        ].join(''),
		        'thumbnail': 'thumbnail_example.png',
		        'main_img': {'name': 'main.png', 'caption': "description"},
		        'images': [
		            {'name': 'img1.png', 'caption': "Máquina completa"},
		            {'name': 'img2.png', 'caption': "Apresentação do jogo feita no Festival da Grã-Bretanha"},
		            {'name': 'img3.png', 'caption': "Painel de jogo"}
		        ],
		        'video_gameplay': [
		            {'url': 'http://www.youtu.be/yJZlozoQ4jI', 'caption': "Gameplay Nimrod", 'type': "youtube"} // type: youtube or vimeo
		        ],
		        'demos': [
		            {'url': 'http://www.archimedes-lab.org/game_nim/play_nim_game.html', 'caption': "Jogar agora"}
		        ],
		        'references': [
		        	{'url': 'http://pt.slideshare.net/gabrielalonso927/nim-first-videogame', 'caption': "Introdução aos Jogos Eletrônicos (UEA) - Slides", 'type': 'slides'},
		            {'url': 'http://en.wikipedia.org/wiki/Nimrod_(computing)', 'caption': "Wikipédia"},
		            {'url': 'http://www.historyofinformation.com/expanded.php?id=4471', 'caption': "History of Information"}
		        ]
			},
			{
				'type': 'game',
		        'name': 'OxO - Naughts and Crosses',
		        'image_dir': 'oxo',
		        'authors': ['Alexander Shafto Douglas'],
		        'year': '1952',
		        'headline': 'OxO - O primeiro jogo digital.',
		        'resume': [
		            'Foi em 1952 que surgiu o primeiro vídeo game, do jeito que deve ser, ',
		            'gráficos digitais exibidos em um monitor de tubo de raios catódicos., ',
		            'OXO, Noughts and Crosses foi desenvolvido por Alexander Shafto Douglas, ',
		            'como parte da sua tese de doutorado Interação Homem-Computador, ',
		            'O jogo tinha como controles um telefone analógico, onde cada número',
		            'discado representava o quadro onde seria feito o movimento. ',
		            'Apesar da simplicidade e da aparente falta de emoção',
		            'o jogo chamava atenção por representar bem a “Interação Homem-Computador”. ',
		            'Apesar de brilhante, OXO não se popularizou porque só funcionava ',
		            'no computador em que foi desenvolvido – o EDSAC – e ele era o único no mundo!',
		            'A.S Douglas ganhou seu título de doutor e OXO foi considerado o primeiro vídeo game'
		        ].join(''),
		        'full_text': [
		            'Somente em 1952 foi que surgiu o primeiro vídeo game, do jeito que deve ser - gráficos digitais',
		            'exibidos em um monitor de tubo de raios catódicos. OXO, Noughts and Crosses foi desenvolvido',
		            'por Alexander Shafto Douglas como parte da sua tese de doutorado “Interação Homem-Computador”. ',
		            'OXO, também conhecido como "Noughts and Crosses" (Zeros e Cruzes), ',
		            'é um jogo da velha de computador feito para o computador EDSAC em 1952.',
		            'Já dentro dos quartéis, alguns militares aproveitavam o tédio para se divertir ',
		            ' e fazer alguma coisa nos computadores que só eles tinham. Surgiram alguns jogos, ',
		            'é verdade, mas eles eram analógicos e não podiam ser caracterizados como vídeo games ',
		            'porque ou não tinham gráficos, ou os que tinham não eram exibidos em um monitor, ',
		            'mas em um display vetorial.',
		            'O jogo na realidade trata-se nada mais nada menos do que o famoso ',
		            '“Jogo da Velha”, só que jogado em um computador com um controle de telefone analógico.',
		            'O esquema da jogatina é o mesmo desde sempre: posicione o “X” ou a “O” no lugar que ',
		            'você quer e feche uma linha com eles. Apesar da simplicidade e da aparente falta de ',
		            'emoção, o jogo chamava atenção justamente por representar muitíssimo bem a “Interação ',
		            'Homem-Computador”, coisa que pouca gente conhecia fora das universidades e recantos ',
		            'militares.',
		            'Apesar de brilhante, OXO não se popularizou porque só funcionava no computador  em  que ',
		            'foi desenvolvido – o EDSAC – e ele era o único no mundo! Mesmo não tendo ganhado nem  ',
		            'um centavo com o jogo, Alexander Shafto Douglas ganhou seu título de doutor e OXO foi considerado o ',
		            'primeiro vídeo game do mundo!'
		        ].join(''),
		        'thumbnail': 'oxo.jpg',
		        'main_img': {'name': '1952-OXO.png', 'caption': "Emulaçao do OXO"},
		        'images': [
		            {'name': 'oxo.jpg', 'caption': "Digitalizaçao do OXO"},
		            {'name': 'edsac.jpg', 'caption': "Computador utilizado"}
		        ],
		        'video_gameplay': [
		            {'url': 'https://www.youtube.com/watch?v=Pkiwn7u8i8s', 'caption': "Gameplay do jogo OXO", 'type': "youtube"} // type: youtube or vimeo
		        ],
		        'references': [
		            {'url': 'http://en.wikipedia.org/wiki/OXO', 'caption': "Game history"},
		            {'url': 'http://contembits.com.br/historia/jogos/1952-OXO.aspx', 'caption': "História dos jogos eletrônicos"},
		            {'url': 'http://www.nintendoblast.com.br/2010/01/historia-dos-video-games-1-o-comeco-de.html', 'caption': "O começo dos vídeos games"},
		            {'url': 'http://www.muitointeressante.com.br/tags/oxo', 'caption': "História do oxo"}
		        ]
			},
			{
		        'type': 'game', // game or console
		        'name': 'Tennis For Two',
		        'authors': ['William Higinbotham'],
		        'company': ['Brookhaven National Laboratory'],
		        'year': '1958',
		        'date': '18-10-1958', // Day, Month, Year
		        'headline': 'Um dos primeiros jogos eletrônicos a usar um display gráfico',
		        'resume': [
		            'Tennis for Two é frequentemente considerado como um dos ',
		            'primeiros jogos já criados. Desenvolvido por William ',
		            'Higginbotham, um físico que trabalhou no Projeto Manhattan, ',
		            'Tennis for Two foi completado em 18 de Outubro de 1958, ',
		            'muito antes de os primeiros jogos serem comercializados.'
		        ].join(''),
		        'full_text': [
		            'Tennis for Two é  considerado um dos primeiros jogos, ',
		            'já lançados, se não o primeiro. Está entre os primeiros ',
		            'jogos que contou com um display gráfico. Higginbotham ',
		            'criou o jogo em resposta ao "Dia de Exposições" no ',
		            'Laboratório Nacional de Brookhaven em Upton, Nova Iorque. ',
		            'De acordo com Higinbotham, o dia de exposições sempre era ',
		            'um tanto monótomo e entediante, e Tennis for Two foi criado ',
		            'em resposta a esse fato, para tornar o evento mais ',
		            'emocionante. Um dos computadores do exército era capaz de ',
		            'calcular a trajetória de mísseis balísticos, e ele usou ',
		            'essa tecnologia para desenvolver o jogo. Sem surpresa, o jogo ',
		            'foi um enorme sucesso entre os participantes e relatos sugerem ',
		            'que enormes filas foram formadas para jogar o simples, mas, ',
		            'no momento, inovador jogo. Mesmo que Higginbotham tivesse ',
		            'percebido que tinha desenvolvido algo original, ele nunca patenteou ',
		            'a ideia devido ao fato de que o governo dos Estados Unidos ',
		            'teria tomado posse dela("Mas se eu tivesse percebido o ',
		            'quão significativo havia sido, eu teria patenteado ',
		            'e seria posse do governo dos EUA!" -Higginbotham). ',
		            'Durante dois anos, o jogo foi desenvolvido, até que fosse ',
		            'infelizmente, descontinuado.'
		        ].join(''),
		        'thumbnail': 'thumbnail_example.png',
		        'main_img': {'name': 'main_picture.png', 'caption': "description"},
		        'images': [
		            {'name': 'picture1.png', 'caption': "description1"},
		            {'name': 'picture2.png', 'caption': "description2"},
		            {'name': 'picture3.png', 'caption': "description3"}
		        ],
		        'video_gameplay': [
		            {'url': 'http://www.youtu.be/s2E9iSQfGdg', 'caption': "Tennis For Two - The second ever computer game"} // type: youtube or vimeo
		        ],
		        'demos': [],
		        'references': [
		            {'url': 'http://videogamehistory.wikia.com/wiki/Tennis_for_Two', 'caption': "Video Game History Wiki"},
		            {'url': 'http://www.youtube.com/watch?v=6QSHZ20MQfE', 'caption': "When Games Went Click: The Story of Tennis for Two"},
		            {'url': 'http://www.bnl.gov/bnlweb/history/higinbotham.asp', 'caption': "When Games Went Click: The Story of Tennis for Two"}
		        ]
			}
		]
	}

	if (!window._content) {
		_content = {};
	}

	window._content[content_key] = content;

})()

<commit_msg>Update games_1950.js<commit_after>

(function(){

	var content_key = 'games_1950';
	var content = {};

	content = {

		'decade': '1950',
		'games': [
			{
		        'type': 'game', // game or console
		        'name': 'NIMROD',
		        'authors': ['Edward Uhler Condon'],
		        'company': ['Ferranti'],
		        'year': '1951',
		        'date': '05-05-1951', // Day, Month, Year
		        'headline': 'First Electronic Game',
		        'resume': [
		            'Usando um painel de luzes para a sua exibição, ',
					'ele foi projetado exclusivamente para jogar o jogo de Nim. ',
					'Este foi o primeiro exemplo de um computador digital projetado ',
					'especificamente para jogar um jogo. ',
					'O criador do NIMATRON foi Edward Uhler Condon.',
					'A ideia do jogo era simples e já existia fora do mundo',
					'tecnológico. O NIMROD usava painéis de luzes para simular',
					'as peças usadas no já conhecido jogo Nim'
		        ].join(''),
		 		'full_text': [
		            'Em 5 de maio de 1951, o computador NIMROD, criado pela Ferranti, ',
					'foi apresentado no Festival da Grã-Bretanha. ',
		            'A empresa era focada em segurança eletrônica e em seu tempo livre',
		            'Edward Uhler Condon utilizou a ferramentas disponíveis e criou ',
		            'o NIMATRON cujo foco era simular o jogo antigo NIM, antes jogado com pedras. ',
		            'As pedras foram trocadas por um painel com luzes e o controle era um totem. ',
		            'O objetivo do jogo era deixar o adversário, nesse caso o computador, ',
					'com a última peça. O jogador poderia remover quantas peças quisesse ',
					'de uma linha, por vez. Só que em 90% das vezes o computador vencia.',
					'O jogo fez um sucesso enorme nas feiras em que foi exposto, fazendo',
					'com que muitas pessoas se aventurassem a jogá-lo. Em algumas exposições,',
					'até pessoas importantes como embaixadores jogaram o jogo.',
					'Em Berlim, as pessoas esquecerma da cerveja que estava sendo distribuída',
					'gratuitamente no local para concentrar a atenção na exposição do jogo'
		        ].join(''),
		        'thumbnail': 'thumbnail_example.png',
		        'main_img': {'name': 'main.png', 'caption': "description"},
		        'images': [
		            {'name': 'img1.png', 'caption': "Máquina completa"},
		            {'name': 'img2.png', 'caption': "Apresentação do jogo feita no Festival da Grã-Bretanha"},
		            {'name': 'img3.png', 'caption': "Painel de jogo"}
		        ],
		        'video_gameplay': [
		            {'url': 'http://www.youtu.be/yJZlozoQ4jI', 'caption': "Gameplay Nimrod", 'type': "youtube"} // type: youtube or vimeo
		        ],
		        'demos': [
		            {'url': 'http://www.archimedes-lab.org/game_nim/play_nim_game.html', 'caption': "Jogar agora"}
		        ],
		        'references': [
		        	{'url': 'http://pt.slideshare.net/gabrielalonso927/nim-first-videogame', 'caption': "Introdução aos Jogos Eletrônicos (UEA) - Slides", 'type': 'slides'},
		            {'url': 'http://en.wikipedia.org/wiki/Nimrod_(computing)', 'caption': "Wikipédia"},
		            {'url': 'http://www.historyofinformation.com/expanded.php?id=4471', 'caption': "History of Information"}
		        ]
			},
			{
				'type': 'game',
		        'name': 'OxO - Naughts and Crosses',
		        'image_dir': 'oxo',
		        'authors': ['Alexander Shafto Douglas'],
		        'year': '1952',
		        'headline': 'OxO - O primeiro jogo digital.',
		        'resume': [
		            'Foi em 1952 que surgiu o primeiro vídeo game, do jeito que deve ser, ',
		            'gráficos digitais exibidos em um monitor de tubo de raios catódicos., ',
		            'OXO, Noughts and Crosses foi desenvolvido por Alexander Shafto Douglas, ',
		            'como parte da sua tese de doutorado Interação Homem-Computador, ',
		            'O jogo tinha como controles um telefone analógico, onde cada número',
		            'discado representava o quadro onde seria feito o movimento. ',
		            'Apesar da simplicidade e da aparente falta de emoção',
		            'o jogo chamava atenção por representar bem a “Interação Homem-Computador”. ',
		            'Apesar de brilhante, OXO não se popularizou porque só funcionava ',
		            'no computador em que foi desenvolvido – o EDSAC – e ele era o único no mundo!',
		            'A.S Douglas ganhou seu título de doutor e OXO foi considerado o primeiro vídeo game'
		        ].join(''),
		        'full_text': [
		            'Somente em 1952 foi que surgiu o primeiro vídeo game, do jeito que deve ser - gráficos digitais',
		            'exibidos em um monitor de tubo de raios catódicos. OXO, Noughts and Crosses foi desenvolvido',
		            'por Alexander Shafto Douglas como parte da sua tese de doutorado “Interação Homem-Computador”. ',
		            'OXO, também conhecido como "Noughts and Crosses" (Zeros e Cruzes), ',
		            'é um jogo da velha de computador feito para o computador EDSAC em 1952.',
		            'Já dentro dos quartéis, alguns militares aproveitavam o tédio para se divertir ',
		            ' e fazer alguma coisa nos computadores que só eles tinham. Surgiram alguns jogos, ',
		            'é verdade, mas eles eram analógicos e não podiam ser caracterizados como vídeo games ',
		            'porque ou não tinham gráficos, ou os que tinham não eram exibidos em um monitor, ',
		            'mas em um display vetorial.',
		            'O jogo na realidade trata-se nada mais nada menos do que o famoso ',
		            '“Jogo da Velha”, só que jogado em um computador com um controle de telefone analógico.',
		            'O esquema da jogatina é o mesmo desde sempre: posicione o “X” ou a “O” no lugar que ',
		            'você quer e feche uma linha com eles. Apesar da simplicidade e da aparente falta de ',
		            'emoção, o jogo chamava atenção justamente por representar muitíssimo bem a “Interação ',
		            'Homem-Computador”, coisa que pouca gente conhecia fora das universidades e recantos ',
		            'militares.',
		            'Apesar de brilhante, OXO não se popularizou porque só funcionava no computador  em  que ',
		            'foi desenvolvido – o EDSAC – e ele era o único no mundo! Mesmo não tendo ganhado nem  ',
		            'um centavo com o jogo, Alexander Shafto Douglas ganhou seu título de doutor e OXO foi considerado o ',
		            'primeiro vídeo game do mundo!'
		        ].join(''),
		        'thumbnail': 'oxo.jpg',
		        'main_img': {'name': '1952-OXO.png', 'caption': "Emulaçao do OXO"},
		        'images': [
		            {'name': 'oxo.jpg', 'caption': "Digitalizaçao do OXO"},
		            {'name': 'edsac.jpg', 'caption': "Computador utilizado"}
		        ],
		        'video_gameplay': [
		            {'url': 'https://www.youtube.com/watch?v=Pkiwn7u8i8s', 'caption': "Gameplay do jogo OXO", 'type': "youtube"} // type: youtube or vimeo
		        ],
		        'references': [
		            {'url': 'http://en.wikipedia.org/wiki/OXO', 'caption': "Game history"},
		            {'url': 'http://contembits.com.br/historia/jogos/1952-OXO.aspx', 'caption': "História dos jogos eletrônicos"},
		            {'url': 'http://www.nintendoblast.com.br/2010/01/historia-dos-video-games-1-o-comeco-de.html', 'caption': "O começo dos vídeos games"},
		            {'url': 'http://www.muitointeressante.com.br/tags/oxo', 'caption': "História do oxo"}
		        ]
			},
			{
		        'type': 'game', // game or console
		        'name': 'Tennis For Two',
		        'authors': ['William Higinbotham'],
		        'company': ['Brookhaven National Laboratory'],
		        'year': '1958',
		        'date': '18-10-1958', // Day, Month, Year
		        'headline': 'Um dos primeiros jogos eletrônicos a usar um display gráfico',
		        'resume': [
		            'Tennis for Two é frequentemente considerado como um dos ',
		            'primeiros jogos já criados. Desenvolvido por William ',
		            'Higginbotham, um físico que trabalhou no Projeto Manhattan, ',
		            'Tennis for Two foi completado em 18 de Outubro de 1958, ',
		            'muito antes de os primeiros jogos serem comercializados.'
		        ].join(''),
		        'full_text': [
		            'Tennis for Two é  considerado um dos primeiros jogos, ',
		            'já lançados, se não o primeiro. Está entre os primeiros ',
		            'jogos que contou com um display gráfico. Higginbotham ',
		            'criou o jogo em resposta ao "Dia de Exposições" no ',
		            'Laboratório Nacional de Brookhaven em Upton, Nova Iorque. ',
		            'De acordo com Higinbotham, o dia de exposições sempre era ',
		            'um tanto monótomo e entediante, e Tennis for Two foi criado ',
		            'em resposta a esse fato, para tornar o evento mais ',
		            'emocionante. Um dos computadores do exército era capaz de ',
		            'calcular a trajetória de mísseis balísticos, e ele usou ',
		            'essa tecnologia para desenvolver o jogo. Sem surpresa, o jogo ',
		            'foi um enorme sucesso entre os participantes e relatos sugerem ',
		            'que enormes filas foram formadas para jogar o simples, mas, ',
		            'no momento, inovador jogo. Mesmo que Higginbotham tivesse ',
		            'percebido que tinha desenvolvido algo original, ele nunca patenteou ',
		            'a ideia devido ao fato de que o governo dos Estados Unidos ',
		            'teria tomado posse dela("Mas se eu tivesse percebido o ',
		            'quão significativo havia sido, eu teria patenteado ',
		            'e seria posse do governo dos EUA!" -Higginbotham). ',
		            'Durante dois anos, o jogo foi desenvolvido, até que fosse ',
		            'infelizmente, descontinuado.'
		        ].join(''),
		        'thumbnail': 'thumbnail_example.png',
		        'main_img': {'name': 'main_picture.png', 'caption': "Imagem Principal"},
		        'images': [
		            {'name': 'picture1.png', 'caption': "Plataforma"},
		            {'name': 'picture2.png', 'caption': "Joysticks"},
		            {'name': 'picture3.png', 'caption': "Criador: William Higinbotham"}
		        ],
		        'video_gameplay': [
		            {'url': 'http://www.youtu.be/s2E9iSQfGdg', 'caption': "Tennis For Two - The second ever computer game"} // type: youtube or vimeo
		        ],
		        'demos': [],
		        'references': [
		            {'url': 'http://videogamehistory.wikia.com/wiki/Tennis_for_Two', 'caption': "Video Game History Wiki"},
		            {'url': 'http://www.youtube.com/watch?v=6QSHZ20MQfE', 'caption': "When Games Went Click: The Story of Tennis for Two"},
		            {'url': 'http://www.bnl.gov/bnlweb/history/higinbotham.asp', 'caption': "When Games Went Click: The Story of Tennis for Two"}
		        ]
			}
		]
	}

	if (!window._content) {
		_content = {};
	}

	window._content[content_key] = content;

})()

<|endoftext|>


<commit_before>$(function() {
    var loadList = function($element, contentCreator, itemCreator) {
        var deferred = new $.Deferred();
        $.ajax({
            url: $element.attr('data-url'),
            dataType: 'jsonp',
        }).done(function(json) {
            if (json.length == 0) return;

            var start = parseInt($element.attr('data-start'));
            if (!start) start = 1;
            var count = parseInt($element.attr('data-count'));
            if (!count) count = json.length;

            var first = Math.max(0, start - 1);
            var last = Math.min(json.length, first + count)
            var $container = contentCreator($element.find('.gw4e-content').html(''));
            for(var i=first; i<last; i++) {
                $item = itemCreator($container, json[i], i + 1);
            }
            $element.find('.gw4e-content').removeClass('hidden');
            deferred.resolve();
        });
        return deferred;
    };

    var loadCarousel = function($element, contentCreator, itemCreator) {
        loadList($element, contentCreator, itemCreator).then(function() {
            // Evita la configuració de genweb4 border-radius: 0px
            $element.find('a.carousel-control').attr('style', 'border-radius: 25px !important');
            var interval = $element.attr('data-interval');
            $element.find('.carousel').carousel({ interval: interval ? interval * 1000 : interval = false });
        });
    };

    var ratioToHeightPercent = function(ratio) {
        var x = 16, y = 9;
        var values = ratio.split(':');
        if (values.length == 2 && values[0] > 0 && values[1] > 0) {
            x = values[0];
            y = values[1];
        }
        return (100.0 * y) / x;
    };

    // Atributs HTML
    //   - data-selector: Selector CSS dels elements a ocultar.
    jQuery.fn.gw4eRemoveElement = function() {
        var $this = $(this);
        var selector = $this.attr('data-selector');
        $(selector).addClass('hidden');
        return this;
    };

    // Atributs HTML
    //   - data-url: Adreça URL de l'iframe
    jQuery.fn.gw4eIframe = function() {
        var $this = $(this);
        var $container = $this.find('.gw4e-content').html('');
        var $iframe = $('Hola')
            .attr('src', $this.attr('data-url'));
        $container.append($iframe);
        $.getScript('https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/3.5.5/iframeResizer.min.js').done(function() {
            $iframe.iFrameResize([{}]);
            $container.removeClass('hidden');
        });
        return this;
    };

    // Atributs HTML
    //   - data-url: Vídeo url
    //   - data-ratio: Ratio del vídeo (default=16:9)
    jQuery.fn.gw4eYoutube = function() {
        var $this = $(this);
        var id = $this.attr('data-id');
        var ratio = $this.attr('data-ratio');
        ratio = ratio ? ratio : '16:9';

        var options = 'autoplay=1&autohide=1&rel=0&controls=1&iv_load_policy=3&modestbranding=1&showinfo=0';
        var wrapperCss = 'position:relative;padding-bottom:' + ratioToHeightPercent(ratio) + '%;height:0;';
        var videoCss  = 'position:absolute;top:0;left:0;width:100%;height:100%;';
        var url = '//www.youtube.com/embed/' + id + '?' + options;
        var $container = $this.find('.gw4e-content').html('');
        var $video = $('

');
        $container.append($video);
        $container.removeClass('hidden');
        return this;
    };

    // Atributs HTML
    //   - data-url: Vídeo url
    //   - data-ratio: Ratio del vídeo (default=16:9)
    jQuery.fn.gw4eVideo = function() {
        var $this = $(this);
        var url = $this.attr('data-url');
        var ratio = $this.attr('data-ratio');
        ratio = ratio ? ratio : '16:9';

        var $video = $('<video style="width:100%;height:' + ratioToHeightPercent(ratio) + '%" src="' + url + '" controls autoplay></video>');
        var $container = $this.find('.gw4e-content').html('');
        $container.append($video);
        $container.removeClass('hidden');
        return this;
    };

    // Atributs HTML
    //   - data-url: Data source url (jsonp format)
    //   - data-start: Primer element a mostrar (default=1)
    //   - data-count: Número d'elements a mostrar (default=all)
    //   - data-interval: Segons entre imatges.
    jQuery.fn.gw4eCarousel = function() {
        var $this = $(this);
        var contentCreator = function ($container) {
            var id = $('

').uniqueId().attr('id');
            var $content = $(
                '
' +
                    '

' +
                    '‹' +
                    '›' +
                '
'
            );
            $container.append($content);
            return $content;
        };
        var itemCreator = function ($container, json, position) {
           var $content = $(
               '
' +
                   '' +
                   '

' +
               '
'
           );
           if (position == 1) {
               $content.addClass('active');
           }
           $content.find('a').attr('href', json.urlResum);
           $content.find('a').attr('title', json.titol);
           $content.find('img').attr('src', json.urlFoto);
           $content.find('img').attr('alt', json.titol);
           $content.find('img').attr('title', json.titol);
           $content.find('h3').html(json.titol);
           $content.find('h4').html(json.autor);
           $container.find('.carousel-inner').append($content);
           return $content;
       };
       loadCarousel($this, contentCreator, itemCreator);
    };

    // Atributs HTML
    //   - data-url: Data source url (jsonp format)
    //   - data-start: Primer element a mostrar (default=1)
    //   - data-count: Número d'elements a mostrar (default=all)
    jQuery.fn.gw4eActualitat = function() {
        var $this = $(this);

        var contentCreator = function ($element) {
            $content = $('

');
            $element.append($content);
            return $content;
        };
        var itemCreator = function ($element, json, position) {
            $content = $('

');
            $content.find('a')
                .attr('href', json.url)
                .attr('title', json.titol)
                .prepend(json.titol + ' ')
                .click(function(event) {
                    event.preventDefault();
                    window.open($(this).attr('href'), '_blank', 'width=800,height=600,scrollbars=yes');
                });
            $element.append($content);
            return $content;
        };

        loadList($this, contentCreator, itemCreator);
        return this;
    };

    // Atributs HTML
    //   - data-url: Data source url (jsonp format)
    //   - data-start: Primer element a mostrar (default=1)
    //   - data-count: Número d'elements a mostrar (default=all)
    jQuery.fn.gw4eActualitatLarge = function() {
        var $this = $(this);

        var contentCreator = function ($element) {
            $content = $('
');
            $element.append($content);
            return $content;
        };
        var itemCreator = function ($element, json, position) {
            $content = $('

');
            $first = $content.children().first();
            $second = $content.children().last();
            if (json.imatge) {
                $first.addClass('span3');
                $first.find('a')
                    .attr('href', json.url)
                    .attr('title', json.titol);
                $first.find('img')
                    .attr('src', json.imatge.src)
                    .attr('alt', json.imatge.alt);
                $second.addClass('span9');
            }
            else {
                $first.remove();
                $second.addClass('span12');
            }
            $second.find('h3 a')
                .attr('href', json.url)
                .attr('title', json.titol)
                .html(json.titol);
            $second.find('h3').after(json.resum);
            $element.append($content);
            return $content;
        };

        loadList($this, contentCreator, itemCreator);
        return this;
    };

    // Atributs HTML
    //   - data-url: Data source url (jsonp format)
    //   - data-start: Primer element a mostrar (default=1)
    //   - data-count: Número d'elements a mostrar (default=all)
    //   - data-attribute: Nom del camp que cal mostrar
    jQuery.fn.gw4eList = function() {
        var $this = $(this);

        var contentCreator = function ($element) {
            var $container = $this.find('.gw4e-content').html('');
            return $container;
        };
        var itemCreator = function ($element, json, position) {
            var attribute = $this.attr('data-attribute');
            $content = $('
' + json[attribute] + '
');
            $element.append($content);
            return $content;
        };

        loadList($this, contentCreator, itemCreator);
        return this;
    };

    $('div.gw4e-iframe').each(function(index, element) {
        $(element).gw4eIframe();
    });

    $('div.gw4e-remove-element').each(function(index, element) {
        $(element).gw4eRemoveElement();
    });

    $('div.gw4e-carousel').each(function(index, element) {
        $(element).gw4eCarousel();
    });

    $('div.gw4e-youtube').each(function(index, element) {
        $(element).gw4eYoutube();
    });

    $('div.gw4e-video').each(function(index, element) {
        $(element).gw4eVideo();
    });

    $('div.gw4e-list').each(function(index, element) {
        $(element).gw4eList();
    });

    $('div.gw4e-actualitat').each(function(index, element) {
        $(element).gw4eActualitat();
    });

    $('div.gw4e-actualitat-large').each(function(index, element) {
        $(element).gw4eActualitatLarge();
    });
});
<commit_msg>Afegir la possibilitat de treballar amb templates a les llistes<commit_after>$(function() {
    $.compact = function(object) {
        var recursive = function(object, prefix) {
            result = {};
            for (key in object) {
                value = object[key];
                if (typeof value === 'object')
                    result = $.extend(result, recursive(value, prefix + key + '.'));
                else
                    result[prefix + key] = value;
            }
            return result;
        }
        return recursive(object, '');
    }

    var loadList = function($element, $container, template) {
        var deferred = new $.Deferred();
        deferred = deferred.done(function() {
            $element.find('.gw4e-content').html($container).removeClass('hidden');
        });

        var type = $element.attr('data-type');
        if (!type) type = 'json';

        $.ajax({
            url: $element.attr('data-url'),
            dataType: type,
        }).done(function(json) {
            var start = parseInt($element.attr('data-start'));
            if (!start) start = 1;
            var count = parseInt($element.attr('data-count'));
            if (!count) count = json.length;

            var first = Math.max(0, start - 1);
            var last = Math.min(json.length, first + count)
            for(var i=first; i<last; i++) {
                var tags = $.compact(json[i]);
                var $item = template(json[i], i);
                var html = $item.html();
                $.each(Object.keys(tags), function(index, value) {
                    var re = new RegExp('\\$\\{' + value + '\\}', 'g');
                    html = html.replace(re, tags[value]);
                });
                $container.append($item.html(html));
            }
            if (first >= last) $container.html($element.attr('data-no-items'));
            return deferred.resolve();
        }).fail(function() {
            return deferred.reject();
        });
        return deferred;
    };

    var ratioToHeightPercent = function(ratio) {
        var x = 16, y = 9;
        var values = ratio.split(':');
        if (values.length == 2 && values[0] > 0 && values[1] > 0) {
            x = values[0];
            y = values[1];
        }
        return (100.0 * y) / x;
    };

    // Atributs HTML
    //   - data-selector: Selector CSS dels elements a ocultar.
    jQuery.fn.gw4eRemoveElement = function() {
        var $this = $(this);
        var selector = $this.attr('data-selector');
        $(selector).addClass('hidden');
        return this;
    };

    // Atributs HTML
    //   - data-url: Adreça URL de l'iframe
    jQuery.fn.gw4eIframe = function() {
        var $this = $(this);
        var $container = $this.find('.gw4e-content').html('');
        var $iframe = $('Hola')
            .attr('src', $this.attr('data-url'));
        $container.append($iframe);
        $.getScript('https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/3.5.5/iframeResizer.min.js').done(function() {
            $iframe.iFrameResize([{}]);
            $container.removeClass('hidden');
        });
        return this;
    };

    // Atributs HTML
    //   - data-url: Vídeo url
    //   - data-ratio: Ratio del vídeo (default=16:9)
    jQuery.fn.gw4eYoutube = function() {
        var $this = $(this);
        var id = $this.attr('data-id');
        var ratio = $this.attr('data-ratio');
        ratio = ratio ? ratio : '16:9';

        var options = 'autoplay=1&autohide=1&rel=0&controls=1&iv_load_policy=3&modestbranding=1&showinfo=0';
        var wrapperCss = 'position:relative;padding-bottom:' + ratioToHeightPercent(ratio) + '%;height:0;';
        var videoCss  = 'position:absolute;top:0;left:0;width:100%;height:100%;';
        var url = '//www.youtube.com/embed/' + id + '?' + options;
        var $container = $this.find('.gw4e-content').html('');
        var $video = $('

');
        $container.append($video);
        $container.removeClass('hidden');
        return this;
    };

    // Atributs HTML
    //   - data-url: Vídeo url
    //   - data-ratio: Ratio del vídeo (default=16:9)
    jQuery.fn.gw4eVideo = function() {
        var $this = $(this);
        var url = $this.attr('data-url');
        var ratio = $this.attr('data-ratio');
        ratio = ratio ? ratio : '16:9';

        var $video = $('<video style="width:100%;height:' + ratioToHeightPercent(ratio) + '%" src="' + url + '" controls autoplay></video>');
        var $container = $this.find('.gw4e-content').html('');
        $container.append($video);
        $container.removeClass('hidden');
        return this;
    };

    // Atributs HTML
    //   - data-url: Data source url (jsonp format)
    //   - data-type: [json|jsonp] (default=json)
    //   - data-start: Primer element a mostrar (default=1)
    //   - data-count: Número d'elements a mostrar (default=all)
    //   - data-interval: Segons entre imatges.
    jQuery.fn.gw4eCarousel = function() {
        var $this = $(this);
        var id = $('

').uniqueId().attr('id');
        var $container = $('
' +
                             '

' +
                             '‹' +
                             '›' +
                           '
');
        var template = function(json, position) {
           var $item = $('
' +
                             '' +
                             '

${titol}

${autor}

' +
                           '
');
           if (position == 0) $item.addClass('active');
           return $item;
       };
       $this.html($container);
       loadList($this, $container.find('.carousel-inner'), template).done(function() {
           // Evita la configuració de genweb4 border-radius: 0px
           $this.find('a.carousel-control').attr('style', 'border-radius: 25px !important');
           var interval = $this.attr('data-interval');
           $this.find('.carousel').carousel({ interval: interval ? interval * 1000 : interval = false });
       });
       return this;
    };

    // Atributs HTML
    //   - data-url: Data source url (jsonp format)
    //   - data-type: [json|jsonp] (default=json)
    //   - data-start: Primer element a mostrar (default=1)
    //   - data-count: Número d'elements a mostrar (default=all)
    //   - data-no-items: Text en cas que no hi hagi elements mostrar. (default="")
    jQuery.fn.gw4eActualitat = function() {
        var $this = $(this);

        var $container = $('

');
        var template = function(json, position) {
            var $item = $('
${titol}
');
            $item.find('a').click(function(event) {
                event.preventDefault();
                window.open($(this).attr('href'), '_blank', 'width=800,height=600,scrollbars=yes');
            });
            return $item;
        };
        loadList($this, $container, template);
        return this;
    };

    // Atributs HTML
    //   - data-url: Data source url (jsonp format)
    //   - data-type: [json|jsonp] (default=json)
    //   - data-start: Primer element a mostrar (default=1)
    //   - data-count: Número d'elements a mostrar (default=all)
    //   - data-no-items: Text en cas que no hi hagi elements mostrar. (default="")
    jQuery.fn.gw4eActualitatLarge = function() {
        var $this = $(this);

        var $container = $('

');
        var template = function(json, position) {
            var first = '';
            var second = '
${titol}
${resum}
';
            if (json.imatge)
                return $('

' + first + '

' + second + '

');
            else
                return $('

' + second + '

');
        };
        loadList($this, $container, template);
        return this;
    };

    // Atributs HTML
    //   - data-url: Data source url (jsonp format)
    //   - data-item-template: Plantilla de l'item. Es poden utilitzar els tags ${nom-atribut}
    //   - data-no-items: Text en cas que no hi hagi elements mostrar. (default="")
    //   - data-type: [json|jsonp] (default=json)
    //   - data-start: Primer element a mostrar (default=1)
    //   - data-count: Número d'elements a mostrar (default=all)
    jQuery.fn.gw4eList = function() {
        var $this = $(this);
        var $container = $('

');
        var template = function(json, position) { return $($this.attr('data-item-template')); };
        loadList($this, $container, template);
        return $this;
    };

    $('div.gw4e-iframe').each(function(index, element) {
        $(element).gw4eIframe();
    });

    $('div.gw4e-remove-element').each(function(index, element) {
        $(element).gw4eRemoveElement();
    });

    $('div.gw4e-carousel').each(function(index, element) {
        $(element).gw4eCarousel();
    });

    $('div.gw4e-youtube').each(function(index, element) {
        $(element).gw4eYoutube();
    });

    $('div.gw4e-video').each(function(index, element) {
        $(element).gw4eVideo();
    });

    $('div.gw4e-list').each(function(index, element) {
        $(element).gw4eList();
    });

    $('div.gw4e-actualitat').each(function(index, element) {
        $(element).gw4eActualitat();
    });

    $('div.gw4e-actualitat-large').each(function(index, element) {
        $(element).gw4eActualitatLarge();
    });
});
<|endoftext|>


<commit_before>var pictureSource; // picture source
var destinationType; // sets the format of returned value
var pKey, currElement;
var picContainer = {};

var pictureFiles = new Array();

// Wait for device API libraries to load
document.addEventListener("deviceready",onDeviceReady,false);

// device APIs are available
function onDeviceReady() {
    pictureSource=navigator.camera.PictureSourceType;
    destinationType=navigator.camera.DestinationType;
}

/**************************************************************
	BILDAUFNAHME STARTEN
***************************************************************/
function captureImage(matchcode) {
    // Launch device camera application,
    // allowing user to capture up to 2 images
		currElement = matchcode;
    navigator.device.capture.captureImage(captureSuccess, captureError,{limit: 1});
}

/**************************************************************
	BILDAUFNAHME ERFOLGREICH
***************************************************************/
function captureSuccess(mediaFiles) {

		var picData = {};
		var lastDateID = 0;
		var lastDate = 0;

		for (i = 0, len = mediaFiles.length; i < len; i += 1) {
				if (mediaFiles[i].lastModifiedDate > lastDate) {
					lastDateID = i;
					lastDate = mediaFiles[i].lastModifiedDate;
				}
		}

		picData.fullPath = mediaFiles[i].fullPath;
		picData.name = mediaFiles[i].name;
		picData.type = mediaFiles[i].type;
		picData.lastModified = mediaFiles[i].lastModifiedDate;
		picData.size = mediaFiles[i].size;

		savePic(picData);

}

/**************************************************************
	FEHLER BEI DER BILDAUFNAHME
***************************************************************/
function captureError(error) {
    var msg = 'Fehler bei der Aufnahme: ' + error.code;
    navigator.notification.alert(msg, null, 'Uh oh!');
}

/**************************************************************
	AKTUELLES BILD IM LOCAL-STORAGE SPEICHERN
***************************************************************/
function savePic(picData) {

		pKey = 'p_' + localStorage.getItem("fe_user");

		if (!localStorage.getItem(pKey)) {
			// kein Report vorhanden - Basis eintrag machen

			picElement = getLastPic(mediaFiles);

			picContainer.reports = [];

			Report = {};
			Report.matchcode = currElement;
			Report.uid = 0;
			Report.pics = [];
			Report.pics.push(picData);
			Report.complete = 0;

			picContainer.reports.push(Report);

		} else {
			// wenn bereits ein Eintrag vorhanden ist

			picContainer = JSON.parse(localStorage.getItem(pKey));
			curI = -1;
			for (i = 0; i < picContainer.reports.length; i++) {
				if (picContainer.reports[i].matchcode == currElement) {
					curI = i;
				}
			}

			if (curI > -1) {
				// letzten Report gefunden
				picContainer.reports[i].pics.push(picData);
			} else {
				// keine entsprechende Report gefunden -> diesen Anlegen
				Report = {};
				Report.matchcode = currElement;
				Report.uid = 0;
				Report.pics = [];
				Report.pics.push(picData);
				Report.complete = 0;
				picContainer.reports.push(Report);
			}

		}

		// Daten wieder in den LocalStorage speichern
		localStorage.setItem(pKey, JSON.stringify(picContainer));

		// "{"reports":[{"type":"Vandalismus","police":"sdvdv","comment":"yxcvyxcv","fotos":null,"timestamp":"2014-01-27T13:04:50.807Z","lat":"","lng":"","acc":"","geoTimestamp":"","complete":0}]}"
		// "{"Wachdienst":[{"id":0,"uid":345,"checkString":[{"datetime":1390840881044,"checkpoint":1,"status":3},{"datetime":1390840908480,"checkpoint":1,"status":3}],"start":1390840816905,"fireProtection":0,"ende":1390840917694,"complete":0}]}"

		jQuery("#permaCheck").append('Foto: | ' + JSON.stringify(picContainer)      + '

');

    jQuery("p#"+currElement+"_pics").prepend("");

}

/**************************************************************
	BILDER AUF DEN SERVER LADEN
***************************************************************/
function uploadFiles(matchcode) {

    /*var j, leng;
    pLs = localStorage.getItem("pics_"+captureElement);

    mesLen = pictureFiles.length;

    for (j = 0, leng = pictureFiles.length; j < leng; j += 1) {
        uploadFile(pictureFiles[j]);
        jQuery("p#pics img:first-child").remove();
    }
    pictureFiles = [];

    if(mesLen>0) {
        setTimeout("alert(\"Es werden "+mesLen+" Bilder hochgeladen\")", 500);
    }*/
}
// Upload files to server
function uploadFile(mediaFile) {

    var ft = new FileTransfer(),
    path = mediaFile.fullPath,
    name = mediaFile.name;

    ft.upload(path,
        			imgUpload_url,
        			function(result) {
            			console.log('Upload success: ' + result.responseCode);
            			console.log(result.bytesSent + ' bytes sent');
        			},
							function(error) {
									console.log('Error uploading file ' + path + ': ' + error.code);
							},
							{
									fileName: name
							});
}

/**************************************************************
	SONSTIGES
***************************************************************/
function deleteImage(){
    jQuery("p#pics img:first-child").remove();
    pictureFiles.pop();
}

/**************************************************************
	????????
***************************************************************/
/*function getPhoto(source) {
    // Retrieve image file location from specified source
    navigator.camera.getPicture(onPhotoURISuccess, onFail, {
        quality: 50,
        destinationType: destinationType.FILE_URI,
        sourceType: source
    });
}

function onPhotoURISuccess(imageURI) {
    jQuery("p#pics").prepend("");
    pictureFiles.push(imageURI);
}

function captureSuccess(mediaFiles) {
    var i, len, pPath, pName, pLs;

    pLs = localStorage.getItem("pics_"+currCaptureElement);

    if (pLs == null) {
        pLs = "";
    }

    for (i = 0, len = mediaFiles.length; i < len; i += 1) {
        pPath = mediaFiles[i].fullPath;
        pName = mediaFiles[i].name;

        //pictureFiles.push(mediaFiles[i]);
        jQuery("p#pics").prepend("");

        localStorage.setItem("pics_"+currCaptureElement, pLs+pName+",");
    }
}
function onFail(message) {
  alert('Fehlgeschlagen: ' + message);
}*/
<commit_msg>Camera neu - Test<commit_after>var pictureSource; // picture source
var destinationType; // sets the format of returned value
var pKey, currElement;
var picContainer = {};

var pictureFiles = new Array();

// Wait for device API libraries to load
document.addEventListener("deviceready",onDeviceReady,false);

// device APIs are available
function onDeviceReady() {
    pictureSource=navigator.camera.PictureSourceType;
    destinationType=navigator.camera.DestinationType;
}

/**************************************************************
	BILDAUFNAHME STARTEN
***************************************************************/
function captureImage(matchcode) {
    // Launch device camera application,
    // allowing user to capture up to 2 images
		currElement = matchcode;
    navigator.device.capture.captureImage(captureSuccess, captureError,{limit: 1});
}

/**************************************************************
	BILDAUFNAHME ERFOLGREICH
***************************************************************/
function captureSuccess(mediaFiles) {

		jQuery("#permaCheck").append('Foto: | Capture successful

');

		var picData = {};
		var lastDateID = 0;
		var lastDate = 0;

		for (i = 0, len = mediaFiles.length; i < len; i += 1) {
				if (mediaFiles[i].lastModifiedDate > lastDate) {
					lastDateID = i;
					lastDate = mediaFiles[i].lastModifiedDate;
				}
		}

		picData.fullPath = mediaFiles[i].fullPath;
		picData.name = mediaFiles[i].name;
		picData.type = mediaFiles[i].type;
		picData.lastModified = mediaFiles[i].lastModifiedDate;
		picData.size = mediaFiles[i].size;

		savePic(picData);

}

/**************************************************************
	FEHLER BEI DER BILDAUFNAHME
***************************************************************/
function captureError(error) {
		jQuery("#permaCheck").append('Foto: | Capture error!

');
    var msg = 'Fehler bei der Aufnahme: ' + error.code;
    navigator.notification.alert(msg, null, 'Uh oh!');
}

/**************************************************************
	AKTUELLES BILD IM LOCAL-STORAGE SPEICHERN
***************************************************************/
function savePic(picData) {

		pKey = 'p_' + localStorage.getItem("fe_user");

		if (!localStorage.getItem(pKey)) {
			// kein Report vorhanden - Basis eintrag machen

			picElement = getLastPic(mediaFiles);

			picContainer.reports = [];

			Report = {};
			Report.matchcode = currElement;
			Report.uid = 0;
			Report.pics = [];
			Report.pics.push(picData);
			Report.complete = 0;

			picContainer.reports.push(Report);

		} else {
			// wenn bereits ein Eintrag vorhanden ist

			picContainer = JSON.parse(localStorage.getItem(pKey));
			curI = -1;
			for (i = 0; i < picContainer.reports.length; i++) {
				if (picContainer.reports[i].matchcode == currElement) {
					curI = i;
				}
			}

			if (curI > -1) {
				// letzten Report gefunden
				picContainer.reports[i].pics.push(picData);
			} else {
				// keine entsprechende Report gefunden -> diesen Anlegen
				Report = {};
				Report.matchcode = currElement;
				Report.uid = 0;
				Report.pics = [];
				Report.pics.push(picData);
				Report.complete = 0;
				picContainer.reports.push(Report);
			}

		}

		// Daten wieder in den LocalStorage speichern
		localStorage.setItem(pKey, JSON.stringify(picContainer));

		// "{"reports":[{"type":"Vandalismus","police":"sdvdv","comment":"yxcvyxcv","fotos":null,"timestamp":"2014-01-27T13:04:50.807Z","lat":"","lng":"","acc":"","geoTimestamp":"","complete":0}]}"
		// "{"Wachdienst":[{"id":0,"uid":345,"checkString":[{"datetime":1390840881044,"checkpoint":1,"status":3},{"datetime":1390840908480,"checkpoint":1,"status":3}],"start":1390840816905,"fireProtection":0,"ende":1390840917694,"complete":0}]}"

		jQuery("#permaCheck").append('Foto: | ' + JSON.stringify(picContainer)      + '

');

    jQuery("p#"+currElement+"_pics").prepend("");

}

/**************************************************************
	BILDER AUF DEN SERVER LADEN
***************************************************************/
function uploadFiles(matchcode) {

    /*var j, leng;
    pLs = localStorage.getItem("pics_"+captureElement);

    mesLen = pictureFiles.length;

    for (j = 0, leng = pictureFiles.length; j < leng; j += 1) {
        uploadFile(pictureFiles[j]);
        jQuery("p#pics img:first-child").remove();
    }
    pictureFiles = [];

    if(mesLen>0) {
        setTimeout("alert(\"Es werden "+mesLen+" Bilder hochgeladen\")", 500);
    }*/
}
// Upload files to server
function uploadFile(mediaFile) {

    var ft = new FileTransfer(),
    path = mediaFile.fullPath,
    name = mediaFile.name;

    ft.upload(path,
        			imgUpload_url,
        			function(result) {
            			console.log('Upload success: ' + result.responseCode);
            			console.log(result.bytesSent + ' bytes sent');
        			},
							function(error) {
									console.log('Error uploading file ' + path + ': ' + error.code);
							},
							{
									fileName: name
							});
}

/**************************************************************
	SONSTIGES
***************************************************************/
function deleteImage(){
    jQuery("p#pics img:first-child").remove();
    pictureFiles.pop();
}

/**************************************************************
	????????
***************************************************************/
/*function getPhoto(source) {
    // Retrieve image file location from specified source
    navigator.camera.getPicture(onPhotoURISuccess, onFail, {
        quality: 50,
        destinationType: destinationType.FILE_URI,
        sourceType: source
    });
}

function onPhotoURISuccess(imageURI) {
    jQuery("p#pics").prepend("");
    pictureFiles.push(imageURI);
}

function captureSuccess(mediaFiles) {
    var i, len, pPath, pName, pLs;

    pLs = localStorage.getItem("pics_"+currCaptureElement);

    if (pLs == null) {
        pLs = "";
    }

    for (i = 0, len = mediaFiles.length; i < len; i += 1) {
        pPath = mediaFiles[i].fullPath;
        pName = mediaFiles[i].name;

        //pictureFiles.push(mediaFiles[i]);
        jQuery("p#pics").prepend("");

        localStorage.setItem("pics_"+currCaptureElement, pLs+pName+",");
    }
}
function onFail(message) {
  alert('Fehlgeschlagen: ' + message);
}*/
<|endoftext|>