Форум программистов, компьютерный форум, киберфорум
Наши страницы

JavaScript

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 5.00
omninamed
10 / 10 / 0
Регистрация: 18.06.2013
Сообщений: 25
Завершенные тесты: 1
28.01.2015, 11:17 #31
Писал для сайта игрового сообщества (клан-сайт) логотип в стиле газоразрядных неоновых вывесок как в старых американских барах (несколько неисправных символов), т.к. я не силён в рисовании флешек и гифок, реализовал всё чисто с программерским подходом. Может кому пригодится моё творчество.

neon.css
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/* Удалить, если будете использовать на своём сайте */
body
{
  background-color: #000;
}
 
/* Шрифт для баннера */
.neon, .broken
{
    color: transparent;
    font-size: 64px;
    font-family: Swis721 BdOul BT, Gabriola;
    font-style: italic;
    text-decoration: none;
    letter-spacing: .05em;
}
 
/* Полное свечение */
.neon
{
    text-shadow:
    0 0 .02em hsla(60,100%,50%, 1),
    .04em .02em .05em hsla(80, 100%, 70%, .8),
    .03em .03em .1em #00ff00,
    .03em .03em .1em #00ff00,
    -.03em .03em .1em #00ff00,
    -.03em -.03em .1em #00ff00,
    .03em .03em .8em #00ff00,
    .03em -.03em .8em #00ff00,
    -.03em .03em .8em #00ff00,
    -.03em -.03em .8em #00ff00;
}
 
/* Сломанное свечение */
.broken
{
    text-shadow:
    0 0 .02em hsla(60,100%,50%, .6),
    .04em .02em .05em hsla(80, 100%, 70%, .3),
    .03em .03em .1em hsla(0, 100%, 0, .3),
    .03em .03em .1em hsla(0, 100%, 0, .3),
    -.03em .03em .1em hsla(0, 100%, 0, .3),
    -.03em -.03em .1em hsla(0, 100%, 0, .3);
}
neon.js
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* Элементы. Здесь замените ID на те, которые Вам нужны (неисправные буквы логотипа) */
var elemL1 = document.getElementById ( 'letter1' );
var elemL2 = document.getElementById ( 'letter2' );
var elemL3 = document.getElementById ( 'letter3' );
 
/***********************************/
/* Переменные для настройки движка */
 
/* Лимиты времени простоя */
var letterStateTimeoutMin = 3000;
var letterStateTimeoutMax = 10000;
 
/* Лимиты количества блинков */
var letterBlinksLimitMin = 5;
var letterBlinksLimitMax = 10;
 
/* Лимиты времени между блинками */
var letterBlinkTimeoutMin = 40;
var letterBlinkTimoutMax = 120;
 
/*******************************/
/* Переменные состояний движка */
 
/* Состояния элементов */
var letter1state = 0;
var letter2state = 0;
var letter3state = 0;
 
/* Счётчики блинков для каждого элемента */
var letter1counter = 0;
var letter2counter = 0;
var letter3counter = 0;
 
/* ГПСЧ с задаваемыми диапазонами */
function getRandom ( min, max )
{
    min = parseInt ( min );
    max = parseInt ( max );
    return ( Math.floor( Math.random ( ) * ( max - min + 1 ) ) + min );
};
 
/* Функция "выключает" элемент и ставит таймер включения */
function letterOff ( elem, state, counter, limit )
{
    if ( elem )
    {
        if ( state == 1 )
        {
            elem.className = 'broken';
            state = 0;
            setTimeout ( function ( ) { letterOn ( elem, state, counter, limit ); },
                getRandom ( letterStateTimeoutMin, letterStateTimeoutMax ) );
        };
    };
};
 
/* Функция "включает" элемент с эффектом газоразрядного стартера и ставит таймер на отключение */
function letterOn ( elem, state, counter, limit )
{
    if ( elem )
    {
        if ( state == 0 )
        {
            elem.className = 'neon';
            state = 1;
        }
        else if ( state == 1 && ( counter + 1 ) < limit )
        {
            elem.className = 'broken';
            state = 0;
        };
        timerId = setTimeout ( function ( ) { letterOn ( elem, state, counter, limit ); },
                         getRandom ( letterBlinkTimeoutMin, letterBlinkTimoutMax ) );
        if ( ++counter >= limit )
        {
            clearTimeout ( timerId );
            counter = 0;
            setTimeout ( function ( ) { letterOff ( elem, state, counter, limit ); },
                getRandom ( letterStateTimeoutMin, letterStateTimeoutMax ) );
        };
    };
};
 
