VPorn.com - A New Layout II - updated

A unique great site got A new layout, with som added functionality and lost some. This script adds browser full video, bigger thumbnails, key and mouse navigation and interaction.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

//// ==UserScript==
// @name            VPorn.com - A New Layout II - updated
// @namespace       http://use.i.E.your.homepage/
// @version         0.50
// @description     A unique great site got A new layout, with som added functionality and lost some. This script adds browser full video, bigger thumbnails, key and mouse navigation and interaction.

// @match           http://www.vporn.com/*
// @exclude         http://www.vporn.com/embed/*
// @match			http://www.wporns.info/*

// @require         http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
// @require         https://greasyfork.org/scripts/9160-my-function-library/code/My%20Function%20library.js?version=128176
// @require         https://greasyfork.org/scripts/6883-tinysort-tsort/code/TinySorttsort.js?version=27466

// @grant           GM_getValue
// @grant           GM_getValue
// @grant           GM_setValue
// @grant           GM_deleteValue
// @grant           GM_listValues
// @grant           GM_xmlhttpRequest

// @run-at          document-start

// @created         2015-01-28
// @released        2014-00-00
// @updated         2016-07-04

// @history         @version 0.25 - first version: public@released - 2015-02-11
// @history         @version 0.38 - pre release second version: public@released - 2015-04-24
// @history         @version 0.39 - Second Public release: 2015-04-24
// @history         @version 0.40 - Third Public release: 2015-05-02
// @history         @version 0.41 - Forth Public release: 2015-05-03
// @history         @version 0.48 - Fifth Public release: 2016-06-20
// @history         @version 0.49 - Sixth Public release: 2016-07-03
// @history         @version 0.50 - Seventh Public release: 2016-07-04

// @compatible      Greasemonkey, Tampermonkey
// @license         GNU GPL v3 (http://www.gnu.org/copyleft/gpl.html)
// @copyright       2014+, Magnus Fohlström
// ==/UserScript==

/*global $, jQuery*/

/*jshint -W014*/
// -W014, lax break, Bad line breaking before '+'
// -W030, Expected assignment or function call instead saw an expression
// -W082, a function declaration inside a block statement

