code monkey's typewritings

ссылка :: анти-таги

всегда весело поставить что-то с ног на голову. Например, развить идею тагов до анти-тагов : )

наблюдение

не стоит программить на ночь — будет трудно уснуть : )

js редактор кук — есть ещё порох в пороховницах

За пару часов сегодня накатал безделицу — user js для редактирования кук текущей страницы. Поскольку с хостингом у меня временные разногласия о сроках оплаты, кладу под кат. Кстати, без prototype.js работать не будет.

window.addEventListener( "load", function() {  
    var styles = {  
        editor: "position: fixed; top: 0; left: 0; width: 95%; background-color: white; color: black; padding: .5em",  
        cookiesList: "padding: 2px;",  
        cookie: "margin: 0; padding: 0;",  
        cookieCheckbox: "margin-left: 20px",  
        cookieLabel: "margin: 0; padding: 0;",  
        cookieEdit: "margin: 0; margin-left: 20px",  
        editName: "margin: 0; padding: 0;",  
        editValue: "margin: 0; padding: 0; display: block; width: 100%;",  
        editAdd: "margin: 0;",  
        closer: "margin: 0;"  
    }  
    var showCookiesEditor = function() {  
        if ( $( editor ) ) return;   
        var editor = document.createElement( 'div' );  
        editor.id = 'cookieEditor';  
        editor.style = styles.editor;  
        editor.appendChild( document.createElement( 'fieldset' ) );  
        editor.firstChild.appendChild( document.createElement( 'legend' ) );  
        editor.firstChild.firstChild.appendChild( document.createTextNode( 'Cookie editor' ) );

        var cookiesList = document.createElement( 'div' );  
        cookiesList.style = styles.cookiesList;  
        editor.firstChild.appendChild( cookiesList );

        var name = document.createElement( 'input' );  
        name.type = "text";  
        name.style = styles.editName;  
        var value = document.createElement( 'textarea' );  
        value.rows = 3;  
        value.style = styles.editValue;  
        var button = document.createElement( 'input' );  
        button.type = "button";  
        button.value = "Add";  
        button.style = styles.editAdd;  
        var closer = document.createElement( 'input' );  
        closer.type = "button";  
        closer.value = "Close";  
        closer.style = styles.closer;  
        closer.onclick = function() {  
            editor.parentNode.removeChild( editor );  
        }

        var cookies = [];

        var showCookie = function( cookie ) {  
            var tag = document.createElement( 'p' );  
            tag.style = styles.cookie;  
            var checkbox = document.createElement( 'input' );  
            checkbox.type = "checkbox"  
            checkbox.checked = 'checked';  
            checkbox.id = 'cookieEditorCheckbox' + cookie.name;  
            checkbox.style = styles.cookieCheckbox  
            checkbox.onclick = function() {   
                if ( checkbox.checked ) {  
                    document.cookie = cookie.name + '=' + cookie.value;  
                } else {  
                    document.cookie = cookie.name + '= 1;expires=Thu, 01-Jan-1970 00:00:01 GMT' ;  
                }  
            }

            var label = document.createElement( 'label' );  
            label.setAttribute( 'for', 'cookieEditorCheckbox' + cookie.name );  
            label.innerHTML = cookie.name + '=' + cookie.value;  
            label.style = styles.cookieLabel;

            var editButton = document.createElement( 'input' );  
            editButton.type = "button";  
            editButton.value = "Edit";  
            editButton.style = styles.cookieEdit  
            editButton.onclick = function() {  
                name.value = cookie.name  
                value.value = cookie.value  
            }

            tag.appendChild( checkbox );  
            tag.appendChild( label );  
            tag.appendChild( editButton );  
            cookiesList.appendChild( tag );  
        }

        $A( document.cookie.split( /;/ ) ).each( function( cookieString ) {  
            if ( !cookieString ) return;  
            var cookie = {   
                name: cookieString.substr( 0, cookieString.indexOf( '=' ) ),  
                value: cookieString.substr( cookieString.indexOf( '=' ) + 1 )  
            }  
            cookies.push( cookie )  
            showCookie( cookie );  
        });

        button.onclick = function() {  
            var existingCookie = $A( cookies ).find( function( cookie ) {   
                return cookie.name == name.value   
            })   
            var existingLabel = $A( cookiesList.getElementsByTagName( 'label' ) ).find( function( label ) {   
                return label.innerHTML.indexOf( name.value + '=' ) > -1  
            })

            document.cookie = name.value + '=' + value.value;  
            if ( existingCookie && existingLabel ) {  
                existingCookie.value = value.value;  
                existingLabel.innerHTML = name.value + '=' + value.value;  
                existingLabel.previousSibling.checked = "checked";  
            } else {  
                var cookie = { 'name': name.value, 'value': value.value };  
                cookies.push( cookie );  
                showCookie( cookie );  
            }  
        }

        editor.firstChild.appendChild( name );  
        editor.firstChild.appendChild( value );  
        editor.firstChild.appendChild( button );  
        editor.firstChild.appendChild( closer );  
        document.getElementsByTagName('body')[0].appendChild( editor )  
    }

    document.addEventListener( "keypress", function(e) {  
        if ( e.keyCode == '\\'.charCodeAt(0) && e.ctrlKey ) {  
            showCookiesEditor();  
        }  
    }, false )  
}, false )