/* Инициализация и запуск баннера */
function letterBeginShow ( )
{
    letter1state = parseInt ( getRandom ( 0, 1 ) );
    if ( letter1state == 0 )
    {
        elemL1.className = 'broken';
        setTimeout ( function ( ) { letterOn ( elemL1, letter1state, letter1counter,
            getRandom ( letterBlinksLimitMin, letterBlinksLimitMax ) ); },
            getRandom ( letterStateTimeoutMin, letterStateTimeoutMax ) );
    }
    else
    {
        elemL1.className = 'neon';
        setTimeout ( function ( ) { letterOff ( elemL1, letter1state, letter1counter,
            getRandom ( letterBlinksLimitMin, letterBlinksLimitMax ) ); },
            getRandom ( letterStateTimeoutMin, letterStateTimeoutMax ) );
    };
 
    letter2state = parseInt ( getRandom ( 0, 1 ) );
    if ( letter2state == 0 )
    {
        elemL2.className = 'broken';
        setTimeout ( function ( ) { letterOn ( elemL2, letter2state, letter2counter,
            getRandom ( letterBlinksLimitMin, letterBlinksLimitMax ) ); },
            getRandom ( letterStateTimeoutMin, letterStateTimeoutMax ) );
    }
    else
    {
        elemL2.className = 'neon';
        setTimeout ( function ( ) { letterOff ( elemL2, letter2state, letter2counter,
        getRandom ( letterBlinksLimitMin, letterBlinksLimitMax ) ); },
        getRandom ( letterStateTimeoutMin, letterStateTimeoutMax ) );
    };
 
    letter3state = parseInt ( getRandom ( 0, 1 ) );
    if ( letter3state == 0 )
    {
        elemL3.className = 'broken';
        setTimeout ( function ( ) { letterOn ( elemL3, letter3state, letter3counter,
            getRandom ( letterBlinksLimitMin, letterBlinksLimitMax ) ); },
            getRandom ( letterStateTimeoutMin, letterStateTimeoutMax ) );
    }
    else
    {
        elemL3.className = 'neon';
        setTimeout ( function ( ) { letterOff ( elemL3, letter3state, letter3counter,
            getRandom ( letterBlinksLimitMin, letterBlinksLimitMax ) ); },
            getRandom ( letterStateTimeoutMin, letterStateTimeoutMax ) );
    };
};
 
letterBeginShow ( );
Ну и тестовая страница neon.html
HTML5
1
2
3
4
5
6
7
8
9
10
11
<html lang="en">
    <head title="Neon">
    <link rel="stylesheet" href="neon.css">
        <body>
            <center>
                <font class="neon" id="letter1">R</font><font class="neon">ubico</font><font class="neon" id="letter2">n</font><font class="neon"> & </font><font class="neon" id="letter3">N</font><font class="neon">exus</font>
            </center>
        </body>
    </head>
</html>
<script src="neon.js"></script>
Файлы проекта прилагаются. Не забываем благодарить))
3
Вложения
Тип файла: zip neon.zip (1.9 Кб, 16 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2015, 11:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обмен готовыми решениями (JavaScript):

Обмен между фреймами - JavaScript
ситуация такова есть страница, на ней два фрейма в левом фрейме страница левого сайта с формой заполнения справа фрейм с локальной...

Как организовать обмен сообщениями - JavaScript
В общем, суть такова. Как лучше всего проверять новые записи в БД? Чат типо ICQ или как в ВК сообщениями обмениваются. Само собой...

обмен файлами без фактической передачи - JavaScript
на хосте лежит искомый файл и рассчёт числа ПИ до миллиардного знака. программа сравнивает последовательности бит файла и числа ПИ,...

Обмен данными между двумя сервисами - JavaScript
Здравствуйте. Стоит перед до мной одна задача. В системе amocrm создать виджет. Сам он пишет на JS. В нем я новичек. Цель виджета брать...

Ajax Comet, мгновенный обмен личными сообщениями - JavaScript
Всем привет,я хочу написать мгновенный обмен личными сообщениями,типо как у &quot;Вконтакте&quot;, но не могу разобраться с ajax &quot;comet&quot;,кто может...

Обмен готовыми решениями - Web-дизайн
Привет, мир! Предлагаю здесь обмениваться готовыми решениями, исключительно html + css. Итак, вот сверстал необычный дизайн, без...

58
zhibirc
648 / 233 / 29
Регистрация: 18.02.2013
Сообщений: 784
31.07.2015, 19:08 #32
Немного отсебятинки:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/**
 * Adding outline borders to each element on the page.
 * Sometimes is very useful. ;)
 *
 * @author Addi Osmani
 */
(function(a) {
    [].forEach.call(
        document.querySelectorAll(a),
        function(b) {
            b.style.outline = '1px solid #' + (~~(Math.random() * (1 << 24))).toString(16)
        }
    )
})('*');
 
/**
 * Extend jQuery-prototype ($.fn) with method serializeToJSON().
 *
 * @author zhibirc
 */
$.fn.extend({
    serializeToJSON: function() {
        return '"{' + $(this).serialize()
            .split('&')
            .map(function(elem) {
                return elem.split('=');
            })
            .map(function(elem) {
                return elem.map(function(elem, idx, array) {
                    var __elem;
                    elem = elem.replace(/(%[\da-f]+)/ig, function(group_0) {
                        return decodeURIComponent(group_0);
                    });
                    idx && (__elem = +elem);
                    return isFinite(__elem) ? elem : '"' + elem + '"';
                });
            })
            .map(function(elem) {
                return elem.join(':')
            })
            .join(',') + '}"';
    }
});
 
/**
 * Returns an array of longest words.
 *
 * @author zhibirc
 * @todo Add the functionality to determine the level of 'longest'.
 */
function getLongestWord(str) {
    'use strict';
    var normalize = str.split(/[^-a-zа-я\d]/i),
        max_len = Math.max.apply(Math, normalize.map(function(elem) {
            return elem.length;
        }));
    return str.match(RegExp('[а-я]{' + max_len + '}', 'ig'));
}
 
/**
 * PHP function number_format in JS.
 *
 * @author zhibirc
 */
function numberFormat(value, decimal, delim, thousands_sep) {
    'use strict';
    if (typeof value !== 'number' || !isFinite(value)) {
        throw new TypeError('Parameter "value" must be a real Number!');
    }
    var resultValue = value,
        delimiter = delim || '.',
        digitParts = [],
        intPart = '';
 
    decimal && (resultValue = resultValue.toFixed(decimal));
    resultValue = parseInt(resultValue, 10) + delimiter + String(resultValue).split(/\W+/)[1];
    if (thousands_sep) {
        digitParts = resultValue.split(delimiter);
        intPart = digitParts[0].replace(new RegExp("^(\\d{1,intPart.length - 3})(?=\\d{3})", 'g'), "$1" + thousands_sep);
        resultValue = intPart + delimiter + digitParts[1];
    }
    return resultValue;
}
/** Function that fixes a case when TextNode returns instead of HTML element (in FF at least). */
function getFirstChild(elem) {
    var firstChild = elem.firstChild;
    while (firstChild && firstChild.nodeType !== 1) {
        firstChild = firstChild.nextSibling;
    }
    return firstChild;
}
0
omninamed
10 / 10 / 0
Регистрация: 18.06.2013
Сообщений: 25
Завершенные тесты: 1
01.08.2015, 03:46 #33
Цитата Сообщение от Thisman Посмотреть сообщение
omninamed, можете на codeopen выложить? или jsbin? Что бы глянуть, на деле интересно)
Могли бы и сами сделать, 30 секунд делов то))