(function($){
    //GM_lister( true );
    var w           = function( text, tag, style ){
            style = style || '';
            return fn.obj2Str( html.wrapTag( text, tag, style ) );
        },
        cl          = function( text, style ){
            style = style || '';
            return fn.obj2Str( $( '<span/>',{ class: style, text: text }) );
        },
        em          = function( text ){
            return fn.obj2Str( $( '<em/>' ).html(text) );
        },
        b           = function( text ){
            return fn.obj2Str( $( '<b/>' ).html(text) );
        },
        v           = function( text, width, height, src, firstLine, backTo, page ){
            return fn.obj2Str( $( '<span/>',{ class:'videolink menuTM', text:text, 'data-command':'video', 'data-back':backTo, 'data-page':page,
                'data-width':width, 'data-height':height, 'data-src':src }).append( $( '<span/>' ).text( firstLine ).hide() ) );
        },
        p           = function( text, style ){
            style = style || '';
            var obj = $( '<span/>', { class: style });
            $.each( text.split('\r'), function(id,elem){
                obj.append( $('<p/>').html(
                    elem.split('\n').join('<br>')
                        .split('\t').join('&nbsp;&nbsp;&nbsp;')
                        .split(/\s+/g).join(' ')
                ));
            });
            return fn.obj2Str( obj );
        },
        a           = function( txt, href ){
            var link = href.search('mailto:') === 0 ? '' : 'http://';
            return fn.obj2Str( $( '<a/>',{ href: link + href, class:'external', target: '_blank', text: txt }) );
        },
        l           = function( txt, cl, data, page ){
            return fn.obj2Str( $( '<a/>',{ class: cl, 'data-command': data, 'data-text': txt, 'data-page': page, text: txt }) );
        },
        GM          = {
            show    : function( dialog ){
                setTimeout(function(){
                    render.tm();
                    $('#holderTM').show();
                    dialog == 'update' && (
                        html.latestTM()
                    );
                    c.i('firstRun');
                },2000);
            },
            first   : function(){
                GM_setValue('firstRun','Done');
                this.manager('set');
                this.show();
            },
            manager : function( fn ){
                var engine = function( val ){
                        switch (fn){
                            case 'set':     GM_setValue( val.name, val.default );           break;
                            case 'get':     config[ val.name ] = GM_getValue( val.name ) || GM_getValue( val.default );   break;
                            case 'del':     GM_deleteValue( val.name );                     break;
                        }
                    },  yourVer = GM_getValue('yourVer'),
                    latest = sharedData.latestVersion;

                c.i('mlatest',latest);
                c.i('myourVer',yourVer);

                yourVer !== undefined && yourVer < latest && this.show('update');
                GM_setValue('yourVer',latest);

                fn === 'del' && (GM_deleteValue( 'firstRun' ),GM_deleteValue( 'yourVer' ));
                $.each( sharedData.GM(), function(i,val){ engine(val) });
                $.each( sharedData.settings2(), function(i,val){ engine(val) });
                //$.each( sharedData.thumbSort(), function(i,val){ engine(val) });
            }
        },
        config      = {
            fullWidth   : 100,
            d80Width    : 80,
            orgWidth    : 960,
            normWidth   : 1100,
            wideWidth   : 1400,
            extraWidth  : 1800,
            startWidth	: function(){
                var winWidth = $w.width(),
                    corr = 80,
                    min = 960,
                    uiWidth = this.pageWidth === 'fullWidth'
                        ? winWidth * ( this[ this.pageWidth ] / 100 ) - corr
                        : this[ this.pageWidth ],
                    setWidth = uiWidth + corr > winWidth
                        ? winWidth - corr
                        : uiWidth;

                this.pageWidthNR = setWidth < min
                    ? min
                    : setWidth;
                //c.l('this.pageWidth',this.pageWidth);c.l('this.pageWidth === fullWidth',this.pageWidth === 'fullWidth');
                //c.l('this[ this.pageWidth ]',this[ this.pageWidth ]);c.l('uiWidth',uiWidth);c.l('setWidth',setWidth);c.l('this.pageWidthNR',this.pageWidthNR);
                //c.l('',);c.l('',);
            },
            locDoc      : window.location.href,
            sorting     : false,
            prevDoc     : 'prev',
            nextDoc     : 'next'
        },
        sharedData  = {
            latestVersion   : 0.50,
            updatesPerPage  : 3,
            updatesFirstPage: 0,
            dialogWidth     : 400,
            myName          : 'Magnus Fohlström',
            copyrightYear   : '2015 - 2016, ',
            update          : function( ){
                return [
                    { on:1	,ver:'0.50',	date:'2016-07-03',	type:'update',	visible:'y',	magnitude:'MAJOR',	name:'Page Navigation',	    desc:'Faster safer and not breaking layout, not running out of space - to show page buttons' },
                    { on:1	,ver:'0.50',	date:'2016-07-03',	type:'fixed',	visible:'y',	magnitude:'mini',	name:'Copyright',	        desc:'Added a space after Copyright symbol' },
                    { on:1	,ver:'0.50',	date:'2016-07-03',	type:'update',	visible:'y',	magnitude:'major',	name:'Refresh button',	    desc:'A new refresh button, with a hover, mouse-over - function' },
                    { on:1	,ver:'0.50',	date:'2016-07-03',	type:'fixed',	visible:'y',	magnitude:'mini',	name:'Update box width',	desc:'The box now is filled in width of the update dialog' },
                    { on:1	,ver:'0.50',	date:'2016-07-03',	type:'fixed',	visible:'y',	magnitude:'minor',	name:'menuState',		    desc:'Saving state of always show' },
                    { on:1	,ver:'0.50',	date:'2016-07-03',	type:'fixed',	visible:'y',	magnitude:'minor',	name:'Show Menu click',		desc:'Checkbox is now click-able' },
                    { on:1	,ver:'0.49',	date:'2016-06-20',	type:'new',		visible:'y',	magnitude:'minor',	name:'Latest version',		desc:'Latest update version is now displayed in the dialog' },
                    { on:1	,ver:'0.49',	date:'2016-06-20',	type:'fixed',	visible:'y',	magnitude:'mini',	name:'menu Button',	        desc:'Are now only reacting to left click mouse-up, now things happens in right order' },
                    { on:1	,ver:'0.49',	date:'2016-06-20',	type:'fixed',	visible:'y',	magnitude:'major',	name:'Copyright',	        desc:'Layout fixed - is now centered, when menu is hidden. Down under in code, many change was needed' },
                    { on:1	,ver:'0.49',	date:'2016-06-20',	type:'update',	visible:'y',	magnitude:'mini',	name:'A Dot',	            desc:'Update description is always followed, by a dot' },
                    { on:1	,ver:'0.49',	date:'2016-06-20',	type:'fixed',	visible:'y',	magnitude:'mini',	name:'menuState',	        desc:'Always show menu, is true. By default' },
                    { on:1	,ver:'0.49',	date:'2016-06-20',	type:'new',	    visible:'y',	magnitude:'major',	name:'Dynamic width size',	desc:'Dynamically changes when browser width size changes, Full witdh of the browser' },
                    { on:1	,ver:'0.48',	date:'2016-06-18',	type:'update',	visible:'n',	magnitude:'major',	name:'myFunction Library',	desc:'Added latest version of myFunction\'s Library' },
                    { on:1	,ver:'0.48',	date:'2016-06-18',	type:'fixed',	visible:'y',	magnitude:'mini',	name:'Center pager',	    desc:'The pager is now displaying page buttons centered' },
                    { on:1	,ver:'0.48',	date:'2016-06-18',	type:'new',		visible:'y',	magnitude:'mini',	name:'Buttons left click',	desc:'Make sure that only right mouse button - work' },
                    { on:1	,ver:'0.48',	date:'2016-06-18',	type:'new',		visible:'y',	magnitude:'major',	name:'Latest Button',		desc:'You can now, push a button for latest update and isn\'t  repeated' },
                    { on:1	,ver:'0.48',	date:'2016-06-18',	type:'fixed',	visible:'y',	magnitude:'mini',	name:'Fix Reverce Order',	desc:'Now Reverce order button always working, before needed some extra clicks' },
                    { on:1	,ver:'0.47',	date:'2016-06-12',	type:'fixed',	visible:'y',	magnitude:'mini',	name:'Center Pager',	    desc:'Pager now centers everywhere - css fix' },
                    { on:1	,ver:'0.47',	date:'2016-06-11',	type:'fixed',	visible:'y',	magnitude:'major',	name:'Fixed Latest Update',	desc:'Now shows latest updates, instead of blank' },
                    { on:1	,ver:'0.47',	date:'2016-06-11',	type:'new',		visible:'y',	magnitude:'minor',	name:'Visible Thumbs',		desc:'In sort menu, shows how many thumbs are visible of the total, delivered' },
                    { on:1	,ver:'0.46',	date:'2016-04-08',	type:'fixed',	visible:'y',	magnitude:'mini',	name:'Fix thumb info',		desc:'Title was messed up by other info, now fixed' },
                    { on:1	,ver:'0.46',	date:'2016-04-07',	type:'new',		visible:'y',	magnitude:'minor',	name:'Reverse Order',		desc:'Reverse the order of that sort function, a small bug is remaining' },
                    { on:1	,ver:'0.46',	date:'2016-04-05',	type:'new',		visible:'y',	magnitude:'minor',	name:'Video minMax',		desc:'Now you can show thumbs between minimum and maximum length' },
                    { on:1	,ver:'0.45',	date:'2015-12-29',	type:'new',		visible:'y',	magnitude:'major',	name:'Thumb Sorter',		desc:'On each thumb pages individual you can sort by date or length and choice only to show HD thumbs' },
                    { on:1	,ver:'0.44',	date:'2015-12-27',	type:'update',	visible:'y',	magnitude:'minor',	name:'Page Navigation',		desc:'Error Correcting and faster function to navigate thumb pages' },
                    { on:1	,ver:'0.43',	date:'2015-10-09',	type:'new',		visible:'y',	magnitude:'minor',	name:'Active Button',		desc:'Visually mark active button' },
                    { on:1	,ver:'0.43',	date:'2015-10-08',	type:'fixed',	visible:'y',	magnitude:'minor',	name:'Foot',				desc:'Now is foot always  close to bottom, not jumping around' },
                    { on:1	,ver:'0.43',	date:'2015-10-08',	type:'update',	visible:'n',	magnitude:'minor',	name:'Updates Management',	desc:'Simpler way to manage the updates information page' },
                    { on:1	,ver:'0.43',	date:'2015-10-08',	type:'new',		visible:'y',	magnitude:'minor',	name:'Fullplayer border',	desc:'Smaller white border with boxShadow and red background' },
                    { on:1	,ver:'0.42',	date:'2015-05-12',	type:'update',	visible:'y',	magnitude:'major',	name:'Video Dialog',		desc:'A video dialog there presentation - can be shown - example made' },
                    { on:1	,ver:'0.41',	date:'2015-05-03',	type:'fixed',	visible:'y',	magnitude:'minor',	name:'Button Click',		desc:'From now on it\'s when clicking a button, something will happened'},
                    { on:1	,ver:'0.41',	date:'2015-05-03',	type:'new',		visible:'y',	magnitude:'minor',	name:'Update Pager',		desc:'Update Dialog got pager' },
                    { on:1	,ver:'0.41',	date:'2015-05-03',	type:'new',		visible:'y',	magnitude:'minor',	name:'Update Latest ',		desc:'When new version ii shows latest changes, in update dialog' },
                    { on:1	,ver:'0.41',	date:'2015-05-02',	type:'new',		visible:'y',	magnitude:'minor',	name:'Auto Show Update',	desc:'Shows Update Dialog when this script is updated to new version' },
                    { on:1	,ver:'0.40',	date:'2015-05-02',	type:'new',		visible:'y',	magnitude:'major',	name:'Update Dialog',		desc:'Now you can see the latest changes' },
                    { on:1	,ver:'0.40',	date:'2015-04-30',	type:'update',	visible:'n',	magnitude:'major',	name:'Code Rewrite',		desc:'95 lines lesser code - same result, easier to manage and add information' },
                    { on:1	,ver:'0.40',	date:'2015-04-29',	type:'fixed',	visible:'y',	magnitude:'mini',	name:'Video Dialog size',	desc:'Are now fixed - if dialog height are too big' },
                    { on:1	,ver:'0.40',	date:'2015-04-26',	type:'new',		visible:'y',	magnitude:'mini',	name:'Return',				desc:'Navigation back to where you where before you entered video dialog' },
                    { on:1	,ver:'0.39',	date:'2015-04-24',	type:'new',		visible:'y',	magnitude:'major',	name:'Video Dialog',		desc:'A dialog that will show media like videos' },
                    { on:0	,ver:false,		date:'2015-04-26',	type:'',		visible:'',		magnitude:'',		name:'menuState',			desc:''       }
                ];
            },
            dialogs         : function( ){
                return [
                    { on:1,	order:4, name:'Update Info',		command:'update',			type:'menuTM',		width: 515,			id:'updatedTM',		head:'Updates v' + this.latestVersion,	page:1,
                        firstLine:'Here can you see all the uppdates that are made.'    },
                    { on:1,	order:1, name:'About',				command:'about',			type:'menuTM',		width: 450,			id:'aboutTM',		head:'About',
                        firstLine:'Script Details.'    },
                    { on:1,	order:2, name:'Welcome',			command:'firstIntro',		type:'menuTM',		width:'default',	id:'welcomeTM',		head:'Welcome',
                        firstLine:'Hi THANKS for using this fabulous script.'    },
                    { on:1,	order:3, name:'Settings',			command:'config',			type:'menuTM',		width:'default',	id:'configTM',		head:'Set your settings',	page:1,
                        firstLine:'We all have our own preferences, choice is yours.' },
                    { on:1,	order:9, name:'Contact',			command:'contact',			type:'menuTM',		width:'default',	id:'contactTM',		head:'Contact Me',
                        firstLine:'Here you have a simple form to contact me.'    },
                    { on:1,	order:5, name:'Instruction/Help',	command:'help',				type:'menuTM',		width:'default',	id:'helpTM',		head:'Instructions - ',	page:1,
                        firstLine:'How to operate this special script.' },
                    { on:0,	order:6, name:'Other Scripts',		command:'similarScripts',	type:'menuTM',		width:'default',	id:'otherTM',		head:'',
                        firstLine:''     },
                    { on:0,	order:6, name:'Other Sites',		command:'OtherSites',		type:'menuTM',		width:'default',	id:'sitesTM',		head:'',
                        firstLine:'All the Sites this script is working on'     },
                    { on:1,	order:8, name:'Donate',				command:'donate',			type:'menuTM',		width:'default',	id:'donateTM',		head:'Donating',
                        firstLine:'What amount are you willing to lose or invest in me.'    },
                    { on:0,	order:8, name:'Video',				command:'video',			type:'menuTM',		width:'default',	id:'videoTM',		head:'',
                        firstLine:''    },
                    { on:0,	order:7, name:'Feedback',			command:'feedback',			type:'menuTM',		width:'',			id:'feedbackTM',		head:'Make a feedback',
                        firstLine:''    },
                    { on:0,	order:7, name:'My Home Page',		command:'www.myDom.com',	type:'external',	width:'default',	id:'',				head:'',
                        firstLine:''    }
                ];
            },
            about           : function( ){
                return [
                    { on:1	,name:'Name',				desc:'VPorn.com - A New Layout II'},
                    { on:1	,name:'Description',		desc:'A unique great site got A new layout, with som added functionality and lost some. ' +
                                                             'This script adds browser full video, bigger thumbnails, key and mouse navigation and interaction.'},
                    { on:1	,name:'Version',			desc: this.latestVersion },
                    { on:1	,name:'Site',				desc:'www.vporn.com'},
                    { on:1	,name:'Runs at',			desc:'document start'},
                    { on:1	,name:'Created',			desc:'2015-01-28'},
                    { on:1	,name:'Updated',			desc:'2016-07-04'},
                    { on:1	,name:'History v0.25',		desc:'1st Public: 2015-02-11'},
                    { on:1	,name:'History v0.39',		desc:'2nd Public: 2015-04-24'},
                    { on:1	,name:'History v0.40',		desc:'3rd Public: 2015-05-02'},
                    { on:1	,name:'History v0.41',		desc:'4th Public: 2015-05-03'},
                    { on:1	,name:'History v0.48',		desc:'5th Public: 2016-06-20'},
                    { on:1	,name:'History v0.49',		desc:'6th Public: 2016-07-03'},
                    { on:1	,name:'History v0.50',		desc:'7th Public: 2016-07-04'},
                    { on:0	,name:'History v0.48',		desc:'8th Public: 2016-06-20'},
                    { on:0	,name:'History v0.48',		desc:'9th Public: 2016-06-20'},
                    { on:1	,name:'Compatible',			desc:'Greasemonkey, Tampermonkey'},
                    { on:1	,name:'License',			desc:'GNU GPL v3 (http://www.gnu.org/copyleft/gpl.html)'},
                    { on:1	,name:'Copyright',			desc: this.copyrightYear + this.myName },
                    { on:0	,name:'Updated',			desc:'2015-04-18'},
                    { on:0	,name:'Updated',			desc:'2015-04-18'},
                    { on:0	,name:'Updated',			desc:'2015-04-18'},
                    { on:0	,name:'Updated',			desc:'2015-04-18'},
                    { on:0	,name:'Updated',			desc:'2015-04-18'}
                ];
            },
            minMax          : function( ){
                return [
                    { name:'Zero', unite:'Min', min:0 },
                    { name:'Five', unite:'Min', min:5 },
                    { name:'Ten', unite:'Min', min:10 },
                    { name:'Fifteen', unite:'Min', min:15 },
                    { name:'Thirty', unite:'Min', min:30 },
                    { name:'One', unite:'Hour', min:60 },
                    { name:'Two', unite:'Hour', min:120 },
                    { name:'Ten', unite:'Hour', min:600 }
                ];
            },
            thumbSort       : function( ){
                return [
                    { default : false,    name : 'Count'  ,    chk : 0,   sort : 'asc'   },
                    { default : false,    name : 'HD'     ,    chk : 0,   sort : 'asc'   },
                    { default : false,    name : 'min'    ,    chk : 0,   sort : 'dec'   },
                    { default : true ,    name : 'Length' ,    chk : 1,   sort : 'dec'   },
                    { default : false,    name : 'max'    ,    chk : 0,   sort : 'dec'   },
                    { default : true ,    name : 'Date'   ,    chk : 1,   sort : 'asc'   },
                    { default : false,    name : 'Views'   ,   chk : 1,   sort : 'dec'   },
                    { default : false,    name : 'Rating'   ,  chk : 1,   sort : 'dec'   },
                    { default : false,    name : 'Unsorted',   chk : 1,   sort : 'asc'   },
                    { default : true,     name : 'sortOrder',  chk : 0,   sort : 'asc'   }
                ];
            },
            GM              : function( ){
                return [
                    { default : true,           name :'menuState'       },
                    { default : 4,              name :'thumbCol'        },
                    { default : 'normWidth',    name :'pageWidth'       },
                    { default : false,          name :'inMenu'          },
                    { default : 0,              name :'imgHeight'       },
                    { default : 0,              name :'videoMin'        },
                    { default : 36000,          name :'videoMax'        },
                    { default : false,          name :'sortOrder'       },
                    { default : 'unsorted',     name :'sortState'       },
                    { default : false,          name :'HD'              },
                    { default : 'r',            name :'randis'          }
                ];
            },
            settings2       : function( ){
                return [
                    { on:0	,default : true,   name :'dynThumb',       title : 'Show thumbs in correct ratio aspect' },
                    { on:0	,default : false,  name :'startButton',    title : 'Inside the user menu / as a separated button' },
                    { on:0	,default : false,  name :'ads',            title : 'Show Ads' },
                    { on:1	,default : true,   name :'welcome',        title : 'Show welcome Screen' },
                    { on:0	,default : true,   name :'menuPos',        title : '' },
                    { on:1	,default : false,  name :'menuVisible',    title : 'Show menu' },
                    { on:1	,default : false,  name :'start',          title : 'Do you know how to find this dialog' },
                    { on:1	,default : false,  name :'resetDelete',    title : 'Reset All Settings' },
                    { on:1	,default : 'Auto', name :'fullPlayer',     title : 'Set full player size - when video page loads' }
                ];
            },
            sites           : function( ){
                return [
                    { on:1, name :'', href : '', added : '', workablity : '', howFast : '', ratings: '', state : '', stateChanges : '' },
                    { on:1, name :'', href : '', added : '', workablity : '', howFast : '', ratings: '', state : '', stateChanges : '' }
                ];
            }
        },
        css         = {
            head        : function( ){
                $('<style id="fontsCss"></style>'
                    + '<style id="mainCss"></style>'
                    + '<style id="bxCss"></style>'
                    + '<style id="tmCss"></style>'
                    + '<style id="fullCss"></style>').appendTo('head');
            },
            fontsCss    : function( ){
                var CssHead = $( '#fontsCss' ),
                    css = '@import url(https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.css);';
                CssHead.html().length < 10 && CssHead.empty().append( css.formatString() );
            },
            basicCss    : function( ){
                var css, CssHead = $('#mainCss'), pageWidth = config.pageWidthNR, thumbCol = config.thumbCol;

                css = ''
                    +	'.overheaderbanner, #vz_im_ad, #video-right-holder, .red-adv, '
                    +	".topSbanner, div[style*='width: 720px'], .leftbanner, #leftmenu, #video-banner {"
                    +		'display: none !important;'
                    +		'}'
                    +	'#head, .navwrap, .nwrap, #footer-nav4, .warapper-menu {'
                    +		'width: '+pageWidth+'px !important;'
                    +		'max-width: '+pageWidth+'px !important;'
                    +		'min-width: 960px !important;'
                    +		'}'
                    +	'.account-videos {'
                    +		'width: calc( 100% - 190px );'
                    +		'}'
                    +	'.video-details {'
                    +		'width: calc( '+pageWidth+'px - 18px );'
                    +		'}'

                    +	'.video-details.small {'
                    +		'padding-bottom: 45px;'
                    +		'}'

                    +	'.playerholder {'
                    +		'width: calc( '+pageWidth+'px - 18px );'
                    +		'height: 0;'
                    +		'padding-bottom: calc(100% / 16 * 9);'
                    +		'}'

                    +	'.menu-video-left > span {'
                    +		'width: 100%;'
                    +		'max-width: none !important;'
                    +		'}'
                    +	'.menu-video-left {'
                    +		'width: calc( 100% - 65px );'
                    +		'height: 39px;'
                    +		'line-height: 39px;'
                    +		'padding-left: 5px;'
                    +		'}'

                    +	'object#as3_js, #video_player video {'
                    +		'width: 100%;'
                    +		'height: 100%;'
                    +		'position: absolute;'

                    +		'}'
                    +	'.conteiner, .conteiner>div, #video, .related, .related_outer, .related_container, #leftmenu ~ div {'
                    +		'width: 100% !important;'
                    +		'}'
                    +	'#content {'
                    +		'padding-top: 0;'
                    +		'overflow: visible;'
                    +		'}'
                    +	'.nwrap >  * , body >  *  {'
                    +		'position: relative;'
                    +		'}'
                    +	'.related_outer, .related_container {'
                    +		'overflow: visible !important;'
                    +		'position: static !important;'
                    +		'height: initial !important;'
                    +		'}'
                    +	'.tplace {'
                    +		'width: 100%;'
                    +		'height: inherit;'
                    +		'}'
                    +	'.time {'
                    +		'top: inherit;'
                    +		'bottom: 85px;'
                    +		'}'
                    +	'.thumblist .bx {'
                    +		'width: calc( 100% / '+thumbCol+' - 15px ) !important;'
                    //                +		'height: calc( ('+pageWidth+'px / 5 - 15px )*(215/210)) !important;'
                    //                +		'min-height: 227px;'
                    +		'}'




                    +	'.thumblist .bx .time {'
                    +		'top: inherit;'
                    +		'bottom: 5px;'
                    +		'}'
                    +	'.thumblist .bx .thumb {'
                    +		'position: relative;'
                    /*                +		'width: 100%;'
                     +		'height: 100%;'
                     +		'display: inline;'
                     */                +		'}'
                    +	'.cholder, .cholder>div {'
                    +		'width: calc( '+pageWidth+'px  ) !important;'
                    +		'clear: both;'
                    +		'overflow: visible;'
                    +		'}'
                    +	'.bx {'
                    +		'margin-right: 13px !important;'
                    +		'}'
                    +	'.thumblist .bx .bx_title a {'
                    +		'height: 32px !important;'
                    +		'}'
                    +	'.thumblist .bx {'
                    +		'width: calc( 100% / '+thumbCol+' - 15px ) !important;'
                    +		'position: relative;'
                    +		'z-index: 1000;'
                    +		'transition: all 500ms ease-in-out 500ms;'
                    +		'}'
                    +	'.thumblist .bx:hover {'
                    +		'transform: scale( 1.25 );'
                    +		'z-index: 10000;'
                    +		'position: relative;'
                    +		'box-shadow: 0px 0px 18px 4px rgba(82, 25, 24, 0.4);'
                    +		'border: rgba(89, 35, 35, 0.79) solid 1px;'
                    +		'}'

                    +	'.cholder .thumblist, .related_outer .thumblist {'
                    +		'width: calc( 100% + 14px );'
                    +		'}'
                    +	'.thumblist div.bx div:nth-last-child( 1 ) {'
                    +		'bottom: 3px;'
                    +		'}'
                    +	'.thumblist div.bx div:nth-last-child( 2 ) {'
                    +		'bottom: 22px;'
                    +		'}'

                    +	'.thumblist .bx  {'
                    +		'display: none !;'
                    +		'}'
                    +	'.thumblist .bx.showThumb {'
                    +		'display: block !;'
                    +		'}'

                    +	'.grayarea.wline {'
                    +		'height: 39px;'
                    +		'line-height: 39px;'
                    +		'text-align: center;'
                    +		'width: 100%;'
                    +		'}'


                    +	'.warapper-menu {'
                    +		'background-color: white;'
                    +		'border-width: 1px;'
                    +		'border-style: solid;'
                    +		'border-color: rgb( 228, 228, 228 );'
                    +		'border-radius: 12px;'
                    +		'overflow: hidden;'
                    +		'}'
                    +	'.account-menu {'
                    +		'border-width: 0;'
                    +		'margin-right: 0;'
                    +		'}'
                    +	'.account-videos {'
                    +		'width: calc( 100% - 178px );'
                    +		'}'
                    +	'.account-title {'
                    +		'border: 0px solid #e4e4e4;'
                    +		'border-bottom: 1px solid #e4e4e4;'
                    +		'}'
                    +	'.account-videos-wrapp.clearfix {'
                    +		'border: 0px solid #e4e4e4;'
                    +		'}'

                    +	'i.btn.btn-default {'
                    +		'float: left;'
                    +		'padding: 11px 9px 12px 9px;'
                    +		'margin: 9px;'
                    +		'margin-top: 15px;'
                    +		'color: white;'
                    //               +		'font-family: "Open Sans", Arial, Helvetica, sans-serif;'
                    +		'font-weight: 600;'
                    +		'font-size: 12px;'
                    +		'border-radius: 3px;'
                    +		'background-color: rgb( 253, 69, 66 );'
                    +		'cursor: pointer;'
                    +		'}'
                    +	'.search {'
                    +		'width: initial !important;'
                    +		'margin: 15px 0px 0 15px !important;'
                    +		'}'
                    +	'.reloadButton {'
                    +		'position: absolute;'
                    +		'top: 49px;'
                    +		'right: 55px;background-image: linear-gradient(0,#f5f5f5 0,#fff 100%);'
                    +		'border-color: #e4e4e4;'
                    +		'border-radius: 2px;'
                    +		'border-style: solid;'
                    +		'border-width: 1px;'
                    +		'margin-top: -42px;'
                    +		'width: 40px; height: 39px;'
                    +		'}'
                    +	'.reloadButton span {'
                    +		'width: 100%;'
                    +		'height: 100%;'
                    +		'background-image: url(http://eu-st.xhamster.com/images/tpl2/icons.png?5);'
                    +		'background-position: 2px -50px;'
                    +		'zoom: 2.3;'
                    +		'display: block;'
                    +		'}'
                    +	'.reloadButton span:hover {'
                    +		'background-position: -16px -50px;'
                    +		'}'

                    +	'.thumbSort ul.sortscontain a {'
                    +		'float: left;'
                    +		'}'
                    +	'.thumbSort .sortscontain {'
                    +		'display: inline-block;'
                    +		'}'
                    +	'.thumbSort li {'
                    +		'display: block;'
                    +		'float: left;'
                    +		'font-size: 12px;'
                    +		'margin: 8px 2px 0 2px;'
                    +		'padding: 8px 11px 7px 11px;'
                    +		'background-color: #fff;'
                    +		'-moz-border-radius: 2px;'
                    +		'-webkit-border-radius: 2px;'
                    +		'border-radius: 2px;'
                    +		'-moz-box-shadow: 0 1px 1px rgba( 0, 0, 0, 0.03 );'
                    +		'-webkit-box-shadow: 0 1px 1px rgba( 0, 0, 0, 0.03 );'
                    +		'box-shadow: 0 1px 1px rgba( 0, 0, 0, 0.03 );'
                    +		'font-weight: normal;'
                    +		'line-height: 12px;'
                    +		'}'
                    +	'.thumbSort li.current {'
                    +		'font-weight: 600;'
                    +		'height: 18px;'
                    +		'padding-left: 15px;'
                    +		'padding-right: 15px;'
                    +		'margin-top: 5px;'
                    +		'-moz-border-radius: 0;'
                    +		'-webkit-border-radius: 0;'
                    +		'border-radius: 0;'
                    +		'-moz-box-shadow: none;'
                    +		'-webkit-box-shadow: none;'
                    +		'box-shadow: none;'
                    +		'border-top: 1px solid #e4e4e4;'
                    +		'border-left: 1px solid #e4e4e4;'
                    +		'border-radius: 1px solid #e4e4e4;'
                    +		'line-height: 16px;'
                    +		'background: url( "/images/new/s-active.png" ) no-repeat center top;'
                    +		'}'
                    +	'.sortline .sortscontain {'
                    +		'margin: 0;'
                    +		'}'
                    +	'.thumbSort {'
                    +		'float: right !important;'
                    +		'position: relative;'
                    +		'z-index: 100000;'
                    +		'}'

                    +	'.minititle h1 span {'
                    +		'margin-top: 11px;'
                    +		'display: inline-block;'
                    +		'}'

                    +	'.pagerwrap {'
                    +		'position: relative;'
                    +		'z-index: 100000;'
                    +		'}'
                    +	'li#sortOrder {'
                    +		'width: 91.8px;'
                    +		'padding-left: 15px;'
                    +		'padding-right: 15px;'
                    +		'}'
                    +	'li#sortOrder:not( .current ) {'
                    +		'border-top: 1px solid rgb( 255, 255, 255 );'
                    +		'border-left: 1px solid rgb( 255, 255, 255 );'
                    +		'}'

                    +	'li.max, li.min {'
                    +		'float: none;'
                    +		'margin: 0 !important;'
                    +		'border-top: 0px solid !important;'
                    +		'}'
                    +	'ul.minMax {'
                    +		'position: absolute;'
                    +		'z-index: 10000;'
                    +		'display: none;'
                    +		'margin: 19px 0 0 -30px;'
                    +		'}'
                    +	'li.minMaxWrapper:hover .minMax {'
                    +		'display: inline;'
                    +		'}'

                    +	'.HD .thumblist > div:not( .hd ) {'
                    +		'display: none !;'
                    +		'}'

                    +	'.video-details .thumbSort {'
                    +		'position: absolute;'
                    +		'width: 100%;'
                    +		'right: initial;'
                    +		'bottom: -2px;'
                    +		'text-align: center;'
                    +		'transform: initial;'
                    +		'}'
                    +	'.video-details {'
                    +		'position: relative;'
                    +		'padding-bottom: 40px;'
                    +		'}'

                    +	'.sortline {'
                    //                +		'width: 1338px;'
                    +		'}'
                    +	'.minititle {'
                    +		'background-color: #EAEAEA;'
                    +		'margin-bottom: 10px;'
                    +		'padding: 0 5px 0 10px;'
                    +		'height: 42px;'
                    +		'}'
                    +	'.minititle h2 {'
                    +		'line-height: 42px;'
                    +		'}'
                    +	'ul.navlinks {'
                    +		'margin: 0 0 0 46px;'
                    +		'}';

                pageWidth < 1800 && ( css += ''
                    +	'.thumblist .bx .bx_1line {'
                    +		'position: absolute;'
                    +		'width: calc( 100% - 17px );'
                    +		'}' );
                //CssHead.html().length < 10 &&
                CssHead.empty().append( css.formatString() );
            },
            fullCss     : function( input ){
                $('html').addClass('fullplayer');
                var css, CssHead = $('#fullCss'),
                    margin = 8,
                    inputSize = input || 3,
                    pageWidth = $(window).width() - ( ( margin * 2 ) + inputSize ),
                    pageHeight = $(window).height() - ( ( margin * 2 )  + 14 );
                css = ''
                    +	'.reloadButton, header, br, .menu-video, .video-details, .video_panel, .related-videos, '
                    +	'.clear, .related, #popup_content, .overheaderbanner, footer, #vz_im_ad {'
                    +		'display: none !important;'
                    +		'}'
                    +	'html {'
                    +		'overflow: hidden;'
                    +		'background-color: rgba(247, 54, 28, 0.85);'
                    +		'}'
                    +	'body {'
                    +		'padding-right: 2px;'
                    +		'height: 0px;'
                    +		'}'
                    +	'.conteiner>div {'
                    +		'margin: '+( 7 + margin )+'px auto !important;'
                    +		''
                    +		'}'
                    +	'.nwrap {'
                    +		'width: '+pageWidth+'px !important;'
                    +		'max-width: '+pageWidth+'px !important;'
                    +		'}'
                    +	'#video {'
                    +		'box-shadow: 0.4px 0px 10px 4px rgba(141, 0, 0, 0.87);'
                    +		'border-radius: 6px;'
                    +		'}'
                    +	'.video-details {'
                    +		'width: calc( '+pageWidth+'px - 18px );'
                    +		'}'
                    +	'.playerholder {'
                    +		'width: calc( '+pageWidth+'px - 9px ) !important;'
                    +		'height: calc( '+pageHeight+'px - 11px ) !important;'
                    +		'margin: 4px; padding-bottom: 0 !important'
                    +		'}';
                CssHead.empty().append( css.formatString() );
            },
            bxCss       : function( i ){
                var css, CssHead = $('#bxCss');
                css = ''
                    +	'.thumblist .bx {'
                    +		'min-height: '+( i + ( 13 + 13 + 21 + 29 ) )+'px;'
                    +		'}';
                CssHead.empty().append( css.formatString() );
            },
            tmCss       : function( ){
                var css, CssHead = $('#tmCss');
                css = ''
                    +	'#holderTM {'
                    +		'position: fixed;'
                    +		'top: 50%;'
                    +		'left: 50%;'
                    +		'width: 0px;'
                    +		'height: 0px;'
                    +		'z-index: 100000;'
                    +		'}'
                    +	'.wrapperTM {'
                    +		'position: absolute;'
                    +		'transform: translate( -50%, -50% );'
                    +		'background-color: rgba( 250, 244, 241, 0.91 );'
                    +		'border-radius: 20px;'
                    +		'border-width: 5px;'
                    +		'border-style: ridge;'
                    +		'border-color: rgb( 229, 78, 41 );'
                    +		'padding-bottom: 15px;'
                    +		'}'
                    +	'.contentTM {'
                    +		'padding: 20px;'
                    +		'box-sizing: border-box;'
                    +		'float: left;'
                    +		'overflow: auto;'
                    +		'min-height: 300px'
                    +		'}'

                    +	'a.monkeySettings.openCloseTM span {'
                    +		'cursor: pointer;'
                    +		'}'

                    +	'i#closeButton {'
                    +		'position: absolute;'
                    +		'z-index: 1000;'
                    +		'right: 4px;'
                    +		'top: 2px;'
                    +		'text-shadow: 0px 0px 3px rgb( 178, 37, 37 );'
                    +		'color: rgb( 244, 244, 244 );'
                    +		'}'
                    +	'i#closeButton:hover {'
                    +		'color: rgb( 145, 49, 26 );'
                    +		'text-shadow: 0px 0px 4px #91311A;'
                    +		'margin-left: -1px;'
                    +		'cursor: pointer;'
                    +		'}'
                    +	'i#menuButton {'
                    +		'position: absolute;'
                    +		'z-index: 1000;'
                    +		'left: 4px;'
                    +		'top: 2px;'
                    +		'text-shadow: 0px 0px 3px rgb( 178, 37, 37 );'
                    +		'color: rgb( 244, 244, 244 );'
                    +		'}'
                    +	'i#menuButton:hover {'
                    +		'color: rgb( 145, 49, 26 );'
                    +		'text-shadow: 0px 0px 4px #91311A;'
                    +		'margin-left: -1px;'
                    +		'cursor: pointer;'
                    +		'}'

                    +	'.contHeadTM {'
                    +		'text-align: center;'
                    +		'font-weight: bold;'
                    +		'font-variant: small-caps;'
                    +		'font-size: 46px;'
                    +		'}'
                    +	'.firstLine {'
                    +		'font-style: italic;'
                    +		'font-weight: bold;'
                    +		'font-size: 20px;'
                    +		'}'
                    +	'.normPresentation {'
                    +		'font-size: 18px;'
                    +		'line-height: 22px;'
                    +		'}'
                    +	'.normPresentation p {'
                    +		'text-indent: 32px;'
                    +		'margin-bottom: 10px;'
                    +		'}'

                    +	'.contBodyTM em {'
                    +		'color: rgb( 217, 78, 44 );'
                    +		'}'
                    +	'.contBodyTM .menuTM:not(.pageLi), .contBodyTM .external {'
                    +		'color: blue;'
                    +		'cursor: pointer;'
                    +		'}'
                    +	'.contBodyTM .click {'
                    +		'color: blue;'
                    +		'cursor: pointer;'
                    +		'}'

                    +	'#holderTM .foot {'
                    +		'position: absolute;'
                    +		'bottom: 0;'
                    +		'width: 100%;'
                    +		'padding: 0 6px;'
                    +		'box-sizing: border-box;'
                    +		'}'

                    +	'#holderTM span.checkbox {'
                    +		'float: left;'
                    +		'line-height: 34px;'
                    +		'margin-left: 2px;'
                    +		'width: 164px;'
                    +		'position: absolute;'
                    +		'bottom: 0px;'
                    +		'left: 5px;'
                    +		'z-index: 10;'
                    +		'}'
                    +	'#holderTM .foot .copyright {'
                    +		'float: right;'
                    +		'line-height: 34px;'
                    +		'margin-right: 5px;'
                    +		'}'

                    +	'#holderTM .menuOff .foot {'
                    +		'text-align: center;'
                    +		'}'
                    +	'#holderTM .menuOff .foot .copyright {'
                    +		'float: none;'
                    +		'margin-left: 12.5px;'
                    +		'}'


                    +	'.myMenu li, .myMenu li a {'
                    +		'line-height: 28px;'
                    +		'height: 28px;'
                    +		'width: 100%;'
                    +		'display: inline-block;'
                    +		'cursor: pointer;'
                    +		'}'

                    +	'ul.pagerUl.myMenu li:not(.nPageShow):not(.active) {'
                    +		'display:none;'
                    +		'}'
                    +	'ul.myMenu {'
                    +		'margin-left: -10px;'
                    +		'}'
                    +	'.myMenu li {'
                    +		'padding-left: 10px;'
                    +		'border-radius: 5px;'
                    +		'border-style: groove;'
                    +		'border-width: 2px;'
                    +		'margin-bottom: 5px;'
                    +		'background-color: rgb( 244, 244, 244 );'
                    +		'}'
                    +	'.myMenu li:hover:not(.active ) {'
                    +		'background-color: rgb( 145, 49, 26 );'
                    +		'box-shadow: 1px 1px 2px 0px #1D0601;'
                    +		'border-color: rgb( 229, 78, 41 );'
                    +		'border-style: outset;'
                    +		'border-width: 2px;'
                    +		'margin-left: -1px;'
                    +		'}'
                    +	'.myMenu li:active {'
                    +		'background-color: rgb( 117, 93, 12 );'
                    +		'}'
                    +	'.myMenu li:hover:not(.active ) a {'
                    +		'color: rgb( 233, 228, 224 );'
                    +		'text-shadow: 0px 0px 6px rgba( 255, 255, 255, 0.6 );'
                    +		'}'
                    +	'kk.myMenu li.pageHide:not(:nth-last-child(-n+2)):not(:nth-child(-n+3)):not(.active) {'
                    +		'display: none;'
                    +		'}'

                    +	'#myForm input, #myForm textarea {'
                    +		'float: right;'
                    +		'width: 200px;'
                    +		'}'
                    +	'#myForm textarea {'
                    +		'width: 198px;'
                    +		'height: 80px;'
                    +		'}'
                    +	'#myForm ul.myMenu {'
                    +		'width: 64px;'
                    +		'margin-left: 20px;'
                    +		'}'
                    +	'#myForm ul.myMenu li {'
                    +		'padding: 5px 12px 5px 20px;'
                    +		'}'

                    +	'#aboutTM #table {'
                    +		'display: table;'
                    +		'}'
                    +	'#aboutTM #table .row {'
                    +		'display: table-row;'
                    +		'}'
                    +	'#aboutTM #table .label, #aboutTM #table .details {'
                    +		'display: table-cell;'
                    +		'padding-bottom: 8px;'
                    +		'line-height: 20px;'
                    +		'}'
                    +	'#aboutTM #table .label {'
                    +		'width: 120px;'
                    +		'font-weight: bold;'
                    +		'}'

                    +	'#helpTM .row {'
                    +		'display: table-row;'
                    +		'}'
                    +	'#helpTM .label, #helpTM .details {'
                    +		'display: table-cell;'
                    +		'}'
                    +	'#helpTM .label {'
                    +		'padding-left: 33px;'
                    +		'width: 133px;'
                    +		'}'
                    +	'#helpTM .details {'
                    +		'padding-bottom: 8px;'
                    +		'line-height: 20px;'
                    +		'}'
                    +	'#helpTM h4 {'
                    +		'padding-bottom: 10px;'
                    +		'}'
                    +	'#helpTM .mouseNav {'
                    +		'padding-left: 33px;'
                    +		'padding-top: 10px;'
                    +		'}'

                    +	'#configTM .description {'
                    +		'margin: 10px 0 5px 10px;'
                    +		'}'
                    +	'#configTM .row {'
                    +		'display: table-row;'
                    +		'}'
                    +	'#configTM .label, #configTM .details {'
                    +		'display: table-cell;'
                    +		'}'
                    +	'#configTM .label {'
                    +		'padding-left: 25px;'
                    +		'width: 75px;'
                    +		'}'
                    +	'#configTM input[type="radio"] {'
                    +		'margin-right: 7px;'
                    +		'top: 1.5px;'
                    +		'cursor: pointer;'
                    +		'transform: scale(1.4);'
                    +		'transform-origin: center center;'
                    +		'position: relative;'
                    +		'}'

                    +	'#configTM #full .row {'
                    +		'padding: 10px 0;'
                    +		'display: table;'
                    +		'}'
                    +	'#configTM #full .row span {'
                    +		'margin-right: 10px;'
                    +		'}'

                    +	'#configTM #more .label {'
                    +		'width: 200px;'
                    +		'padding-right: 20px;'
                    +		'padding-bottom: 10px;'
                    +		'padding-top: 5px;'
                    +		'font-weight: 600;'
                    +		'}'
                    +	'#configTM #more .details {'
                    +		'vertical-align: middle;'
                    +		'}'

                    +	'#configTM form#columns {'
                    +		'margin: 16px 0;'
                    +		'}'
                    +	'#configTM form#columns h4 {'
                    +		'margin-bottom: 10px;'
                    +		'}'
                    +	'#configTM form#columns .details span {'
                    +		'margin-right: 15px;'
                    +		'}'
                    +	'#configTM ul#setColSize {'
                    +		'margin: auto;'
                    +		'width: 250px;'
                    +		'}'
                    +	'#configTM ul#setColSize li a.menuTM {'
                    +		'text-align: center;'
                    +		'color: black;'
                    +		'}'
                    +	'#configTM ul#setColSize li {'
                    +		'padding: 0;'
                    +		'}'
                    +	'#configTM ul#setColSize li:hover a.menuTM {'
                    +		'color: aliceblue;'
                    +		'}'
                    +	'#configTM #pageSize span, #configTM #columns span {'
                    +		'line-height: 24px;'
                    +		'}'

                    +	'#pagerTM {'
                    +		'text-align: center;'
                    +		'position: relative;'
                    +		'height: 40px;'
                    +		'line-height: 40px;'
                    +		'overflow: hidden;'
                    +		'}'

                    +	'#pagerTM ul.pagerUl {'
            //        +		'position: absolute;'
            //        +		'left: 66%;'
            //        +		'transform: translateX( -50% );'
            //        +		'width: 100%;'

                    +		'display: inline-block;'
                    +		'margin: 0;'

                    +		'}'
                    +	'#pagerTM ul.pagerUl li {'
                    +		'float: left;'
                    +		'padding: 0px 10px;'
                    +		'width: initial;'
                    +		'margin: 0 5px;'
                    +		'}'

                    +	'#videoTM {'
                    +		'width: 100% !important;'
                    +		'margin-bottom: -20px;'
                    +		'margin-top: -25px;'
                    +		'}'
                    +	'#videoTM p.firstLine {'
                    +		'margin-bottom: 5px;'
                    +		'text-align: center;'
                    +		'}'
                    +	'#videoTM .firstLine a.menuTM {'
                    +		'font-size: 13px;'
                    +		'font-weight: 400;'
                    +		'line-height: 22px;'
                    +		'position: relative;'
                    +		'top: -2px;'
                    +		'margin-left: 10px;'
                    +		'display: inline-block;'
                    +		'color: blue;'
                    +		'}'

                    +	'#updatedTM span.table {'
                    +		'display: table;'
                    +		'}'
                    +	'#updatedTM .group {'
                    +		'display: table-row-group;'
                    +		'}'
                    +	'#updatedTM .block {'
                    +		'display: table-row;'
                    +		'}'
                    +	'#updatedTM .cell {'
                    +		'display: table-cell;'
                    +		'}'
                    +	'#updatedTM .cell.c1 {'
                    +		'width: 40px;'
                    +		'}'
                    +	'#updatedTM .cell.c2 {'
                    +		'width: 90px;'
                    +		'}'
                    +	'#updatedTM .block .c12 {'
                    +		'padding-bottom: 15px;'
                    +		'}'

                    +	'#updatedTM .group:nth-child( 2n+1 ) {'
                    +		'background-color: rgb( 244, 244, 244 );'
                    +		'}'
                    +	'#updatedTM .group:nth-child( 2n+2 ) {'
                    +		'background-color: rgba( 243, 222, 217, 0.36 );'
                    +		'}'
                    +	'#updatedTM .block.top .cell {'
                    +		'border-top-width: 1px;'
                    +		'padding: 5px 8px 0px;'
                    +		'font-weight: 600;'
                    +		'}'
                    +	'#updatedTM .block.botton .cell {'
                    +		'vertical-align: middle;'
                    +		'padding: 8px 8px;'
                    +		'}'
                    +	'#updatedTM .block .cell.c1, #updatedTM .block .cell.c10 {'
                    +		'border-left-width: 1px;'
                    +		'}'
                    +	'#updatedTM .block .cell.c3, #updatedTM .block .cell.c12 {'
                    +		'border-right-width: 1px;'
                    +		'}'
                    +	'#updatedTM .contBodyTM {'
                    +		'border-bottom: 1px;'
                    +		'border-style: outset;'
                    +		'}'
                    +	'#updatedTM *:not(li) {'
                    +		'border-color: rgb( 157, 138, 125 );'
                    +		'border-style: double;'
                    +		'}'
                    +	'#updatedTM #pagerTM {'
                    +		'margin-top: 10px;'
                    +		'}'

                    +	'.wrapperTM li.active {'
                    +		'border-color: #91311A;'
                    +		'background-color: #F1E5E1;'
                    +		'border-width: 1px;'
                    +		'margin: 1px 6px 7px 1px !important;'
                    +		'line-height: 27px;'
                    +		'height: 27px;'
                    +		'}'
                    +	'.wrapperTM li.active a {'
                    +		'margin-top: -1px;'
                    +		'}'
                    +	'.wrapperTM #pagerTM ul.pagerUl li {'
                    +		'margin-left: 5px !important;'
                    +		'}';

                CssHead.empty().append( css.formatString() );
            }
        },
        fn          = {
            isNumeric   : function( value ) {
                return /^\d+$/.test( value );
            },
            obj2Str     : function( obj ){
                var objArr = $.makeArray(obj);
                return objArr[0].outerHTML;
            },
            imgHeightSub: function( id ){
                var imgHeight = config.imgHeight || 0, thisImg = $( id ).height();
                imgHeight = thisImg > imgHeight ? thisImg : imgHeight;
                imgHeight > 66 && imgHeight > config.imgHeight && (
                    css.bxCss( imgHeight + 1 ),
                        config.imgHeight = imgHeight );
            },
            imgHeight   : function( ){
                $('.thumblist').find('.bx').each(function(){
                    var $this = $( this ), id = '#' + $this.find('.tplace').attr('id');
                    fn.imgHeightSub( id );
                });
            },
            minMaxCurrent : function(  ){
                var minElem = $('li.min.current'),
                    min =  parseInt( minElem.data('minute') ),
                    maxElem = $('li.max.current'),
                    max =  parseInt( maxElem.data('minute') );
                $('.minMaxWrapper').removeClass('current');
                ( min !== 0 || min > max ) && minElem.parents('.minMaxWrapper').addClass('current');
                ( max !== 36000 || max < min ) && maxElem.parents('.minMaxWrapper').addClass('current');
            },
            minMax      : function( min, max ){
                min = min === undefined ? GM_getValue( 'videoMin' ) : min;
                max = max === undefined ? GM_getValue( 'videoMax' ) : max;

                $('.thumblist').find('.bx').each(function( i, e ){
                    var $this = $( e ),
                        len = parseInt( $this.attr('data-length') );
                    $this[ ( len >= min && len <= max ) ? 'addClass' : 'removeClass' ]( 'showThumb' );
                });
            },
            videoAttributes : function( ){
                //        if( $('.bx.hd, .bx.sd').length === $('.bx').length ) return false;
                $('.thumblist').find('.bx').each(function( i, e ){
                    i++;
                    var $this = $( e ),
                        unsorted = $this.data('unsorted'),
                        id = '#' + $this.find('.tplace').attr('id');
                    $this.removeClass('lastrow')
                        .attr('data-unsorted',  unsorted !== undefined ? unsorted : i.toString().lpad('0',2) )
                        .attr('data-length',    fn.videoLen( $this.find('.time').text() ).toString().lpad('0',6 ) )
                        .attr('data-date',      fn.videoDate( $this.find('.vtime').text() ).toString().lpad('0',8 ) )
                        .attr('data-views',     fn.videoViews( $this.find('.ileft').text() ).toString().lpad('0',8 ) )
                        .attr('data-rating',    fn.videoRating( $this.find('.iright.upperc').text() ).toString().lpad('0',3 ) )
                        .addClass( $this.find('.time img').length ? 'hd' : 'sd' )
                        .find('.time').appendTo( $this.find('.thumb') );
                    $( id ).load(function() {
                        fn.imgHeightSub( id ); });
                });
            },
            videoRating : function( val ){ // 88%
                return val.split('%').shift();
            },
            videoViews  : function( val ){ // 12,889 views
                return val.split(' ').shift().split(',').join('');
            },
            videoDate   : function( val ){  // 24mo ago,  11days ago,  4h ago,  49min ago
                var arr    = ['mo','day','h','min'],
                    multi  = [ 60*24*30, 60*24, 60, 1 ],
                    newVal = 0, type = 0;
                $.each( arr, function( i, e ){
                    newVal = val.search( e ) !== -1 ? val.split( e ) : '';
                    newVal.length > 0 && ( newVal = parseInt( newVal[0] ), type = i );
                    if( newVal > 0 ) return false;
                });
                return newVal * multi[ type ] + '';
            },
            videoLen    : function( val ){  // 1:24:16
                var sec = 0;
                $.each( val.replace(/\s+/g, '').split(':').reverse(), function( i, e ){
                    e = parseInt( e );
                    sec += i === 0 ? e : i === 2 ? 60 * 60 * e : 60 * e;
                });
                return sec;
            },
            thumbCounter: function( ){
                $('#Count').html( 'Count: ' + $('.thumblist .bx:visible').length + ' / ' +  $('.thumblist .bx').length );
            },
            esc         : function( ){
                $('#fullCss').empty();
                $('html').removeClass('fullplayer');
            },
            active      : function( command ){
                $( '#menuTM').find('.active' ).removeClass('active').end()
                    .find('a[data-command=' + command + ']' ).parent().addClass('active');
            },
            sortMenu    : function( ){
                var arr = ['newest','longest','views','rating','favorites','comments','votes'],
                    locDoc = config.locDoc, thisSort = '';

                $.each(arr,function(key,value){
                    locDoc.search( value ) > 0 && ( thisSort = value );
                });

                thisSort = thisSort.length < 2 ? 'newest' : thisSort;

                $('.account-menu').find('a').each(function(i,el){
                    var elem = $( el );
                    elem.attr('href', elem.attr('href') + thisSort );
                });

                GM_xmlhttpRequest({
                    method: "GET",
                    url: "http://www.vporn.com/",
                    crossDomain: false,
                    onload: function( res ) {
                        res = $( res.responseText ).find('.grayarea.wline');
                        $( res )
                            .find('ul>li').removeClass('current').wrap('<a href="http://www.vporn.com/newest"></a>').end()
                            .find('.sorts').attr('style','width: 100%;').end()
                            .find('.maincat').remove().end()
                            .find('.timefilter').remove().end()
                            .find('a').each(function(i,el){
                                var elem = $( el ), elemType = elem.attr('href').split('/').pop();
                                elem.attr('href', locDoc.search( thisSort ) > 0 ? locDoc.replace( thisSort, elemType ) : locDoc + '/' + thisSort );
                                thisSort === elemType && elem.find('li').addClass('current').unwrap();
                            });
                        $('.grayarea.wline').replaceWith( res );
                    }
                });
            },
            sortButtons : function( $e ){
                var sortFN = $e.data('fn'),
                    sortOrderElem = $('#sortOrder'),
                    sortOrder = sortOrderElem.attr('sortorder'),
                    tsortElem = $( '.thumblist .bx' ),
                    thisSort = $e.data('sort'),
                    activeElem = $('.thumbSort li[data-chk="1"].current'),
                    activeFN = activeElem.data('fn'),
                    activeSort = activeElem.data('sort');

                sortFN === 'sortOrder'
                    ? (
                        sortOrder = sortOrder != 'true',
        //                sortOrder = GM_getValue( 'sortOrder' ) || false,

                        sortOrderElem[ sortOrder ? 'addClass' : 'removeClass' ]('current'),
                        sortOrderElem.attr('sortOrder', sortOrder),
                        tsortElem.tsort({attr:'data-' + activeFN, order: ( sortOrder ? ( activeSort === 'asc' ? 'dec' : 'asc' ) : activeSort ) }),
                        GM_setValue('sortOrder', sortOrder )
                    ):
                    sortFN === 'HD'
                        ? (
                        toggleClassState( config, 'HD', 'Toggle' ),
                            GM_setValue('HD', $('html').hasClass('HD') ),
                            $e.toggleClass('current','off')
                            )
                        : $e.data('chk') === 1
                            && (
                                $('.thumbSort li[data-chk="1"]').removeClass('current'),
                                $e.addClass('current'),
                                tsortElem.tsort({attr:'data-' + sortFN, order: ( sortOrder ? ( thisSort === 'asc' ? 'dec' : 'asc' ) : thisSort ) }),
                                GM_setValue('sortState', sortFN )
                            );

                fn.thumbCounter();
            },
            initSort    : function( ){
                //noinspection JSJQueryEfficiency
                GM_getValue( 'sortOrder' ) && $('#sortOrder').addClass('current');
                //noinspection JSJQueryEfficiency
                $('#sortOrder').attr('sortOrder', GM_getValue( 'sortOrder' ) ? false : true );

                $('.sortscontain')
                    .find('li.min[data-minute='+ GM_getValue( 'videoMin' )+ ']').addClass('current').end()
                    .find('li.max[data-minute='+ GM_getValue( 'videoMax' )+ ']').addClass('current');
                fn.minMaxCurrent();

                GM_getValue('HD') === true && fn.sortButtons( $('li#HD') ) ;
                fn.sortButtons( $('.thumbSort li[data-fn='+ GM_getValue('sortState') +']') );
                fn.sortButtons( $('.thumbSort li[data-fn=sortOrder]') );
            },
            chkPager    : function( ){
                var elem = $('.pagerwrap');
                elem.parents().is('.related') && elem.hide();
            },
            timeDate    : function( d, /* Date instance */ fo /* Format string */ ){
                var f = fo || ' ';
                return f.replace( // Replace all tokens
                    /{(.+?)(?::(.*?))?}/g, // {<part>:<padding>}
                    function (
                        v, // Matched string (ignored, used as local var)
                        c, // Date component name
                        p // Padding amount
                        ) {
                        //noinspection StatementWithEmptyBodyJS
                        for(v = d["get" + c]() // Execute date component getter
                            + /h/.test(c) // Increment Mont(h) components by 1
                            + ""; // Cast to String
                            v.length < p; // While padding needed,
                            v = 0 + v); // pad with zeros
                        return v; // Return padded result
                    });
            },
            submitForm  : function( ){
                var name       = $('#cname').val(),
                    email      = $('#cemail').val(),
                    subject    = $('#csubject').val(),
                    text       = $('#ccomment').val(),
                    dateParam  = function(){
                        return "{FullYear}-{Month:2}-{Date:2} {Hours:2}:{Minutes:2}:{Seconds:2}";
                    },
                    date       = function(){
                        return new Date();
                    };
                $.ajax({
                    type: 'POST',
                    url: 'https://mandrillapp.com/api/1.0/messages/send.json',
                    data: {
                        'key': 'Hk5nxsMx5Ov4zVL7GHJkSQ',
                        'message': {
                            'from_name' : name,
                            'from_email': email,
                            'to': [{ 'email': '[email protected]' }],
                            'auto_text': true,
                            'subject': 'myUserScript: VPorn.com' + subject,
                            'text': text + '\r\r\t TimeStamp: ' + date //fn.timeDate(date,dateParam)
                        }
                    }
                }).done(function(response) {
                        console.log(response); // if you're into that sorta thing
                    });
            },
            setColSize  : function( page ){
                var configTM = $( '#configTM' );
                if( $('.switchAble').data('page') == 1 ) {
                    GM_setValue('pageWidth', configTM.find('#pageSize input.size:checked').val()),
                        GM_setValue('thumbCol', configTM.find('#columns input.col:checked').val());
                } else {
                    $.each( sharedData.settings2(), function(i,e) {
                        c.i('nr: ' + i +', ' + e.name + ', ' + e.title + '.');
                        GM_setValue( e.name, configTM.find( '#more input.' + e.name ).val() );
                    });
                }
                configTM.find('#setColSize .menuTM').text('Settings are now Saved');
            },
            fullPlayer 	: function( type ){
//                $( '#fullPlayer' ).length || css.style('fullPlayer');
                config.pageWidth === 'orgWidth' || toggleClassState( config, 'fullPlayer', type );
                $('.pager').length || config.pageWidth === 'orgWidth' || GM_setValue('fullPlayer', config.fullPlayer );
            },
            loadHref	: function( dir ){
                var pager = $('.pager').find( 'a.' + dir ).attr('href');
                pager !== undefined && $( location ).attr('href', pager );
            },
            runCommand  : function( elem ){
                c.i('menuTM', elem );
                var $this = elem, command = $this.data('command'), page = $this.data('page'), back = $this.data('back'),
                    vHeight = $this.data('height'), vWidth = $this.data('width'), vSrc = $this.data('src'), firstLine = $this.find('span').text();
                c.i('command',command);
                c.i('page',page);
                config.commandos = command;
                switch( command ){
                    case 'about'      : html.aboutTM();                                                 break;
                    case 'firstIntro' : html.welcomeTM();                                               break;
                    case 'config'     : html.configTM( page );                                          break;
                    case 'help'       : html.helpTM( page , 400);                                       break;
                    //    case 'similar'    : html.otherScript();                                               break;
                    case 'update'     : html.updatedTM.render( page );                                  break;
                    case 'latest'     : html.latestTM();                                              break;
                    case 'video'      : html.videoTM( vHeight, vWidth, vSrc, firstLine, back, page );   break;
                    case 'menu'       : html.sideTM();                                                  break;
                    case 'donate'     : html.donateTM();                                                break;
                    case 'submit'     : fn.submitForm();                                                break;
                    case 'setColSize' : fn.setColSize();                                                break;
                    case 'contact'    : html.contactTM();                                               break;
                    default           :                                                                 break;
                }
                command !== 'setColSize' && fn.active( command === 'latest' ? 'update' : command );
            }
        },
        listeners   = {
            resize      : function( ){
                $(window).resize(function(){
                   $('html').hasClass('fullplayer')
                       ? css.fullCss(18)
                       : (
                           config.startWidth(),
                           css.basicCss(),
                           config.imgHeight = 0,
                           fn.imgHeight()
                       );
                });
            },
            navKey      : function( ){
                document.addEventListener('keydown', function(e){
                    if( $('input').is(':focus') ) return false;

                    var key = e.keyCode;
                    ( key == 37 || key == 39 ) && ( fn.loadHref( key == 37 ? config.prevDoc : config.nextDoc ));
                    key == 66 && css.fullCss();
                    key == 27 && fn.esc();
                }, false);
            },
            navThumb    : function( e ){
                c.i('navThumb');
                var ContentElem     =   $( e ),
                    ContentLeft     =   parseInt( ContentElem.offset().left ),
                    ContentRight    =   ContentLeft + ContentElem.width();
                $(document).on('mouseup','body, #content',function(e){
                    var X_spot      =   e.clientX;
                    this == e.target && e.which == 1 && (
                        ( X_spot < ContentLeft || X_spot > ContentRight ) && (
                            fn.loadHref( config[ X_spot < ContentLeft ? 'prevDoc' : 'nextDoc' ] ) ) ); });
                listeners.navKey();
            },
            navVideo    : function( ){
                $(document).on('mouseup','#content, html.fullplayer',function(e){
                    this == e.target && e.which == 1 && g.ms === 0 && (
                        g.timer(64), $('html').hasClass('fullplayer') ? fn.esc() : css.fullCss() );
                });
                listeners.navKey();
                listeners.resize();
                html.reloadButton();
                listeners.reloadButton();
            },
            reloadButton: function( ){
                $( document ).on('mousedown', '.reloadButton img', function(e){
                    this == e.target && e.which == 1 && $( location ).attr( 'href', config.locDoc );
                });
            },
            sortButtons : function( ){
                $( document ).on('click', '.thumbSort li', function(e){
                    this == e.target && e.which == 1 && (
                        fn.sortButtons( $( this ) ),
                        fn.thumbCounter()
                    );
                });
            },
            minMax      : function( ){
                $( document ).on('mousedown', '.minMaxWrapper li', function(e){
                    var min,max;
                    $( this ).hasClass('min') && ( min = $( this ).data('minute') );
                    $( this ).hasClass('max') && ( max = $( this ).data('minute') );
                    this == e.target && e.which == 1 && (
                        $( this ).addClass('current').siblings().removeClass('current'),
                            min !== undefined && GM_setValue('videoMin', min ),
                            max !== undefined && GM_setValue('videoMax', max ),
                            fn.minMax( min,max ),
                            fn.minMaxCurrent(),
                            fn.thumbCounter()
                    );
                });
            },
            menuButtonTM: function( ){
                $( document ).on('mouseup','#menuButton',function(evt){
                    var elem = $('#menuTM'), width = $('.switchAble').width();
                    evt.which === 1 && evt.target === this && (
                        config.menuState = config.menuState ? false : true,
                        $('.wrapperTM')[ !config.menuState ? 'addClass' : 'removeClass' ]('menuOff'),
                        elem.length == 1 ? elem.toggle(0) : html.sideTM(),
                        html.wrapWidth( width + 40 )
                    );
                });
            },
            openCloseTM : function( ){
                $( document ).on('mousedown','.openCloseTM',function(evt){
                    var elem = $('#holderTM');
                    evt.which === 1 && evt.target === this && (
                        evt.ctrlKey
                            ? (
                                GM.manager('del'),
                                alert('GM Settings are deleted')
                                )
                            : elem.length == 1 ? elem.toggle(256) : render.tm()
                    );
                });
            },
            menuTM      : function( ){

                $( document ).on('mouseup','li',function(e){
                    e.which === 1 && e.target === this && fn.runCommand( $(this).find('.menuTM') );
                });
                $( document ).on('mouseup','.menuTM',function(e){
                    e.which === 1 && e.target === this && fn.runCommand( $(this) );
                    c.i('menuTM');
                    e.preventDefault();
                });
                $( document ).on('mouseup','#holderTM .contentTM ul.myMenu + span input',function(){
                    GM_setValue('menuState', $( this ).is(':checked') ? false : true );
                });
            },
            setColSize  : function( ){
                var reloadCss = function(){
                    html.configTM( $('.switchAble').data('page')  );
                    c.i('Save Settings');
                    $( '#setColSize' ).find('.menuTM').text('Save Settings');

                    config.startWidth();
                    css.basicCss();

                    setTimeout(function(){
                        config.imgHeight = 0;
                        fn.imgHeight();
                    },1000);

                    c.i('setColSize');
                    $('.video-details')[ config.pageWidthNR < 1400 ? 'addClass' : 'removeClass']('small');
                };
                $(document).on('click','#configTM #pageSize input.size', function(){
                    c.i('setSize input.size');
                    var val = $( this ).val();
                    config.pageWidth = val;
                    config.pageWidthNR = config[val];
                    reloadCss(); });

                $(document).on('click','#configTM #columns input.col', function(){
                    c.i('setCol input.col');
                    config.thumbCol = $( this ).val();
                    reloadCss(); });
            }
        },
        html        = {
            createDialog  : function( id, content, width, state ){
                var elem = '', inWidth = width, valWidth;
                $.each( sharedData.dialogs(), function(i,val){
                    if( val.id == id ){
                        c.i('createDialog id', val.id );
                        valWidth = val.width;
                        width = inWidth || valWidth == 'default' ? sharedData.dialogWidth : valWidth;
                        elem = html.contentTM( id, 'switchAble', width )
                            .prepend( html.contHeadTM( val.head ) )
                            .append( html.contBodyTM( $('<span/>',{ html: html.wrapTag( val.firstLine, 'p', 'firstLine' ) }).append( content ).html() ) );
                        return false;
                    }
                });
                html.wrapWidth( width );
                html.switcher( elem, state );
                c.i('createDialog Elements', elem.find('*').length ); c.i('createDialog html', fn.obj2Str( elem ) ); c.i('createDialog length', fn.obj2Str( elem ).length );
            },
            wrapWidth   : function ( width ){
                var menuWidth = config.menuState ? 175 : 0;
                $('.wrapperTM').width(menuWidth + width);
            },

            switcher    : function ( elem, state ){
                state === false && ( config.menuState = false, $('#menuTM').hide() );
                var switchAble = $('.switchAble');
                switchAble.length == 1
                    ? switchAble.replaceWith( elem )
                    : elem.prependTo('.wrapperTM');
            },
            wrapTag     : function ( text, tag, style ){
                style = style || '';
                return $('<' + tag + '/>', {class: style, html: text});
            },

            li_Item     : function ( txt, cl, data, page ){
                return $('<li>').append(cl == 'external' ? a(txt, data) : l(txt, cl, data, page));
            },
            singleRow   : function ( label, text ){
                var outer = $('<div/>', {class: 'row'});
                return outer
                    .append($('<span/>', {class: 'label', text: label + ':'}))
                    .append($('<span/>', {class: 'details', html: text}));
            },
            pager       : function ( pageType, page, pageEnd, text ){
                var elem    = $('<div/>', { id: 'pagerTM' }),
                    ul      = $('<ul/>', { class: 'pagerUl myMenu' }),
                    txt     = text || 'page: ',
                    back = txt,
                    BA      = 2,
                    that    = this,
                    li      = function ( i, first, last, next, prev ) {
                       // txt = parseInt(txt).length ? parseInt(txt) : txt;
                        txt = txt !== back ? txt.removeEnds( back.length ).replace('Firs','').replace('Nex','').replace('Pre','') : txt;
                        //txt = txt.inElem('Firs') ? txt : txt;
                        txt = config.commandos === 'latest' ? 'Archive' :
                            ( first || last || next || prev )
                                ? first ? 'First' : last ? 'Last' : next ? 'Next' : prev && 'Prev'
                                : txt + i;

                        return that .li_Item( txt, 'menuTM pageLi', pageType, i )
                                    .addClass( i === page ? 'active' : '' )
                                   // .addClass( i === page ? 'active' : i < page ? 'newer' : i > page && 'older' )
                                   // .addClass( 'page' + ( i < ( page - BA ) || i > ( page + BA ) ? 'Hide':'Show' ) )
                        ;
                    };

                var i = 1, first, last, next, prev;
                for ( i; i < pageEnd + 1; i++) {
                    first = i === 1, last = i === ( pageEnd ), next = i === page + 1, prev = i === page - 1;
                    config.commandos !== 'latest'
                        ? ul.append( li( i, first, last, next, prev ) )
                        : config.commandos === 'latest' && first && ul.append( li( i, first, last ) );

                }

                pageType === 'update' && ul.prepend( this.li_Item( 'Latest', 'menuTM pageLi', 'latest', 0 ) );

                ul.find('a[data-text="Latest"], a[data-text="First"], a[data-text="Prev"], a[data-text="Next"], a[data-text="Last"], a[data-text="Archive"], a[data-command="help"]').parent().addClass('nPageShow');

                return elem.append( ul );
            },
            embeded     : function ( height, width, src ){
                return $('<iframe/>', {height: height, width: width, src: src, frameborder: 0, wmode:'transparent', allowfullscreen: true});
            },
            closeButton : function ( ){
                return $('<i/>', {id: 'closeButton', class: 'fa fa-times-circle fa-2x openCloseTM'});
            },
            menuButton  : function ( ){
                return $('<i/>', {id: 'menuButton', class: 'fa fa-bars fa-2x'});
            },
            copyright   : function ( ){
                var span = function (cl) {
                        return $('<span/>', {class: cl});
                    },
                    copy = $('<i/>', {class: 'fa fa-copyright'}),
                    span1 = span('copyright').text( ' ' + sharedData.copyrightYear + sharedData.myName ).prepend(copy);
                $('<div/>', {class: 'foot'}).append(span1).appendTo('.wrapperTM');
            },
            reloadButton   : function ( ){
                var span = function () { return $('<div/>', {class: 'reloadButton'}); },
                    alink = function () { return $('<a/>', {href: 'javascript:;'}) },
                    img = function () { return $('<span/>', {src: ''}) };

                span().append( alink().append( img() ) ).prependTo('#video'); //.menu-video-right
            },

            thumbSort   : function( ){
                if( $('.thumbSort').length ) return false;
                var inserts = $('object#as3_js, #video_player video').length ? '.video-details' : '.minititle h1',
                    wrap    = $('<div/>', { class : 'thumbSort' }),
                    ul      = $('<ul/>', { class : 'sortscontain' }),
                    list    = function( text ){
                        var ul = $('<ul/>',{ class:'minMax' });
                        $.each( sharedData.minMax() , function( i, val ) {
                            ul.append( $('<li/>',{ class: text, text: val.min + 'min', 'data-minute': val.min * 60 }) ); });
                        return ul;
                    },
                    button  = function( text, sort, check ){
                        return $('<a/>',{ href: 'javascript:;' }).append(
                            ( text === 'min' || text === 'max' )
                                ? $('<li/>',{ class:'minMaxWrapper', html: list( text ) }).prepend( ( text === 'min' ? '<':'>' ) )
                                : $('<li/>',{ id: text, text: text.toUpperCase(), 'data-sort': sort, 'data-fn': text, 'data-chk': check } ) )
                    },
                    H1    = $('.minititle').find(' > h1').html();

                $.each( sharedData.thumbSort(), function(i,val){
                    ul.append( button( val.name, val.sort, val.chk )); });

                ul.find('#sortOrder').text('REVERCEORDER');

                $('.minititle > h1').empty().prepend( $('<span/>').append( H1 ) );

                wrap.append( ul )[ inserts === '.video-details' ? 'appendTo' : 'prependTo' ]( inserts );
                config.sorting = true;

            },
            StartTM     : {
                button      : $( '<i/>', { class: 'btn btn-default btn-sm openCloseTM', href: '#', text: 'TM' } ),
                menu        : function ( ){
                    return $( '<a/>', { class: 'monkeySettings openCloseTM' } )
                        .append( $( '<li/>', { html: $( '<span/>',{ text:'MonkeyScript Setting' } ) } )
                            .prepend( $( '<img>', {
                                src   : "http://www.vporn.com/images/new_images/my-settings.png",
                                width : "16", height: "16", alt: " "
                            } ) ) )
                        .append( $( '<hr>' ) );
                },
                render      : function ( ){
                    //noinspection JSCheckFunctionSignatures
                    config.inMenu
                        ? (
                            $(this.menu()).insertBefore('#open-small-log .pcl'),
                            refreshElement('.monkeySettings.openCloseTM',1000)
                        )
                        : $(this.button ).insertBefore('.authsection');
                }
            },
            holderTM    : function( ){
                $( '<span/>', { id: 'holderTM' }).appendTo('body');
            },
            wrapperTM   : function( ){
                $( '<div/>', { class: 'wrapperTM' })
                    .prepend( this.menuButton() )
                    .append( this.closeButton() )
                    .appendTo('#holderTM');
            },

            contHeadTM  : function( text ){
                return $( '<div/>', { class: 'contHeadTM', text: text });
            },
            contBodyTM  : function( html ){
                return $( '<div/>', { class: 'contBodyTM', html: html });
            },
            contentTM   : function( id, cl, width ){
                return $( '<div/>', { id:id, class: 'contentTM ' + cl, style:'width:' + width + 'px' });
            },
            sideTM      : function( ){
                var elem = html.contentTM(),
                    firstLine       = 'Menu',
                    render          = function(){
                        return  p(firstLine,'firstLine');
                    },
                    chk = $('<input/>', {type: 'checkbox'}).prop("checked", config.menuState ),
                    span1 = this.wrapTag( 'Always show menu', 'span', 'checkbox' ).prepend( chk );

                elem.attr('id','menuTM')
                    .css({'width':'175px'})
                    .append( this.contBodyTM( render() ))
                    .append( this.menuTM() )
                    .append( span1 );

                config.menuState ? elem.css('display','block') : elem.css('display','none');
                elem.prependTo('.wrapperTM');
                $('.wrapperTM')[ !config.menuState ? 'addClass' : 'removeClass' ]('menuOff');
                fn.active( 'firstIntro' );
                listeners.menuTM();
            },
            menuTM      : function( ){
                var elul = $( '<ul>', { class: 'myMenu' }),
                    sorted = sharedData.dialogs().sort(function(a, b){
                        return a.order - b.order; });
                $.each( sorted, function(i,val){
                    val.on == 1 && elul.append( html.li_Item( val.name, val.type, val.command, val.page ) );
                });
                return elul;
            },
            updatedTM   : {
                cell    : function( cl, html ){
                    return $('<span/>',{ class:'cell ' + cl, html: html } );
                },
                row1    : function( val ){
                    return $( '<div/>',{ class:'block top' } )
                        .append( this.cell( 'c1', val.ver ), this.cell( 'c2', val.date ), this.cell( 'c3', val.type + '-' + val.magnitude ) );
                },
                row2    : function( val ){
                    return $( '<div/>',{ class:'block botton' } )
                        .append( this.cell( 'c10', val.visible ), this.cell( 'c11', val.name ), this.cell( 'c12', val.desc + '.') );
                },
                fillArr : function( mode ){
                    var table  = $( '<span/>',{ class:'table'} ),
                        latest = sharedData.latestVersion,
                        page   = sharedData.updatesFirstPage,
                        append = function ( val ){
                            table.append(
                                $( '<div/>',{ class:'group', 'data-page': page } )
                                    .addClass( val.ver == latest ? 'latest':'old' )
                                    .append( that.row1( val ), that.row2( val ) ) )
                        },
                        lc     = 0,
                        that   = this;

                    $.each( sharedData.update(), function( i, val ){
                        latest == val.ver && lc++;
                        val.on == 1 && (
                            checkDividedIsInteger( i - lc, sharedData.updatesPerPage ) && page++,
                            mode == 'latest'
                                ? latest == val.ver && append( val )
                                : mode == page && append( val )
                        );
                    });

                    table.append( $( '<div/>',{ class:'group', html: html.pager( 'update', mode, page, ' ' ) }) );

                    return table;
                },
                render  : function( mode ){
                    html.createDialog( 'updatedTM', this.fillArr( mode ) );
                    $('#pagerTM').appendTo('#updatedTM');
                }
            },
            latestTM      : function () {
                html.updatedTM.render('latest');
                $('div#updatedTM .contHeadTM').text('Latest Update v' + sharedData.latestVersion);
                $('a.menuTM.pageLi[data-command = "latest"]').parent().addClass('active');
                fn.active('update');
            },
            aboutTM     : function( ){
                var table = $('<div/>',{ id: 'table', class:'test' });
                $.each( sharedData.about(), function( i, val ){
                    val.on == 1 && table.append( html.singleRow( val.name, val.desc ) );
                }),
                    html.createDialog( 'aboutTM', table );
            },
            welcomeTM   : function( ){
                var presentation    = 'Now you are part of something bigger. A New way to use this great site VPorn.com.\
                        \rThis is my first in line of series of scripts that will work with unique library of my functions. And this \
                        script will also inform you about whats '+cl('new','black')+' if there was an update. Also tells the news about other scripts that you \
                        may also be interested in.\rBefore you '+ em('start') +' using this script read the ' + l('instructions','menuTM','help',1) +' and listen ' +
                    'to my '+( v("video. ","1080","802","https://www.youtube-nocookie.com/embed/9chDANQxF2M?rel=0&amp;theme=light&amp;autohide=1","My First Test Embeded",'firstIntro',1 ) ) +
                    ' about this script.\rAlso Take a look at the '+ l('settings','menuTM','config',1) + ' that this user-script has.';

                html.createDialog( 'welcomeTM', p( presentation.toString(), 'normPresentation') );

            },
            configTM    : function( page ){
                var form            = function( ){
                        var objForm = function( name ){
                                return $('<form/>',{ id:name, name:name })
                            },
                            rad = function( value, no_Info ){
                                var Info    = value.length < 2 ? value : no_Info === undefined ? config[ value ] + ( value === 'fullWidth' ? ' %':' pixels.' ) : value,
                                    name    = value.length < 2 ? 'col'+ ' col' + value : 'size'+ ' ' + value,
                                    wrap    = $('<span/>',{ text: Info }),
                                    input   = $('<input/>',{ type:'radio', name:name, class:name, value:value });
                                return wrap.prepend( input );
                            },
                            chbox = function( val ){
                                var name    = 'cMore'+ ' ' + val.name,
                                    wrap    = $('<span/>',{ text: ' ' }),
                                    input   = $('<input/>',{ type:'checkbox', name:name, class:name, value:val.name });
                                return wrap.prepend( input );
                            },
                            pageTmp = $('<span/>'),
                            button  = $( '<ul>', { class: 'myMenu' });

                        switch( page ){
                            case 1:
                                var size = objForm('pageSize'), col = objForm('columns'), full = objForm('full');
                                size.append( html.wrapTag('These fixed sizes can you choice', 'div', 'description') )
                                    .append( html.singleRow('Orginal', rad('orgWidth')) )
                                    .append( html.singleRow('Normal', rad('normWidth')) )
                                    .append( html.singleRow('Wide', rad('wideWidth')) )
                                    .append( html.singleRow('Extreme', rad('extraWidth')) )
                                //    .append( p(' ') )
                                    .append( html.wrapTag('Dynamically changes when browser <br>width size changes', 'div', 'description'))
                                    .append( html.singleRow('Dynamic', rad('fullWidth'))  )
                                ;
                                //.append( html.wrapTag('Dynamically changes when browser width size changes', 'div', 'description'))
                                //.append( html.singleRow('Full', rad('fullWidth', 1)) )
                                //.append( html.singleRow('80%', rad('d80Width', 1)) );

                                col.append( html.wrapTag('Number of columns video thumb nails are shown.', 'h4') )
                                    .append(
                                        html.singleRow('Columns',
                                            $('<span/>').append(rad('1')).append(rad('2')).append(rad('3')).append(rad('4')).append($('<br>'))
                                                .append(rad('5')).append(rad('6')).append(rad('7')).append(rad('8')).html()
                                        ));

        //                        full.append( html.wrapTag('Set state of full player', 'h4') )
        //                            .append( html.singleRow('Choice','' ).append( rad('ON',1), rad('OFF',1), rad('Auto',1) ) );

                                pageTmp  = $('<span/>').append( size, col //, full
                                );
                                break;
                            case 2:
                                var more = objForm('more');
                                more.append( html.wrapTag('These fixed sizes can you choice', 'div', 'description'));
                                $.each( sharedData.settings2(), function( i, val ){
                                    val.on && more.append(
                                        html.singleRow( val.title, chbox( val )//.attr('checked', config[ val.name ] ) //.prop('checked', config[ val.name ] )
                                    ) );
                                    c.i('nr: ' + i +', ' + val.name + ', ' + val.title+'.');
                                });
                                pageTmp  = $('<span/>').append( more );
                                break;
                        }
                        c.i('button','----------------==================--------------');
                        c.i('configTM page ', page);

                        button.attr( 'id', 'setColSize' ).attr( 'data-page', page ).append( html.li_Item('Save Settings','menuTM','setColSize') );
                        return pageTmp.append( button )//.append( html.pager( 'config', page, 2 ) )
                      ;
                    },
                    render          = function(){
                        return  '\n '
                            +   w('Page Width:', 'h4')
                            +   fn.obj2Str( form() );
                    };
                html.createDialog( 'configTM', this.contBodyTM( render() ) );
                //config.fullPlayer = 'Auto'
                //c.i('config.fullPlayer',config.fullPlayer)
                $('#configTM').data('page',page);
                $('#pageSize').find('input.size.'+config.pageWidth).attr('checked', true );
                $('#columns').find('input.col'+config.thumbCol).attr('checked', true );
                $('#full').find('input.'+config.fullPlayer).attr('checked', true );
            },
            helpTM      : function( page ){
                var cl = 'normPresentation',
                    pageContent  = {
                        1 : function(){
                            return p( w('Choice what do you want help with:', 'h3')
                                +   '\r If you want to know about the Keyboard navigation and interaction then you click '+l('here','menuTM','help', 2)+'.'
                                +   '\r Where do you click with the mouse pointer to get something to react, find out '+l('here','menuTM','help', 3)+'.'
                                +   '\r A instruction video coming soon to you. The show coming '
                                +   v('here','title','videoLink','https://www.youtube-nocookie.com/embed/9chDANQxF2M?rel=0&amp;theme=light&amp;autohide=1', 3)+'.', cl );
                        },
                        2 : function(){
                            return p( w('Keyboard interaction navigation:', 'h3')
                                +   w('Video page:', 'h4')
                                +   fn.obj2Str( html.singleRow('N','Normal') )
                                +   fn.obj2Str( html.singleRow('W','Wide') )
                                +   fn.obj2Str( html.singleRow('O','Orginal') )
                                +   fn.obj2Str( html.singleRow('B','Enter Full Browser Player Mode') )
                                +   fn.obj2Str( html.singleRow('ESC','Exit Full Browser Player Mode') )
                                +   w('Thumb page:', 'h4')
                                +   fn.obj2Str( html.singleRow('Left arrow','Prev Page') )
                                +   fn.obj2Str( html.singleRow('Light arrow','Next Page') ),cl);
                        },
                        3 : function(){
                            return p( w('Mouse Navigation:', 'h3')
                                +   w('You can click right side of page', 'div', 'mouseNav')
                                +   '\n '
                                +   w('Thumb page:', 'h4')
                                +   fn.obj2Str( html.singleRow('Left','Prev Page') )
                                +   fn.obj2Str( html.singleRow('Right','Next Page') )
                                +   '\n '
                                +   w('Video page:', 'h4')
                                +   fn.obj2Str( html.singleRow('Left or Right','Enter Full Browser Player Mode') ),cl);
                        }
                    };
                html.createDialog( 'helpTM', pageContent[ page ] );
                $('#helpTM').find('.contHeadTM').append( page ).end().find('.contBodyTM').append( html.pager( 'help', page, 3 ) );
            },
            donateTM    : function( ){
                var elem = $('<div/>',{ id: 'table', class:'test' });

                html.createDialog( 'donateTM', elem );
            },
            videoTM     : function( height, width, src, firstLine, back, page ){
                var ow = width-1, oh = height-1, corr = 100, wh = $( window ).height();
                height + corr > wh ? ( ( height = wh - corr ), ( width = ow * ( height/oh ) ) ) : ( height = oh-8 );

                c.i('src',src);
                html.createDialog( 'videoTM', this.contBodyTM( this.embeded( height, width, src ) ),null,false );
                $('#videoTM').find('.firstLine').prepend( firstLine ).append( l('Previous Page', 'menuTM', back, page ) );

                this.wrapWidth( width + 40 );
            },

            contactForm : function( id ){
                var elul = $( '<ul>', { class: 'myMenu' }),
                    form = $( '<div/>',{ id:id }),
                    formObj = function(type,name,txt,size,cl,min){
                        var isInput = type == 'input',
                            typeVal = isInput ? '<input/>' : '<textarea/>',
                            elem = $(typeVal,{ id: 'c'+name, name:name, minlength: min }),
                            obj = $('<p/>',{ class: 'obj' })
                                .append( $('<label/>',{ for: 'c'+name, text: txt }) )
                                .append( isInput ? elem.attr('size',size ) : elem.attr('col',size ) );
                        return obj;
                    };
                return form
        /*            .append( formObj('input','name','Your Name:',30,'required',2) )
                    .append( formObj('input','email','Your E-Mail:',30,'required',5) )
                    .append( formObj('input','subject','Enter Subject:',30,'required',5) )
                    .append( formObj('text','comment','Enter Message:',30,'required',5) )
                    .append( elul.append( this.li_Item('Submit','menuTM','submit') ) )
        */
                ;
            },
            contactTM   : function( ){
                var presentation  = //'If you want to use your web e-mail or program click '
                    'Contact form is now down so for now, contact me by using your web e-mail or program - Click '
                    + a('here','mailto:[email protected]?subject=Tag:vporn.com:%20Enter%20Your%20Here') + '.';
                html.createDialog( 'contactTM', $('<span/>').append( this.contactForm('myForm') )
                    .append(
                        p( presentation,'normPresentation'),
                        p( 'E-Mail: [email protected] <br>Subject: Tag: vporn.com, Tag: Enter Your Here')
                    ) );
            },
            FileName    : function( ){
                var title = $('h1#vtitle').text();
                $('#videolinks').find('a').each(function( i, e ){
                    var $e = $(e), hl = $e.attr('href').split('initDownload(').pop().split("', '").shift();
                    c.i('hl', hl);
                    $e.attr('download', title + '.mp4' ).attr('href', hl );
                })
            },
            preSortMenu : function( ){
                $( '<div/>', { class: 'grayarea wline', text: 'Sort Menu is loading' }).insertAfter('.catsmenu');
            }
        },
        render      = {
            main        : function( ){
                GM.manager('get');
                config.startWidth();
                css.head();
                css.basicCss();
                listeners.sortButtons();
                listeners.minMax();
                listeners.resize();

            },
            tm          : function( ){
                c.i('open TM');
                css.fontsCss();
                css.tmCss();
                html.holderTM();
                html.wrapperTM();
                html.welcomeTM();
                html.sideTM();
                listeners.setColSize();
                listeners.menuButtonTM();
                html.copyright();
                c.i('Done TM');
            },
            videoThumbs : function( ){
                fn.videoAttributes();
                //noinspection JSUnresolvedVariable
                fn.minMax( config.videoMin, config.videoMax );
                fn.minMaxCurrent();

                var sorting = setInterval(function(){
                    c.i('sorting');
                    fn.initSort();
                    config.sorting && clearInterval( sorting );
//            html.FileName();
                }, 10 );
            }
        },
        observer    = new MutationObserver( function( mutations /*, observer */) {
            mutations.forEach( function( mutation ) {
                var newNodes = mutation.addedNodes; // DOM NodeList
                newNodes !== null &&
                $( newNodes ).each( function( i, e ){
                    var $e = $(e);
                    $e.hasClass('bx')                   && fn.videoAttributes();
                    ( $e.attr('id') === 'as3_js' || $e.isTag('video') ) && ( listeners.navVideo(), html.thumbSort() );
                    $e.hasClass('minititle')            && listeners.navThumb('.cholder');
                    $e.hasClass('left-account-menu')    && ( listeners.navThumb('.warapper-menu'), fn.sortMenu() );
                    $e.hasClass('warapper-menu')        && html.preSortMenu();
                    $e.hasClass('authsection')          && html.StartTM.render();
                    $e.hasClass('pagerwrap')            && fn.chkPager();
                    ( $e.hasClass('minititle') || $e.hasClass('video-details') ) && html.thumbSort();
                });
            });
        });

    GM_getValue('firstRun') === undefined && GM.first();

    //noinspection JSCheckFunctionSignatures
    observer.observe( document, { subtree: true, childList: true });
    render.main();
    c.i('VPorn ANewLayout','',2012, 'black' );

    $(document).ready(function(){
        render.videoThumbs();
        $('.video-details')[ config.pageWidthNR < 1400 ? 'addClass' : 'removeClass']('small');
        listeners.openCloseTM();
        config.imgHeight = null;
        fn.imgHeight();
        $('body font > :first-child').unwrap();
    });
}(jQuery));