/* ========================================================= * composer-view.js v0.2.1 * ========================================================= * Copyright 2013 Wpbakery * * Visual composer backbone/underscore version * ========================================================= */ (function ( $ ) { var i18n = window.i18nLocale, store = vc.storage, Shortcodes = vc.shortcodes; vc.templateOptions = { default: { evaluate: /<%([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g, escape: /<%-([\s\S]+?)%>/g }, custom: { evaluate: /<#([\s\S]+?)#>/g, interpolate: /\{\{\{([\s\S]+?)\}\}\}/g, escape: /\{\{([^\}]+?)\}\}(?!\})/g } }; vc.builder = { toString: function ( model, type ) { var params = model.get( 'params' ), content = _.isString( params.content ) ? params.content : ''; return wp.shortcode.string( { tag: model.get( 'shortcode' ), attrs: _.omit( params, 'content' ), content: content, type: _.isString( type ) ? type : '' } ); } }; /** * Default view for shortcode as block inside Visual composer design mode. * @type {*} */ vc.clone_index = 1; vc.saved_custom_css = false; var ShortcodeView = vc.shortcode_view = Backbone.View.extend( { tagName: 'div', $content: '', use_default_content: false, params: {}, events: { 'click .column_delete,.vc_control-btn-delete': 'deleteShortcode', 'click .column_add,.vc_control-btn-prepend': 'addElement', 'click .column_edit,.vc_control-btn-edit, .column_edit_trigger': 'editElement', 'click .column_clone,.vc_control-btn-clone': 'clone', 'mousemove': 'checkControlsPosition' }, removeView: function () { vc.closeActivePanel( this.model ); this.remove(); }, checkControlsPosition: function () { if ( ! this.$controls_buttons ) { return; } var window_top, element_position_top, new_position, element_height = this.$el.height(), window_height = $( window ).height(); if ( element_height > window_height ) { window_top = $( window ).scrollTop(); element_position_top = this.$el.offset().top; new_position = (window_top - element_position_top) + $( window ).height() / 2; if ( 40 < new_position && new_position < element_height ) { this.$controls_buttons.css( 'top', new_position ); } else if ( new_position > element_height ) { this.$controls_buttons.css( 'top', element_height - 40 ); } else { this.$controls_buttons.css( 'top', 40 ); } } }, initialize: function () { this.model.bind( 'destroy', this.removeView, this ); this.model.bind( 'change:params', this.changeShortcodeParams, this ); this.model.bind( 'change_parent_id', this.changeShortcodeParent, this ); this.createParams(); }, hasUserAccess: function () { var shortcodeTag; shortcodeTag = this.model.get( 'shortcode' ); if ( - 1 < _.indexOf( [ "vc_row", "vc_column", "vc_row_inner", "vc_column_inner" ], shortcodeTag ) ) { return true; // we cannot block controls for these shortcodes; } if ( ! _.every( vc.roles.current_user, function ( role ) { return ! (! _.isUndefined( vc.roles[ role ] ) && ! _.isUndefined( vc.roles[ role ][ 'shortcodes' ] ) && _.isUndefined( vc.roles[ role ][ 'shortcodes' ][ shortcodeTag ] )); } ) ) { return false; } return true; }, createParams: function () { var tag, settings, params; tag = this.model.get( 'shortcode' ); settings = _.isObject( vc.map[ tag ] ) && _.isArray( vc.map[ tag ].params ) ? vc.map[ tag ].params : []; params = this.model.get( 'params' ); this.params = {}; _.each( settings, function ( param ) { this.params[ param.param_name ] = param; }, this ); }, setContent: function () { this.$content = this.$el.find( '> .wpb_element_wrapper > .vc_container_for_children,' + ' > .vc_element-wrapper > .vc_container_for_children' ); }, setEmpty: function () { }, unsetEmpty: function () { }, checkIsEmpty: function () { if ( this.model.get( 'parent_id' ) ) { vc.app.views[ this.model.get( 'parent_id' ) ].checkIsEmpty(); } }, /** * Convert html into correct element * @param html */ html2element: function ( html ) { var attributes = {}, $template; if ( _.isString( html ) ) { this.template = _.template( html ); $template = $( this.template( this.model.toJSON(), vc.templateOptions.default ).trim() ); } else { this.template = html; $template = html; } _.each( $template.get( 0 ).attributes, function ( attr ) { attributes[ attr.name ] = attr.value; } ); this.$el.attr( attributes ).html( $template.html() ); this.setContent(); this.renderContent(); }, render: function () { var $shortcode_template_el = $( '#vc_shortcode-template-' + this.model.get( 'shortcode' ) ); if ( $shortcode_template_el.is( 'script' ) ) { this.html2element( _.template( $shortcode_template_el.html(), this.model.toJSON(), vc.templateOptions.default ) ); } else { var params = this.model.get( 'params' ); $.ajax( { type: 'POST', url: window.ajaxurl, data: { action: 'wpb_get_element_backend_html', data_element: this.model.get( 'shortcode' ), data_width: _.isUndefined( params.width ) ? '1/1' : params.width, _vcnonce: window.vcAdminNonce }, dataType: 'html', context: this } ).done( function ( html ) { this.html2element( html ); } ); } this.model.view = this; this.$controls_buttons = this.$el.find( '.vc_controls > :first' ); return this; }, renderContent: function () { this.$el.attr( 'data-model-id', this.model.get( 'id' ) ); this.$el.data( 'model', this.model ); return this; }, changedContent: function ( view ) { }, _loadDefaults: function () { var tag, hasChilds; tag = this.model.get( 'shortcode' ); hasChilds = ! ! vc.shortcodes.where( { parent_id: this.model.get( 'id' ) } ).length; if ( ! hasChilds && true === this.use_default_content && _.isObject( vc.map[ tag ] ) && _.isString( vc.map[ tag ].default_content ) && vc.map[ tag ].default_content.length ) { this.use_default_content = false; Shortcodes.createFromString( vc.map[ tag ].default_content, this.model ); } }, _callJsCallback: function () { //Fire INIT callback if it is defined var tag = this.model.get( 'shortcode' ); if ( _.isObject( vc.map[ tag ] ) && _.isObject( vc.map[ tag ].js_callback ) && ! _.isUndefined( vc.map[ tag ].js_callback.init ) ) { var fn = vc.map[ tag ].js_callback.init; window[ fn ]( this.$el ); } }, ready: function ( e ) { this._loadDefaults(); this._callJsCallback(); if ( this.model.get( 'parent_id' ) && _.isObject( vc.app.views[ this.model.get( 'parent_id' ) ] ) ) { vc.app.views[ this.model.get( 'parent_id' ) ].changedContent( this ); } _.defer( _.bind( function () { vc.events.trigger( 'shortcodeView:ready' ); vc.events.trigger( 'shortcodeView:ready:' + this.model.get( 'shortcode' ) ); }, this ) ); return this; }, // View utils {{ addShortcode: function ( view, method ) { var before_shortcode; before_shortcode = _.last( vc.shortcodes.filter( function ( shortcode ) { return shortcode.get( 'parent_id' ) === this.get( 'parent_id' ) && parseFloat( shortcode.get( 'order' ) ) < parseFloat( this.get( 'order' ) ); }, view.model ) ); if ( before_shortcode ) { view.render().$el.insertAfter( '[data-model-id=' + before_shortcode.id + ']' ); } else if ( 'append' === method ) { this.$content.append( view.render().el ); } else { this.$content.prepend( view.render().el ); } }, changeShortcodeParams: function ( model ) { var tag, params, settings, view; // Triggered when shortcode being updated tag = model.get( 'shortcode' ); params = model.get( 'params' ); settings = vc.map[ tag ]; _.defer( function () { vc.events.trigger( 'backend.shortcodeViewChangeParams:' + tag ); } ); if ( _.isArray( settings.params ) ) { _.each( settings.params, function ( param_settings ) { var name, value, $wrapper, label_value, $admin_label; name = param_settings.param_name; value = params[ name ]; $wrapper = this.$el.find( '> .wpb_element_wrapper, > .vc_element-wrapper' ); label_value = value; $admin_label = $wrapper.children( '.admin_label_' + name ); if ( _.isObject( vc.atts[ param_settings.type ] ) && _.isFunction( vc.atts[ param_settings.type ].render ) ) { value = vc.atts[ param_settings.type ].render.call( this, param_settings, value ); } if ( $wrapper.children( '.' + param_settings.param_name ).is( 'input,textarea,select' ) ) { $wrapper.children( '[name=' + param_settings.param_name + ']' ).val( value ); } else if ( $wrapper.children( '.' + param_settings.param_name ).is( 'iframe' ) ) { $wrapper.children( '[name=' + param_settings.param_name + ']' ).attr( 'src', value ); } else if ( $wrapper.children( '.' + param_settings.param_name ).is( 'img' ) ) { var $img; $img = $wrapper.children( '[name=' + param_settings.param_name + ']' ); if ( value && value.match( /^\d+$/ ) ) { $.ajax( { type: 'POST', url: window.ajaxurl, data: { action: 'wpb_single_image_src', content: value, size: 'thumbnail', _vcnonce: window.vcAdminNonce }, dataType: 'html', context: this } ).done( function ( url ) { $img.attr( 'src', url ); } ); } else if ( value ) { $img.attr( 'src', value ); } } else { $wrapper.children( '[name=' + param_settings.param_name + ']' ).html( value ? value : '' ); } if ( $admin_label.length ) { var inverted_value; if ( '' === value || _.isUndefined( value ) ) { $admin_label.hide().addClass( 'hidden-label' ); } else { if ( _.isObject( param_settings.value ) && ! _.isArray( param_settings.value ) && 'checkbox' === param_settings.type ) { inverted_value = _.invert( param_settings.value ); label_value = _.map( value.split( /[\s]*\,[\s]*/ ), function ( val ) { return _.isString( inverted_value[ val ] ) ? inverted_value[ val ] : val; } ).join( ', ' ); } else if ( _.isObject( param_settings.value ) && ! _.isArray( param_settings.value ) ) { inverted_value = _.invert( param_settings.value ); label_value = _.isString( inverted_value[ value ] ) ? inverted_value[ value ] : value; } $admin_label.html( ': ' + label_value ); $admin_label.show().removeClass( 'hidden-label' ); } } }, this ); } view = vc.app.views[ model.get( 'parent_id' ) ]; if ( false !== model.get( 'parent_id' ) && _.isObject( view ) ) { view.checkIsEmpty(); } }, changeShortcodeParent: function ( model ) { if ( false === this.model.get( 'parent_id' ) ) { return model; } var $parent_view = $( '[data-model-id=' + this.model.get( 'parent_id' ) + ']' ), view = vc.app.views[ this.model.get( 'parent_id' ) ]; this.$el.appendTo( $parent_view.find( '> .wpb_element_wrapper > .wpb_column_container,' + ' > .vc_element-wrapper > .wpb_column_container' ) ); view.checkIsEmpty(); }, // }} // Event Actions {{ deleteShortcode: function ( e ) { if ( _.isObject( e ) ) { e.preventDefault(); } var answer = confirm( i18n.press_ok_to_delete_section ); if ( true === answer ) { this.model.destroy(); } }, addElement: function ( e ) { _.isObject( e ) && e.preventDefault(); vc.add_element_block_view.render( this.model, ! _.isObject( e ) || ! $( e.currentTarget ).closest( '.bottom-controls' ).hasClass( 'bottom-controls' ) ); }, editElement: function ( e ) { if ( _.isObject( e ) ) { e.preventDefault(); } if ( ! vc.active_panel || ! vc.active_panel.model || ! this.model || ( vc.active_panel.model && this.model && vc.active_panel.model.get( 'id' ) != this.model.get( 'id' ) ) ) { vc.closeActivePanel(); vc.edit_element_block_view.render( this.model ); } }, clone: function ( e ) { if ( _.isObject( e ) ) { e.preventDefault(); } vc.clone_index = vc.clone_index / 10; return this.cloneModel( this.model, this.model.get( 'parent_id' ) ); }, cloneModel: function ( model, parent_id, save_order ) { var new_order, model_clone, params, tag; new_order = _.isBoolean( save_order ) && true === save_order ? model.get( 'order' ) : parseFloat( model.get( 'order' ) ) + vc.clone_index; params = _.extend( {}, model.get( 'params' ) ); tag = model.get( 'shortcode' ); model_clone = Shortcodes.create( { shortcode: tag, id: window.vc_guid(), parent_id: parent_id, order: new_order, cloned: true, cloned_from: model.toJSON(), params: params } ); _.each( Shortcodes.where( { parent_id: model.id } ), function ( shortcode ) { this.cloneModel( shortcode, model_clone.get( 'id' ), true ); }, this ); return model_clone; } } ); var VisualComposer = vc.visualComposerView = Backbone.View.extend( { el: $( '#wpb_visual_composer' ), views: {}, disableFixedNav: false, events: { "click #wpb-add-new-row": 'createRow', 'click #vc_post-settings-button': 'editSettings', 'click #vc_add-new-element, .vc_add-element-button, .vc_add-element-not-empty-button': 'addElement', 'click .vc_add-text-block-button': 'addTextBlock', 'click .wpb_switch-to-composer': 'switchComposer', 'click #vc_templates-editor-button': 'openTemplatesWindow', 'click #vc_templates-more-layouts': 'openTemplatesWindow', 'click .vc_template[data-template_unique_id] > .wpb_wrapper': 'loadDefaultTemplate', 'click #wpb-save-post': 'save', 'click .vc_control-preview': 'preview' }, initialize: function () { this.accessPolicy = $( '.vc_js_composer_group_access_show_rule' ).val(); if ( 'no' === this.accessPolicy ) { return false; } this.buildRelevance(); _.bindAll( this, 'switchComposer', 'dropButton', 'processScroll', 'updateRowsSorting', 'updateElementsSorting' ); vc.events.on( 'shortcodes:add', vcAddShortcodeDefaultParams, this ); vc.events.on( 'shortcodes:add', vc.atts.addShortcodeIdParam, this ); // update vc_grid_id on shortcode adding vc.events.on( 'shortcodes:add', this.addShortcode, this ); vc.events.on( 'shortcodes:destroy', this.checkEmpty, this ); Shortcodes.on( 'change:params', this.changeParamsEvents, this ); Shortcodes.on( 'reset', this.addAll, this ); this.render(); }, changeParamsEvents: function ( model ) { vc.events.triggerShortcodeEvents( 'update', model ); }, render: function () { var front = ''; // Find required elemnts of the view. this.$vcStatus = $( '#wpb_vc_js_status' ); this.$metablock_content = $( '.metabox-composer-content' ); this.$content = $( "#visual_composer_content" ); this.$post = $( '#postdivrich' ); this.$loading_block = $( '#vc_logo' ); if ( 'only' !== this.accessPolicy ) { if ( vc_frontend_enabled ) { front = '' + window.i18nLocale.main_button_title_frontend_editor + ''; } this.$buttonsContainer = $( '
' ).insertAfter( 'div#titlediv' ); this.$switchButton = this.$buttonsContainer.find( '.wpb_switch-to-composer' ); this.$switchButton.click( this.switchComposer ); } vc.add_element_block_view = new vc.AddElementUIPanelBackendEditor( { el: '#vc_ui-panel-add-element' } ); vc.edit_element_block_view = new vc.EditElementUIPanel( { el: '#vc_ui-panel-edit-element' } ); /** * @deprecated 4.4 * @type {vc.TemplatesEditorPanelViewBackendEditor} */ vc.templates_editor_view = new vc.TemplatesEditorPanelViewBackendEditor( { el: '#vc_templates-editor' } ); vc.templates_panel_view = new vc.TemplateWindowUIPanelBackendEditor( { el: '#vc_ui-panel-templates' } ); vc.post_settings_view = new vc.PostSettingsUIPanelBackendEditor( { el: '#vc_ui-panel-post-settings' } ); this.setSortable(); this.setDraggable(); vc.is_mobile = 0 < $( 'body.mobile' ).length; vc.saved_custom_css = $( '#wpb_custom_post_css_field' ).val(); vc.updateSettingsBadge(); /** * @since 4.5 */ _.defer( function () { vc.events.trigger( 'app.render' ); } ); return this; }, addAll: function () { this.views = {}; this.$content.removeClass( 'loading' ).empty(); this.addChild( false ); this.checkEmpty(); this.$loading_block.removeClass( 'vc_ajax-loading' ); this.$metablock_content.removeClass( 'vc_loading-shortcodes' ); }, addChild: function ( parent_id ) { _.each( vc.shortcodes.where( { parent_id: parent_id } ), function ( shortcode ) { this.appendShortcode( shortcode ); this.setSortable(); this.addChild( shortcode.get( 'id' ) ); }, this ); }, getView: function ( model ) { var view; if ( _.isObject( vc.map[ model.get( 'shortcode' ) ] ) && _.isString( vc.map[ model.get( 'shortcode' ) ].js_view ) && vc.map[ model.get( 'shortcode' ) ].js_view.length && ! _.isUndefined( window[ window.vc.map[ model.get( 'shortcode' ) ].js_view ] ) ) { view = new window[ window.vc.map[ model.get( 'shortcode' ) ].js_view ]( { model: model } ); } else { view = new ShortcodeView( { model: model } ); } model.set( { view: view } ); return view; }, setDraggable: function () { $( '#wpb-add-new-element, #wpb-add-new-row' ).draggable( { helper: function () { return $( '' ).appendTo( 'body' ); }, zIndex: 99999, // cursorAt: { left: 10, top : 20 }, cursor: "move", // appendTo: "body", revert: "invalid", start: function ( event, ui ) { $( "#drag_placeholder" ).addClass( "column_placeholder" ).html( window.i18nLocale.drag_drop_me_in_column ); } } ); this.$content.droppable( { greedy: true, accept: ".dropable_el,.dropable_row", hoverClass: "wpb_ui-state-active", drop: this.dropButton } ); }, dropButton: function ( event, ui ) { if ( ui.draggable.is( '#wpb-add-new-element' ) ) { this.addElement(); } else if ( ui.draggable.is( '#wpb-add-new-row' ) ) { this.createRow(); } }, appendShortcode: function ( model ) { var view, parentModelView, params; view = this.getView( model ); params = _.extend( vc.getDefaults( model.get( 'shortcode' ) ), model.get( 'params' ) ); model.set( 'params', params, { silent: true } ); parentModelView = false !== model.get( 'parent_id' ) ? this.views[ model.get( 'parent_id' ) ] : false; this.views[ model.id ] = view; if ( model.get( 'parent_id' ) ) { var parentView; parentView = this.views[ model.get( 'parent_id' ) ]; parentView.unsetEmpty(); } if ( parentModelView ) { parentModelView.addShortcode( view, 'append' ); } else { this.$content.append( view.render().el ); } view.ready(); view.changeShortcodeParams( model ); // Refactor view.checkIsEmpty(); this.setNotEmpty(); }, addShortcode: function ( model ) { var view, parentModelView, params; params = _.extend( vc.getDefaults( model.get( 'shortcode' ) ), model.get( 'params' ) ); model.set( 'params', params, { silent: true } ); view = this.getView( model ); parentModelView = false !== model.get( 'parent_id' ) ? this.views[ model.get( 'parent_id' ) ] : false; view.use_default_content = true !== model.get( 'cloned' ); this.views[ model.id ] = view; if ( parentModelView ) { parentModelView.addShortcode( view ); parentModelView.checkIsEmpty(); var self; self = this; _.defer( function () { view.changeShortcodeParams && view.changeShortcodeParams( model ); view.ready(); self.setSortable(); self.setNotEmpty(); } ); } else { this.addRow( view ); _.defer( function () { view.changeShortcodeParams && view.changeShortcodeParams( model ); } ); } }, addRow: function ( view ) { var before_shortcode; before_shortcode = _.last( vc.shortcodes.filter( function ( shortcode ) { return false === shortcode.get( 'parent_id' ) && parseFloat( shortcode.get( 'order' ) ) < parseFloat( this.get( 'order' ) ); }, view.model ) ); if ( before_shortcode ) { view.render().$el.insertAfter( '[data-model-id=' + before_shortcode.id + ']' ); } else { this.$content.append( view.render().el ); } }, addTextBlock: function ( e ) { var row, column, params; e.preventDefault(); row = Shortcodes.create( { shortcode: 'vc_row' } ); column = Shortcodes.create( { shortcode: 'vc_column', params: { width: '1/1' }, parent_id: row.id, root_id: row.id } ); params = vc.getDefaults( 'vc_column_text' ); if ( 'undefined' !== typeof(window.vc_settings_presets[ 'vc_column_text' ]) ) { params = _.extend( params, window.vc_settings_presets[ 'vc_column_text' ] ); } return Shortcodes.create( { shortcode: 'vc_column_text', parent_id: column.id, root_id: row.id, params: params } ); }, /** * Create row */ createRow: function () { var row = Shortcodes.create( { shortcode: 'vc_row' } ); Shortcodes.create( { shortcode: 'vc_column', params: { width: '1/1' }, parent_id: row.id, root_id: row.id } ); return row; }, /** * Add Element with a help of modal view. */ addElement: function ( e ) { _.isObject( e ) && e.preventDefault(); vc.add_element_block_view.render( false ); }, /** * @deprecated 4.4 use openTemplatesWindow * @param e */ openTemplatesEditor: function ( e ) { e && e.preventDefault(); vc.templates_editor_view.render().show(); }, openTemplatesWindow: function ( e ) { e && e.preventDefault(); if ( $( e.currentTarget ).is( '#vc_templates-more-layouts' ) ) { vc.templates_panel_view.once( 'show', function () { $( '[data-vc-ui-element-target="[data-tab=default_templates]"]' ).click(); } ); } vc.templates_panel_view.render().show(); }, loadDefaultTemplate: function ( e ) { e && e.preventDefault(); vc.templates_panel_view.loadTemplate( e ); }, editSettings: function ( e ) { e && e.preventDefault(); vc.post_settings_view.render().show(); }, sortingStarted: function ( event, ui ) { $( '#visual_composer_content' ).addClass( 'vc_sorting-started' ); }, sortingStopped: function ( event, ui ) { $( '#visual_composer_content' ).removeClass( 'vc_sorting-started' ); }, updateElementsSorting: function ( event, ui ) { _.defer( function ( app, event, ui ) { var $current_container = ui.item.parent().closest( '[data-model-id]' ), parent = $current_container.data( 'model' ), model = ui.item.data( 'model' ), models = app.views[ parent.id ].$content.find( '> [data-model-id]' ), i = 0; // Change parent if block moved to another container. if ( ! _.isNull( ui.sender ) ) { var old_parent_id = model.get( 'parent_id' ); store.lock(); model.save( { parent_id: parent.id } ); app.views[ old_parent_id ].checkIsEmpty(); app.views[ parent.id ].checkIsEmpty(); } models.each( function () { var shortcode = $( this ).data( 'model' ); store.lock(); shortcode.save( { 'order': i ++ } ); } ); model.save(); }, this, event, ui ); }, updateRowsSorting: function () { _.defer( function ( app ) { var $rows = app.$content.find( app.rowSortableSelector ); $rows.each( function () { var index = $( this ).index(); if ( $rows.length - 1 > index ) { store.lock(); } $( this ).data( 'model' ).save( { 'order': index } ); } ); }, this ); }, renderPlaceholder: function ( event, element ) { var tag = $( element ).data( 'element_type' ); var is_container = _.isObject( vc.map[ tag ] ) && ( ( _.isBoolean( vc.map[ tag ].is_container ) && true === vc.map[ tag ].is_container ) || ! _.isEmpty( vc.map[ tag ].as_parent ) ); var $helper = $( '\n
Nykyp\u00e4iv\u00e4n pelaajalle on t\u00e4rke\u00e4\u00e4 l\u00f6yt\u00e4\u00e4 luotettava ja viihdytt\u00e4v\u00e4 pelialusta. Markkinoilla on lukuisia kasinoita, mutta mik\u00e4 tekee joistakin parempia kuin toisista? T\u00e4ss\u00e4 artikkelissa syvennymme parhaiden kasinoiden maailmaan, tarkastelemme mit\u00e4 ominaisuuksia kannattaa etsi\u00e4 ja miten varmistat turvallisen ja nautinnollisen pelikokemuksen. Parhaat kasinot<\/a><\/strong> tarjoavat monipuolisen valikoiman pelej\u00e4, houkuttelevia bonuksia ja ennen kaikkea, turvallisen ymp\u00e4rist\u00f6n pelaajille.<\/p>\n Kasinomarkkinoilla on tarjolla useita erilaisia kasinotyyppej\u00e4, joista jokaisella on omat vahvuutensa ja heikkoutensa. Perinteiset, eli fyysiset kasinot tarjoavat ainutlaatuisen tunnelman ja sosiaalisen kokemuksen, mutta niihin liittyy matkakustannuksia ja aikarajoituksia. Nettikasinot puolestaan ovat helposti saavutettavissa milloin ja miss\u00e4 tahansa, ja tarjoavat laajemman valikoiman pelej\u00e4. Lis\u00e4ksi on olemassa my\u00f6s livekasinoita, jotka yhdist\u00e4v\u00e4t nettikasinoiden helppok\u00e4ytt\u00f6isyyden ja fyysisten kasinoiden tunnelman.<\/p>\n Bonukset ja kampanjat ovat houkutteleva osa kasinoiden maailmaa, mutta on t\u00e4rke\u00e4\u00e4 lukea ehdot huolellisesti ennen bonuksen lunastamista. Hyv\u00e4 bonus tarjoaa reilut kierr\u00e4tysvaatimukset ja selke\u00e4t s\u00e4\u00e4nn\u00f6t. Etsi kasinoita, jotka tarjoavat tervetuliaisbonuksen lis\u00e4ksi my\u00f6s jatkuvia kampanjoita ja uskollisuusohjelmia. My\u00f6s ilmaiskierrokset ovat suosittu tapa houkutella uusia pelaajia ja antaa heille mahdollisuus tutustua kasinon pelivalikoimaan ilmaiseksi.<\/p>\n Laaja ja monipuolinen pelivalikoima on yksi t\u00e4rkeimmist\u00e4 kriteereist\u00e4 kasinoa valittaessa. Hyv\u00e4 kasino tarjoaa kolikkopelej\u00e4, p\u00f6yt\u00e4pelej\u00e4, live-kasinopelej\u00e4 ja ehk\u00e4 jopa vedonly\u00f6nti\u00e4. Kannattaa kiinnitt\u00e4\u00e4 huomiota pelivalmistajiin, sill\u00e4 tunnetut ja arvostetut valmistajat takaavat korkean laadun ja reilun pelikokemuksen. Suositut pelivalmistajat, kuten NetEnt, Microgaming ja Evolution Gaming, tunnetaan innovatiivisista ja viihdytt\u00e4vist\u00e4 peleist\u00e4\u00e4n. Etsi kasinoita, jotka p\u00e4ivitt\u00e4v\u00e4t pelivalikoimaansa s\u00e4\u00e4nn\u00f6llisesti ja tarjoavat uusia ja j\u00e4nnitt\u00e4vi\u00e4 pelej\u00e4.<\/p>\n Kolikkopelit ovat kasinoiden suosituimpia pelej\u00e4, ja niit\u00e4 on saatavilla lukemattomia eri teemoilla ja ominaisuuksilla. Kolikkopelit ovat helppoja pelata ja tarjoavat mahdollisuuden suuriin voittoihin pienell\u00e4 panoksella. Monissa kolikkopeleiss\u00e4 on my\u00f6s bonusominaisuuksia, kuten ilmaiskierroksia, villi symboleja ja erikoispalkintoja, jotka tekev\u00e4t pelaamisesta entist\u00e4 j\u00e4nnitt\u00e4v\u00e4mp\u00e4\u00e4. Tutustu eri kolikkopelien palautusprosentteihin (RTP), sill\u00e4 korkeampi RTP tarkoittaa parempia voittomahdollisuuksia.<\/p>\n P\u00f6yt\u00e4pelit, kuten blackjack, ruletti ja pokeri, ovat klassikkoja, jotka ovat s\u00e4ilytt\u00e4neet suosionsa vuosien varrella. P\u00f6yt\u00e4pelit vaativat hieman enemm\u00e4n strategiaa ja taitoa kuin kolikkopelit, mutta tarjoavat my\u00f6s mahdollisuuden suurempiin voittoihin. Monet kasinot tarjoavat my\u00f6s erilaisia p\u00f6yt\u00e4pelien versioita, kuten amerikkalainen ruletti, eurooppalainen ruletti ja single zero ruletti. Valitse itsellesi sopivin versio ja tutustu s\u00e4\u00e4nt\u00f6ihin huolellisesti ennen pelaamista.<\/p>\n Turvallisuus ja luotettavuus ovat ehdottomasti t\u00e4rkeimm\u00e4t tekij\u00e4t kasinoa valittaessa. Varmista, ett\u00e4 kasinolla on voimassaoleva pelilisenssi arvostetulta peliviranomaiselta, kuten Maltan peliviranomaiselta (MGA) tai Iso-Britannian pelikomissiolta (UKGC). Lisenssi takaa, ett\u00e4 kasino toimii s\u00e4\u00e4d\u00f6sten mukaisesti ja ett\u00e4 pelaajien varoja ja henkil\u00f6tietoja k\u00e4sitell\u00e4\u00e4n turvallisesti. My\u00f6s kasinon k\u00e4ytt\u00e4m\u00e4 salausj\u00e4rjestelm\u00e4 on t\u00e4rke\u00e4, sill\u00e4 sen tulee suojata arkaluonteisia tietoja, kuten pankkitietoja ja luottokorttinumeroita. Tarkista my\u00f6s, ett\u00e4 kasino k\u00e4ytt\u00e4\u00e4 reilun pelin teknologiaa, kuten satunnaislukugeneraattoria (RNG), joka varmistaa, ett\u00e4 pelien tulokset ovat satunnaisia ja tasapuolisia. <\/p>\n Helppok\u00e4ytt\u00f6iset ja turvalliset maksutavat ovat t\u00e4rke\u00e4 osa hyv\u00e4\u00e4 kasinokokemusta. Hyv\u00e4 kasino tarjoaa laajan valikoiman erilaisia maksutapoja, kuten luottokortteja, pankkisiirtoja, verkkolompakoita ja mobiilimaksuja. My\u00f6s nopeat kotiutukset ovat t\u00e4rke\u00e4 kriteeri kasinoa valittaessa. Etsi kasinoita, jotka k\u00e4sittelev\u00e4t kotiutukset nopeasti ja ilman turhia viiveit\u00e4. Lis\u00e4ksi on t\u00e4rke\u00e4\u00e4, ett\u00e4 kasino ei peri kohtuuttomia kotiutuskuluja.<\/p>\n Parhaat kasinot pyrkiv\u00e4t jatkuvasti parantamaan palveluitaan ja tarjoamaan pelaajille mahdollisimman hyv\u00e4n pelikokemuksen. Ne panostavat turvallisuuteen, pelivalikoimaan ja asiakaspalveluun, ja pyrkiv\u00e4t olemaan luotettavia ja reiluja kumppaneita pelaajilleen. Valitsemalla huolellisesti voit l\u00f6yt\u00e4\u00e4 itsellesi sopivan kasinon ja nauttia turvallisesta ja viihdytt\u00e4v\u00e4st\u00e4 pelikokemuksesta.<\/p>\n","protected":false},"excerpt":{"rendered":" J\u00e4nnitys huippusuunnillaan \u2013 parhaat kasinot ja suuret voitot sinulle Kasinojen tyypit: Mist\u00e4 valita? Bonukset ja kampanjat: Mist\u00e4 tunnistaa hyv\u00e4n tarjouksen? Pelivalikoima: Mit\u00e4 kannattaa etsi\u00e4? Kolikkopelit P\u00f6yt\u00e4pelit Turvallisuus ja luotettavuus: Miten varmistat turvallisen pelikokemuksen? Maksutavat: Mit\u00e4 vaihtoehtoja on saatavilla? J\u00e4nnitys huippusuunnillaan \u2013 parhaat kasinot ja suuret voitot sinulle Nykyp\u00e4iv\u00e4n pelaajalle on t\u00e4rke\u00e4\u00e4 l\u00f6yt\u00e4\u00e4 luotettava ja viihdytt\u00e4v\u00e4 […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[77],"tags":[],"class_list":["post-228824","post","type-post","status-publish","format-standard","hentry","category-post"],"_links":{"self":[{"href":"https:\/\/huurzoek.com\/index.php?rest_route=\/wp\/v2\/posts\/228824","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/huurzoek.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/huurzoek.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/huurzoek.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/huurzoek.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=228824"}],"version-history":[{"count":1,"href":"https:\/\/huurzoek.com\/index.php?rest_route=\/wp\/v2\/posts\/228824\/revisions"}],"predecessor-version":[{"id":228825,"href":"https:\/\/huurzoek.com\/index.php?rest_route=\/wp\/v2\/posts\/228824\/revisions\/228825"}],"wp:attachment":[{"href":"https:\/\/huurzoek.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=228824"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/huurzoek.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=228824"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/huurzoek.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=228824"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}Kasinojen tyypit: Mist\u00e4 valita?<\/h2>\n
\n
\nKasino tyyppi
\nVahvuudet
\nHeikkoudet
\n<\/tr>\n\n Fyysinen kasino<\/td>\n Tunnelma, sosiaalinen kokemus<\/td>\n Matkakustannukset, aikarajoitukset<\/td>\n<\/tr>\n \n Nettikasino<\/td>\n Helppok\u00e4ytt\u00f6isyys, pelivalikoima<\/td>\n Sosiaalisen kokemuksen puute<\/td>\n<\/tr>\n \n Live-kasino<\/td>\n Yhdist\u00e4\u00e4 molempien maailmojen parhaat puolet<\/td>\n Saattaa vaatia nopean internet-yhteyden<\/td>\n<\/tr>\n<\/table>\n Bonukset ja kampanjat: Mist\u00e4 tunnistaa hyv\u00e4n tarjouksen?<\/h2>\n
\n
Pelivalikoima: Mit\u00e4 kannattaa etsi\u00e4?<\/h2>\n
Kolikkopelit<\/h3>\n
P\u00f6yt\u00e4pelit<\/h3>\n
Turvallisuus ja luotettavuus: Miten varmistat turvallisen pelikokemuksen?<\/h2>\n
\n
Maksutavat: Mit\u00e4 vaihtoehtoja on saatavilla?<\/h2>\n
\n
\nMaksutapa
\nVahvuudet
\nHeikkoudet
\n<\/tr>\n\n Luottokortti<\/td>\n Helppok\u00e4ytt\u00f6isyys, yleisyys<\/td>\n Mahdolliset kotiutusrajoitukset<\/td>\n<\/tr>\n \n Pankkisiirto<\/td>\n Turvallisuus, suuret talletukset<\/td>\n Hitaat kotiutukset<\/td>\n<\/tr>\n \n Verkkolompakko<\/td>\n Nopeat kotiutukset, lis\u00e4turva<\/td>\n Vaatii tilin luomisen<\/td>\n<\/tr>\n<\/table>\n