http://codepen.io/anon/pen/waRgGJ
1
Dit81
7 / 8 / 1
Регистрация: 08.08.2012
Сообщений: 63
07.08.2015, 14:56 #34
Простая функция проверки на столкновения двух объектов прямоугольник-прямоугольник:
Javascript
1
2
3
4
unction checkForCollision(obj1, obj2){
if ((obj1.x &lt; obj2.x + obj2.width) &amp;&amp; (obj2.x &lt; obj1.x + obj1.width) &amp;&amp; (obj1.y &lt; obj2.y + obj2.height) &amp;&amp; (obj2.y &lt; obj1.y + obj1.height)) return true;
return false;
}
0
BANO
Ренегат
Эксперт HTML/CSS
1476 / 1056 / 292
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
07.08.2015, 15:07 #35

Не по теме:

Dit81, а можно на js?



Добавлено через 9 минут

Не по теме:

Dit81, а у тебя это работает правильно?


я наверное выложу всё-таки хотя бы валидный пример
Javascript
1
2
3
4
5
6
    function rectTest(f,s){
        return ((f.x < s.x + s.width) &&
                (s.x < f.x + f.width) &&
                (f.y < s.y + s.height) &&
                (s.y < f.y + f.height))
    }
но мне кажется, что он не рабочий
0
BANO
Ренегат
Эксперт HTML/CSS
1476 / 1056 / 292
Регистрация: 06.08.2014
Сообщений: 5,203
Записей в блоге: 1
18.08.2015, 13:04 #36
вот скрипт на правило 1-2-5, учитывающий -надцатые числа

вход:
- строка типа секунд_а_ы_, соответственно разделители это _, первая часть строки - неизменяеая часть слова, вторая это окончание на 1, третья на 2 и четвёртая на 5
- число, к которому мы будем "прикриплять" нашу строку

выход:
- строка со словом

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * @author BANO.notIT's Bairn
 * @param {string}w
 * @param {number}n
 * @return {string}
 */
function end125(w,n){
    w= w.split("_");
    n=(n%=100)<15&&n>9&&(6)||n%10;
    return n===1 && (w[0]+w[1])
        || n < 5 && n && (w[0]+w[2])
        || (w[0]+w[3])
}
примеры:
Javascript
1
2
3
4
end125("секунд_а_ы_",1) // -> "секунда"
end125("секунд_а_ы_",2) // -> "секунды"
end125("секунд_а_ы_",5) // -> "секунд"
end125("секунд_а_ы_",12) // -> "секунд"

и небольшой плагин для этой функции:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
end125.ready={
    files:"файл__а_ов",
    time:{
        secs:"секунд_а_ы_",
        mins:"минут_а_ы_",
        hours:"час__а_ов",
        days:"д_ень_ня_ней",
        years:"_год_года_лет",
        weeks:"недел_я_и_ь",
        months:"месяц__а_ев"
    },
    chars:"букв_а_ы_",
    words:"слов_о_а_",
    humans:"_человек_человека_людей",
    men: "мужчин_а__",
    women: "женщин_а_ы_",
    баллы:"балл__а_ов"
}
0
newJS
2390 / 1063 / 98
Регистрация: 23.06.2011
Сообщений: 3,323
19.08.2015, 06:14 #37
BANO, тут уже давно лежит скрипт определяющий окончания слов.
Идея с передачей нужного слова понравилась, так более универсально.
0
script44
4 / 4 / 1
Регистрация: 22.04.2015
Сообщений: 12
04.09.2015, 23:08 #38
Может кому пригодится Прогресс бар счётчик для уровней в игре на JavaScript. две штуки не много отличаются друг от друга.

первый
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<HTML>
<HEAD>
    <style>
        .pg {
            width: 204px;
            border: 2px solid #000000;
        }
 
        .pk {
            height: 10px;
            width: 0px;
            background-color: #009900;
            color: white;
        }
 
        .k {
            background: #000000;
            color: 3399 CC;
            margin-bottom: 0px;
            font-size: 10pt;
            border: solid 2px #000000;
        }
    </style>