,

lj :: status update

На тот случай, если кто-то заметил моё отсутствие в жж...

Последние две недели у меня есть девушка и работа. Последние две недели у меня остается катастрофически мало времени, не отданного работе или девушке. Последние две недели я читаю жж один раз на выходных, и расстраиваюсь, что во френдленте skip=990 — это только вечер понедельника. Да, моя жизнь изменилась кардинально : )

О девушке я не умею писать, так что не обессудьте. Скажу только, что она красивая и умная. Друзьям при личной встрече могу сказать больше (аська, все-таки, мне пока что для этого не подходит).

Что касается работы, то вы не узнаете, где она и как называется компания : ) К счастью, большое расстояние — единственный её минус. Все остальное мне очень нравится даже в сложное для меня переходное время. Интересно, какие у меня будут ощущения, когда я в неё вживусь.

А, ну да. Если кто-то сомневался — конечно же, веб-программист : ))

ps: неудачный вышел пост. Креативные соки все-таки выжаты. Ничего, наверняка я скоро научусь оставлять немного себя для остального мира. Так что никаких «журнал закрывается на неопределённый срок» не ждите : ) Просто пока что я буду писать лишь при возможности. И чур не обижаться, если я не откомментил важный пост в тот же день ; )

pps: впрочем, напоследок у меня есть немного вкусненького про прелесть JS + prototype.js:
`Event.observe( window, "load", function(){
var device = $('mN_DEVICE_ID');
var deviceOptions = $A( device.getElementsByTagName('option') );
deviceOptions.shift();

var applyFilter = function(){
var selected = device.value;

deviceOptions.each( function( deviceOption ) {
try {
device.removeChild( deviceOption );
} catch(e) {}

if ( deviceOption.innerHTML.indexOf( $F('filter') ) > -1 ) {
device.appendChild( deviceOption );
}
} )
device.value = selected;
}
applyFilter();
Event.observe( $('filter'), "keyup", applyFilter )
})`

, , ,

работа :: до конца сериала оставалось 246 серий...

Вышел из дома в десять с небольшим утра. Вернулся в шесть с лишним. Это было одно собеседование. Правда, вначале с юзабилистом(?), потом с тремя программерами, а потом и с директором. Я впечатлён. Директор говорил, что они тоже : )

Жду ответа завтра. Возможно, я все-таки буду каждый день мотаться на дальний край москвы.
Upd: яндекс.карты говорят, что это 55 километров (39 напрямик).