</HEAD>
<BODY>
<script>
    var k = 10;
    var h = 10;
    var p = 10;// переменные k,h,p начальное значение которое нужно набрать
    var g = 0;
    var f = 0;
    var m = 0;
    var d = 0;
    var s = 0;
    function PX() {
        s = f - g;
        var bar = document.getElementById("bar");
        d = Math.floor(s * 100 / h).toFixed(0)
        bar.style.width = d * 2;
        "px";
        sstt.innerHTML = d + "%"
        sj.innerHTML = k - f;
    }
 
    function DS1() {
        f += 1;
        fk.innerHTML = f;
        if (f >= k)DL(), DM()
    }
    function DS5() {
        f += 5;
        fk.innerHTML = f;
        if (f >= k)DL(), DM()
    }
    function DS10() {
        f += 10;
        fk.innerHTML = f;
        if (f >= k)DL(), DM()
    }
    function DS50() {
        f += 50;
        fk.innerHTML = f;
        if (f >= k)DL(), DM()
    }
    function DS100() {
        f += 100;
        fk.innerHTML = f;
        if (f >= k)DL(), DM()
    }
    function DS500() {
        f += 500;
        fk.innerHTML = f;
        if (f >= k)DL(), DM()
    }
 
    function DSminus1() {
        if (f < 1)f += 1;
        f -= 1;
        fk.innerHTML = f;
        if (f < k - h)DLminus(), DMminus()
    }
    function DSminus10() {
        if (f < 10)f += 10;
        f -= 10;
        fk.innerHTML = f;
        if (f < k - h)DLminus(), DMminus()
    }
    function DSminus100() {
        if (f < 100)f += 100;
        f -= 100;
        fk.innerHTML = f;
        if (f < k - h)DLminus(), DMminus()
    }
 
    function DL() {
        h += 10;
        k = h + k; //здесь h и p шаг прибавления всегда должны быть равны друг другу
        p += 10;
        g = k - p;
        kf.innerHTML = k;
        if (f >= k)DL(), DM()
    }
 
    function DLminus() {
        k = k - h;
        h -= 10;   //здесь h и p шаг убавления всегда должны быть равны друг другу
        p -= 10;
        g = k - p;
        kf.innerHTML = k;
        if (f - g < 0)DLminus(), DMminus()
    }
 
    function DMminus() {
        m -= 1;
        km.innerHTML = m
    }
    function DM() {
        m += 1;
        km.innerHTML = m
    }
 
    function SB() {
        h = 10;
        p = 10;
        d = 0;
        s = 0;
        g = 0;
        f = 0;
        fk.innerHTML = f
        k = 10;
        kf.innerHTML = k
        m = 0;
        km.innerHTML = m
    }
</script>
<table>
    <tr>
        <td>
            <div class="pg">
                <div id="bar" class="pk"></div>
            </div>
        </td>
        <td><span id="sstt">0%</span></td>
    </tr>
</table>
<span id="fk">0</span>/<span id="kf">10</span><br>
<input type="button" class="k" value="+1" onclick="DS1(),PX()">
<input type="button" class="k" value="+5" onclick="DS5(),PX()">
<input type="button" class="k" value="+10" onclick="DS10(),PX()">
<input type="button" class="k" value="+50" onclick="DS50(),PX()">
<input type="button" class="k" value="+100" onclick="DS100(),PX()">
<input type="button" class="k" value="+500" onclick="DS500(),PX()">
<input type="button" class="k" value="-1" onclick="DSminus1(),PX()">
<input type="button" class="k" value="-10" onclick="DSminus10(),PX()">
<input type="button" class="k" value="-100" onclick="DSminus100(),PX()">
<input type="button" class="k" value="сброс" onclick="SB(),PX()">
<br>
уровень<span id="km">0</span><br>
до следующего уровня осталось набрать<span id="sj">10</span>
</BODY>
</HTML>
и второй
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
<HTML>
<HEAD>
    <style type="text/css">
        .pgt {
            width: 204px;
            border: 2px solid #000000;
        }
 
        .pkt {
            height: 10px;
            width: 0px;
            background-color: #0066FF;
            color: white;
        }
 
        .ks {
            background: #000000;
            color: 009900;
            margin-bottom: 0px;
            font-size: 10pt;
            border: solid 2px #000000;
        }
    </style>
</HEAD>
<BODY>
 
<script>
    var c = 0;
    var y = 0;
    var n = 10;//переменная n начальное значение которое нужно набрать
    var a = 0;
    var z = 0;//z равняется начальное значение n вычесть z из шага прибавления(из функции FL)
    function PX() {
        var bars = document.getElementById("bars");
        c = Math.floor(y * 100 / n).toFixed(0);
        bars.style.width = c * 2;
        "px";
        sst.innerHTML = c + "%"
        qq.innerHTML = n - y
    }
    function RS1() {
        if (y >= n - 1)FL1(), AM();
        y += 1;
        yk.innerHTML = y;
    }
    function RS5() {
        if (y >= n - 5)FL5(), AM();
        y += 5;
        yk.innerHTML = y;
    }
    function RS10() {
        if (y >= n - 10)FL10(), AM();
        y += 10;
        yk.innerHTML = y;
    }
    function RS50() {
        if (y >= n - 50)FL50(), AM();
        y += 50;
        yk.innerHTML = y;
    }
    function RS100() {
        if (y >= n - 100)FL100(), AM();
        y += 100;
        yk.innerHTML = y;
    }
 
    function FL1() {
        n += 10;
        z += 10;
        y = y - z;
        nf.innerHTML = n;
        if (y >= n - 1)FL1(), AM()
    } //здесь n и z шаг прибавления всегда должны быть равны друг другу
    function FL5() {
        n += 10;
        z += 10;
        y = y - z;
        nf.innerHTML = n;
        if (y >= n - 5)FL5(), AM()
    }
    function FL10() {
        n += 10;
        z += 10;
        y = y - z;
        nf.innerHTML = n;
        if (y >= n - 10)FL10(), AM()
    }
    function FL50() {
        n += 10;
        z += 10;
        y = y - z;
        nf.innerHTML = n;
        if (y >= n - 50)FL50(), AM()
    }
    function FL100() {
        n += 10;
        z += 10;
        y = y - z;
        nf.innerHTML = n;
        if (y >= n - 100)FL100(), AM()
    }
 
    function RSmin1() {
        if (y + n <= 10)y += 1;
        if (y < 1)FLmin1(), AMminus();
        y -= 1;
        yk.innerHTML = y;
    }
    function RSmin10() {
        if (n <= 10)y += 10;
        if (y < 10)FLmin10(), AMminus();
        y -= 10;
        yk.innerHTML = y;
    }
    function RSmin100() {
        if (n <= 40)y += 100;
        if (y < 100)FLmin100(), AMminus();
        y -= 100;
        yk.innerHTML = y;
    }
 
    function FLmin1() {
        n -= 10;
        z -= 10;
        y = n - (-y);
        nf.innerHTML = n;
        if (y < 1)FLmin1(), AMminus();
    }  //здесь n и z шаг убавления всегда должны быть равны друг другу
    function FLmin10() {
        n -= 10;
        z -= 10;
        y = n - (-y);
        nf.innerHTML = n;
        if (y < 10)FLmin10(), AMminus();
    }
    function FLmin100() {
        n -= 10;
        z -= 10;
        y = n - (-y);
        nf.innerHTML = n;
        if (y < 100)FLmin100(), AMminus();
    }
 
    function AM() {
        a += 1;
        am.innerHTML = a
    }
    function AMminus() {
        a -= 1;
        am.innerHTML = a
    }
    function SBROS() {
        z = 0;
        c = 0;
        y = 0;
        yk.innerHTML = y
        n = 10;
        nf.innerHTML = n
        a = 0;
        am.innerHTML = a
    }
</script>
<table>
    <tr>
        <td>
            <div class="pgt">
                <div id="bars" class="pkt"></div>
            </div>
        </td>
        <td><span id="sst">0%</span></td>
    </tr>
</table>
<span id="yk">0</span>/<span id="nf">10</span><br>
<input type="button" class="ks" value="+1" onclick="RS1(),PX()">
<input type="button" class="ks" value="+5" onclick="RS5(),PX()">
<input type="button" class="ks" value="+10" onclick="RS10(),PX()">
<input type="button" class="ks" value="+50" onclick="RS50(),PX()">
<input type="button" class="ks" value="+100" onclick="RS100(),PX()">
<input type="button" class="ks" value="-1" onclick="RSmin1(),PX()">
<input type="button" class="ks" value="-10" onclick="RSmin10(),PX()">
<input type="button" class="ks" value="-100" onclick="RSmin100(),PX()">
<input type="button" class="ks" value="сброс" onclick="SBROS(),PX()"> <br>
 
уровень<span id="am">0</span><br>
до следующего уровня осталось набрать<span id="qq">10</span>
</BODY>
</HTML>
1
script44
4 / 4 / 1
Регистрация: 22.04.2015
Сообщений: 12
21.09.2015, 00:07 #39
Вкладки(табы) на чистом Javascript без jQuery
Вкладки.7z
1
Опан
Юзер с абсолютным слухом
391 / 334 / 69
Регистрация: 17.12.2010
Сообщений: 1,015
30.10.2015, 01:57 #40
Осциллограф
Хочу предложить простой онлайн-осциллограф. Измерительным входом является вход звуковой карты. (Микрофонный или линейный.) Можно так же подключать звук любого программного плеера на компьютере, (типа винамп и др.) установив птичку в микшере записи звуковой карты в секции "стереомикс". Так же исключения не составят звуки с интернета.
Единственная заковывка получилась в том, что не получается развязка по правому и левому стереоканалам, т. е., с обоих стереовходов информация почему-то попадает в один и тот же буфер. Поэтому у осциллографа пока только один моно-луч, а не два:
HTML5
1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Осциллограф</title>
</head>
<body><center><h1>Осциллограф</h1>
<canvas id=canvas width=512 height=256 style="border-style:solid;border-width:5px;border-color:green;border-radius:15px"></canvas>
<br><br>Частота развёртки: <input id=speed type=range max=12 value=8 style="width:250px;cursor:pointer" onchange="rangechange(this.value)">
<span id=myspeed>rty</span>
</body></html>
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<script>
function rangechange(e){ // Что происходит при переключении движка
    st=0;
    k=speed.max-e;
    k1=k-4;
    if(k1<0){k1=0};
    k5=Math.pow(2,k1);
    if(k>4){myspeed.innerHTML=" / "+k5}else{myspeed.innerHTML=" X "+Math.pow(2,(4-k))};
    imgData=ctx.createImageData(cw,ch); 
    mycls(); // Чистим весь экран
    ctx.putImageData(imgData,0,0);
    imgData=ctx.createImageData(Math.floor(cw/k5),ch);  
}
 
function mycls(){ // Очистка прямоугольной области
    for (var i=0;i<imgData.data.length;i+=4){
        imgData.data[i+0]=0;   // R фона
        imgData.data[i+1]=0;   // G фона
        imgData.data[i+2]=0;   // B фона
        imgData.data[i+3]=255; // A фона
    }
}
 
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;
var db=4096; // длина буфера чтения со входа звуковой карты
rangechange(8);
try{window.AudioContext = window.AudioContext || window.webkitAudioContext;
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
    window.URL = window.URL || window.webkitURL;
    audio_context = new AudioContext;
}catch(e){alert('Этот браузер не поддерживает веб аудио!');
}
navigator.getUserMedia({audio: true}, function(stream){
    var source = audio_context.createMediaStreamSource(stream);
    var numChannels = 2; // типа стерео
    source.node = (source.context.createScriptProcessor ||
        source.context.createJavaScriptNode).call(source.context,
        db, numChannels, numChannels);
        false;
    source.node.onaudioprocess = function(e){
        var buffer = [];
        for (var channel = 0; channel < numChannels; channel++){
            buffer.push(e.inputBuffer.getChannelData(channel));
        } 
        mycls();
        ctx.putImageData(imgData,cw/k5*st,0);
        for(i=0;i<db;i++){
            var i1=i;
            if(k<4){i1=i*Math.pow(2,(4-k))};
            var y=Math.floor(ch/2)+Math.floor(buffer[1][i]*ch/2);
            var x=Math.floor((i1)*cw/db/k5);
            var px=Math.floor(y*cw/k5+x)*4;
            imgData.data[px]=64;    // R луча
            imgData.data[px+1]=255; // G луча
            imgData.data[px+2]=220; // B луча
            imgData.data[px+3]=255; // A луча
        }
        ctx.putImageData(imgData,cw/k5*st,0); // рисуем осциллограмму
        st++;
        if(st>=k5){st=0};
    }
    source.connect(source.node);
    source.node.connect(source.context.destination);
}, function(e){
});
</script>
0
Опан
Юзер с абсолютным слухом
391 / 334 / 69
Регистрация: 17.12.2010
Сообщений: 1,015
31.10.2015, 02:18 #41

Не по теме:

Я - баянист


Цитата Сообщение от stakon Посмотреть сообщение
Простой анализатор спектра. Не получается запустить, появляется синий прямоугольник и всё, может ошибка в коде?
Я вот и сам на днях хотел его запустить, но... результат был тот же... Перед публикацией я проверял код, и он работал.
Я считаю, что не обязательно разработчикам браузеров так часто выпускать новые версии, пусть они будут реже, но чтобы предусматривали сохранение работоспособности всех нюансов. Другого объяснения я пока не вижу.
Попробуйте ещё уточнить, в каком браузере Вы пытались запустить. Формат аудиофайла МП3 поддерживает Google Chrome, (и кажется мозилла) а в опере требуется формат файла OGG.

Добавлено через 2 часа 19 минут
Оказывается, в последний раз я по ошибке пытался запустить анализатор на локалке. На сервере он работает. Вот ссылка.Так что, я напрасно обвинил разработчиков браузеров. Может и Вы запускали на локалке? Или же на сервере, но ссылку на аудиофайл брали с другого сервера?
0
arcmag
259 / 255 / 115
Регистрация: 27.06.2014
Сообщений: 665
12.11.2015, 11:52 #42
Если кому интересно вот мой список из 4-х методов
css - позволяет передать группу стилей в элемент через объект
spoiler - сворачивает/разворачивает указанный элемент
moving - позволяет перемещать элемент по странице
resize - позволяет изменять размеры высоты и ширины элемента
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
<!DOCTYPE html>
<html>
<head>
    <title>lib</title>
    <script>
        var lib = (function () {
            "use-strict";
            js = {};
            js.css = function (elem, css) {
                for (var i in css) elem.style[i] = css[i];
            }
            js.spoiler = function (activator, block, open) {
                /*
                 * activator - элемент при клике на который будет происходить сворачивание/разворачивание блока (string = selector || html element)
                 * block     - блок который будет сворачиваться и разворачиваться (string = selector || html element)
                 * open      - (не обязательно) начальное состояние блока открыт/закрыт (default - false || true)
                 * */
                var a = typeof activator === "string" ? document.querySelector (activator) : activator,
                        b = typeof block === "string"     ? document.querySelector (block)     : block,
                        h = b.offsetHeight,
                        p = getComputedStyle (b)["padding"],
                        m = getComputedStyle (b)["margin"],
                        r = getComputedStyle (b)["border"],
                        f = function () {
                            if (b.offsetHeight !== 0) {
                                if (h !== b.offsetHeight) h = b.offsetHeight;
                            }
                            js.css (b, b.offsetHeight == 0 ?
                                {height:h + "px", padding: p, margin: m, border: r, overflow: "visible"} :
                                {height:0, padding: 0, margin: 0, border : 0, overflow: "hidden"}
                            );
                        };
                if (open !== true) js.css (b, {height:0, padding: 0, margin: 0, border : 0});
                a.addEventListener ("click", f);
            }
            js.moving = function (active, relocatable, config) {
                /*
                 active      - элемент который будет захватываться мышкой (string = selector || html element)
                 relocatable - перемещаемый элемент (string = selector || html element)
                 config       - object
                    output      - метка определяющая перемещение элементов HTML при выходе за пределы захваченного элемента (default = false || true)
                 */
                var objActive = typeof active === "string" ? document.querySelector(active) : active,
                    objMoving = typeof relocatable === "string" ? document.querySelector(relocatable) : relocatable,
                    objStatus = false,
                    startPos  = {x:"", y:""},
                    move = function (e) {
                            if(objStatus){
                                objMoving.style.top  = e.clientY - startPos.y + "px";
                                objMoving.style.left = e.clientX - startPos.x + "px";
                            }
                    },
                    down = function (e) {
                            objStatus = true;
                            startPos.x = e.clientX - objMoving.offsetLeft;
                            startPos.y = e.clientY - objMoving.offsetTop;
                    },
                    up = function () {
                            objStatus = false;
                    };
                config    = typeof config !== "object" ? {} : config;
                config.output = typeof config.output === "undefined" ? true : config.output;
                objActive.addEventListener("mousedown", down);
                if(config.output) document.addEventListener("mousemove", move);
                else objActive.addEventListener("mousemove", move);
                document.addEventListener("mouseup", up);
            }
            js.resize = function (eResize, cssSeizure) {
                /*
                 * eResize - элемент который будет менять размеры (string = selector || html element)
                 * cssSeizure - настройки стилей для элемента регулятора размеров (object)
                 * */
                var seizure   = document.createElement ("div"),
                    cssR      = {
                        position: "absolute",
                        right: "-15px",
                        bottom: "-15px",
                        width: "15px",
                        height: "15px",
                        background: "rgba(0,0,0,0.7)",
                        zIndex: 9999999
                    },
                    resize    = typeof eResize === "string" ? document.querySelector (eResize) : eResize,
                    objStatus = false,
                    startPos  = {x:"", y:""},
                    wrapp = resize.parentNode.classList.contains ("relocBlock") ? resize.parentNode : resize,
                    move = function (e) {
                            if(objStatus){
                                var sTop = parseInt (getComputedStyle (seizure)["top"]),
                                    sLeft = parseInt (getComputedStyle (seizure)["left"]),
                                    nTop, nLeft;
                                seizure.style.top  = e.clientY - startPos.y + "px";
                                seizure.style.left = e.clientX - startPos.x + "px";
                                nTop = parseInt (getComputedStyle (seizure)["top"]);
                                nLeft = parseInt (getComputedStyle (seizure)["left"]);
                                resize.style.width = (parseInt (getComputedStyle (resize)["width"]) - (sLeft - nLeft)) + "px";
                                resize.style.height = (parseInt (getComputedStyle (resize)["height"]) - (sTop - nTop)) + "px";
                                if (0 >= seizure.offsetLeft) {
                                    resize.style.width = 0 + "px";
                                    seizure.style.left = 0 + "px";
                                }
                                if (0 >= seizure.offsetTop) {
                                    seizure.style.top = 0 + "px";
                                    resize.style.height = 0 + "px";
                                };
                            }
                        },
                    down = function (e) {
                            objStatus = true;
                            startPos.x = e.clientX - seizure.offsetLeft;
                            startPos.y = e.clientY - seizure.offsetTop;
                        },
                    up = function () {
                            objStatus = false;
                    },
                    pos = getComputedStyle(resize)["position"];
                if (typeof parseInt (getComputedStyle (wrapp)["bottom"]) === "number") {
                    wrapp.style.top = wrapp.offsetTop + "px";
                    wrapp.style.bottom = "auto";
                }
                if (typeof parseInt (getComputedStyle (wrapp)["right"]) === "number") {
                    wrapp.style.left = wrapp.offsetLeft + "px";
                    wrapp.style.right = "auto";
                }
                if (typeof cssSeizure === "object") {
                    var ban = ["position", "left", "right", "top", "bottom", "width", "height"]
                    for (var i in cssSeizure) {
                        if (ban.indexOf (i) !== -1) continue;
                        cssR[i] = cssSeizure[i];
                    }
                }
                js.css (seizure, cssR);
                if (pos !== "fixed" && pos !== "absolute" &&pos !== "relative") resize.style.position = "relative";
                seizure.classList.add ("resize");
                resize.appendChild (seizure);
                seizure.addEventListener("mousedown", down);
                document.addEventListener("mousemove", move);
                document.addEventListener("mouseup", up);
            }
            return js;
        } ());
        window.addEventListener ("load", function () {
            lib.resize (".elem .wrapp");
            lib.moving (".elem .reloc", ".elem");
            lib.spoiler (".elem .spoiler", ".elem .wrapp", true);
        });
    </script>
    <style>
        .elem{position:fixed;left:100px;top:100px;}
        .elem .wrapp{
            width: 300px;
            height: 100px;
            background: rgba(0,0,0,0.3);
            border: solid 1px rgba(255,0,0,1);
            box-shadow: inset 0px 0px 25px rgba(255,0,0,1), 0px 0px 25px rgba(255,0,0,1);
        }
        .elem .reloc{
            position: absolute;
            right: 0px;
            width: 50px;
            height: 25px;
            background: rgba(255,0,0,0.3);
            border: solid 1px rgba(255,0,0,1);
            box-shadow: inset 0px 0px 15px rgba(255,0,0,1), 0px 0px 15px rgba(255,0,0,1);
            top: -30px;
        }
        .elem .spoiler{
            position: absolute;
            right: 0px;
            width: 25px;
            height: 25px;
            background: rgba(0,150,255,0.3);
            border: solid 1px rgba(0,150,255,1);
            box-shadow: inset 0px 0px 15px rgba(0,150,255,1), 0px 0px 15px rgba(0,150,255,1);
            top: -60px;
        }
    </style>
</head>
<body>
    <div class="elem">
        <div class="reloc"></div>
        <div class="spoiler"></div>
        <div class="wrapp"></div>
    </div>
</body>
</html>
0
Fedor Vlasenko
Программист Php, Js
809 / 542 / 156
Регистрация: 01.02.2015
Сообщений: 1,664
12.11.2015, 12:16 #43
Pабота с localstorage, подписка на события localstorage, хранение функций, массивов и объектов в localstorage, интерфейс подписки позволяет передать параметры подписчикам (открытым вкладкам браузера), передать и выполнить в них переданные функции. Реализация работы между вкладками внутри браузера localstorage
Скачивайте и тестируйте примеры. Ваши желания и пожелания будут учтены.
HTML5
1
2
<script src="storage.js"></script>
<script>alert(_storage('name'));</script>
1
Padimanskas
Superposition
854 / 592 / 109
Регистрация: 27.10.2013
Сообщений: 2,060
23.03.2016, 14:07 #44
JSON-база c описанием 16-битных игр с приставки Sega. Всего 1012 игр - почти все что тогда существовали и даже пиратские. Описание на русском. Есть скриншоты.
Мб кому-то пригодится..
Архив tar.gzip
JSON свойства:
American - западное название игры
Japan - название игры в Японии
Year - год производства
Genre - жанр игры
Developer - разработчик игры
Img - путь к файлу скриншота
OName - другое название игры
Description - описание игры
1
Thisman
363 / 334 / 81
Регистрация: 17.07.2013
Сообщений: 950
27.03.2016, 21:10 #45
Мало ли может кому пригодиться, небольшая библиотека, для упрощенной работы с query string

Тут git репозиторий с тестами и прочими штуками

Полный код:
Кликните здесь для просмотра всего текста

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
var URLQueryBuilder = (function () {
    /**
    *   Merge two objects
    */
    function mergeObj(obj1, obj2) {
        var result = {};
        for(var i in obj1) result[i] = obj1[i];
        for(var j in obj2) result[j] = obj2[j];
 
        return result;
    }
    /**
    *   Parse queries
    *   @param {Object|string} queries
    *   @return {Object} parsed queries
    */
    function parseQueries (queries) {
        var parsedQueries = {};
 
        if(typeof queries === "string") {
            var queriesArray = queries.split("&");
            for(var i = 0; i < queriesArray.length; i++) {
                var query = queriesArray[i].split("=");
                // check to valud data
                if(query.length == 2)
                    parsedQueries[query[0]] = query[1];
            }       
        } else if(typeof (queries === "object") && queries) { // typeof null/undefined === "object"
            parsedQueries = queries; 
        }
 
        return parsedQueries;
    }
    /**
    *   Parse queries from inital url string
    *   @param {string} url
    */
    function parseQueriesFromUrl(url) {
        var queries = {};
 
        if(typeof url === 'string') {
            queries = url.split("?")[1];
            queries = parseQueries(queries);
        }
 
        return queries;
    }
    /**
    *   get a clear url without query
    *   @param {string} url
    *   @return {string} url without query string
    */
    function getClearUrl(url) {
        var clearedUrl = '';
 
        if(typeof url === 'string')
            clearedUrl = url.split("?")[0];
 
        return clearedUrl;
    }
 
 
    /**
    *   @constructor
    *   @param {string} url
    *   @param {string|object|undefined} queries
    */
    function URLQueryBuilder (url, queries) {
        this.url = getClearUrl(url);
        this.queries = parseQueriesFromUrl(url);
 
        var queriesFromParam = parseQueries(queries);
        this.queries = mergeObj(this.queries, queriesFromParam);
 
        
        /**
         *  Get a current url with queries
         */
        URLQueryBuilder.prototype.getUrl = function() {
            var url = this.url;
            var queries = '?';
            for(var name in this.queries)
                queries += (name + "=" + this.queries[name] + "&");
         
            return url + queries;
        };
        
 
        /**
         *  Get clear url without queries
         */
        URLQueryBuilder.prototype.getClearUrl = function() {
 
            return this.url;
        };
 
        /**
         *  Delete query by name
         *  @param {string} name, query that will be deleted
         */
        URLQueryBuilder.prototype.delete = function(name) {
            delete this.queries[name];
            
            return this;
        };
 
        /**
         *  Change query by name
         *  @param {string} name, query what will be changed
         *  @param {string|number} value, new value for query
         */
        URLQueryBuilder.prototype.change = function(name, value) {
            this.queries[name] = value.toString();
 
            return this;
        };
 
        /**
         *  Add new query
         *  @param {string} name, name of new query
         *  @param {string|number} value, value for new query
         */
        URLQueryBuilder.prototype.add = function(name, value) {
            if(typeof name === "string") {
                this.queries[name] = value.toString();
            } else if(typeof name === "object" && name) {
                var queries = name;
                for(var i in queries) 
                    this.add(i, queries[i]);
            } else {
                throw new Error("Param 'name' must be a string or an object");
            }
 
            return this;
        };
 
 
        /**
         *  Clear query string
         *  @param {string|object} queries
         */
        URLQueryBuilder.prototype.reset = function(queries) {
            this.queries = parseQueries(queries);
 
            return this;
        };
 
 
        /**
         *  Check if queries has specific query
         *  @return {boolean} true if has, false if not
         */
        URLQueryBuilder.prototype.has = function(name) {
 
            return (name in this.queries);
        };
    }
})();
0
27.03.2016, 21:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2016, 21:10
Привет! Вот еще темы с ответами:

Обмен готовыми решениями - PHP
&lt;?PHP echo getfilesize($_GET); // Функция для определения размера function getfilesize($filename) { // Проверяем,...

Обсуждение класса постраничной навигации из темы "Обмен готовыми решениями" - PHP
Выделено из темы: http://www.cyberforum.ru/php/thread158262-page2.html Para bellum, может стоит добавить методу get еще один не...

Связь с готовыми mdb и accdb через форму - C#
Добрый вечер! Нужна программная реализация подключения к бд, вывод данных из таблицы на форму через datagridview и сохранение новых...

.NET 4.x Может кто дать сайт с бесплатными готовыми курсовыми - C#
может кто дать сайт с бесплатными готовыми курсовыми? ну или скинуть готовую, может завалялась где


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru