Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
retypos-webclient
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
eterfund
retypos-webclient
Commits
51941ff0
Commit
51941ff0
authored
Jun 05, 2017
by
Георгий Попов
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
improve typos script. Add messages about comment
parent
a3105056
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
467 additions
and
422 deletions
+467
-422
etersoft_typos.js
etersoft_typos.js
+456
-420
etersoft_typos_language-ru.js
etersoft_typos_language-ru.js
+4
-2
stylesheet.css
stylesheet.css
+7
-0
No files found.
etersoft_typos.js
View file @
51941ff0
/* Плагин: сервис опечаток от компании Etersoft
* email: info@etersoft.ru
* автор: barbass@etersoft.ru
* дата: 2012-04-18
*/
* email: info@etersoft.ru
* автор: barbass@etersoft.ru
* дата: 2012-04-18
*/
function
ETYPOS
(
options
)
{
this
.
_init
(
options
);
this
.
_createControlPanel
();
this
.
_handleEvents
();
this
.
_init
(
options
);
this
.
_createControlPanel
();
this
.
_handleEvents
();
}
ETYPOS
.
prototype
=
{
//время последнего запроса
last_query_time
:
0
,
//задержка между запросами
request_delay
:
60000
,
//сайт обработки опечаток
server_url
:
"http://typos.server.ambulance.sandbox.eterhost.ru/server.php"
,
//текст ошибок
error
:
''
,
//язык по умочланияю
default_language
:
'ru'
,
selection
:
''
,
element
:
null
,
/* Переменные для перетаскивания */
isDragged
:
false
,
isVisible
:
false
,
lastMousePos
:
{
x
:
-
1000
,
y
:
-
1000
},
lastBoxPos
:
{
x
:
0
,
y
:
0
},
dragPadding
:
10
,
//данные для отправки (сайт страницы, текст с ошибкой, комментарий, язык, броузер)
userdata
:
{
'url'
:
''
,
'text'
:
''
,
'comment'
:
''
,
'language'
:
this
.
default_language
,
'old_browser'
:
0
,
},
language
:
{
'ru'
:
{
'error_url'
:
'Не определен URL сайта'
,
'error_text'
:
'Текст не выделен'
,
'error_text_length'
:
'Длина текста должна быть от %s до %s символов (сейчас: %s)'
,
'error_comment'
:
'Длина комментария должна быть до 30 символов (сейчас: %s)'
,
'error_time_activity'
:
'Вы слишком часто отправляете данные'
,
'error_response'
:
'Ошибка при получении ответа'
,
'error_parse_reposnse'
:
'Ошибка при обработке ответа'
,
'error_post_data'
:
'Ошибка отправки данных. Повторите позже'
,
'error_userdata'
:
'userdata is not Object'
,
'text_post_data'
:
'Идет отправка данных...'
,
'text_success'
:
'Спасибо за ваше внимание!'
,
}
},
// Создает контейнер и добавляет его в конец body
_createControlPanel
:
function
()
{
/* Main div */
var
div
=
document
.
createElement
(
"div"
);
div
.
className
=
"e_typos_div"
;
/* Title */
var
title
=
document
.
createElement
(
"div"
);
title
.
className
=
"e_typos_title"
;
title
.
innerHTML
=
"<span>Сервис Опечаток</span>
\
n
\
//время последнего запроса
last_query_time
:
0
,
//задержка между запросами
request_delay
:
60000
,
//сайт обработки опечаток
server_url
:
"http://typos.server.ambulance.sandbox.eterhost.ru/server.php"
,
//текст ошибок
error
:
''
,
//язык по умочланияю
default_language
:
'ru'
,
selection
:
''
,
element
:
null
,
/* Переменные для перетаскивания */
isDragged
:
false
,
isVisible
:
false
,
lastMousePos
:
{
x
:
-
1000
,
y
:
-
1000
},
lastBoxPos
:
{
x
:
0
,
y
:
0
},
dragPadding
:
10
,
//данные для отправки (сайт страницы, текст с ошибкой, комментарий, язык, броузер)
userdata
:
{
'url'
:
''
,
'text'
:
''
,
'comment'
:
''
,
'language'
:
this
.
default_language
,
'old_browser'
:
0
,
},
language
:
{
'ru'
:
{
'error_url'
:
'Не определен URL сайта'
,
'error_text'
:
'Текст не выделен'
,
'error_text_length'
:
'Длина текста должна быть от %s до %s символов (сейчас: %s)'
,
'error_comment_lenght'
:
'Длина комментария должна быть до 30 символов (сейчас: %s)'
,
'error_comment'
:
'Пожалуйста, укажите исправленный вариант'
,
'error_comment_useless'
:
'Исправленный вариант идентичен исходному'
,
'error_time_activity'
:
'Вы слишком часто отправляете данные'
,
'error_response'
:
'Ошибка при получении ответа'
,
'error_parse_reposnse'
:
'Ошибка при обработке ответа'
,
'error_post_data'
:
'Ошибка отправки данных. Повторите позже'
,
'error_userdata'
:
'userdata is not Object'
,
'text_post_data'
:
'Идет отправка данных...'
,
'text_success'
:
'Спасибо за ваше внимание!'
,
}
},
// Создает контейнер и добавляет его в конец body
_createControlPanel
:
function
()
{
/* Main div */
var
div
=
document
.
createElement
(
"div"
);
div
.
className
=
"e_typos_div"
;
/* Title */
var
title
=
document
.
createElement
(
"div"
);
title
.
className
=
"e_typos_title"
;
title
.
innerHTML
=
"<span>Сервис Опечаток</span>
\
n
\
<span title='Закрыть окно' class='e_typos_close'><b>x</b></span>"
;
/* Description */
var
desc
=
document
.
createElement
(
"p"
);
desc
.
className
=
"e_typos_desc"
;
desc
.
innerHTML
=
"Выделите текст и нажмите кнопку
\"
Отправить
\"
"
;
/* Comment */
var
p
=
document
.
createElement
(
"p"
);
var
comment
=
document
.
createElement
(
"input"
);
comment
.
className
=
"e_typos_comment"
;
comment
.
type
=
"text"
;
comment
.
size
=
19
;
comment
.
maxlength
=
50
;
comment
.
placeholder
=
"Должна быть буква..."
;
var
nobr
=
document
.
createElement
(
"nobr"
);
var
nobrText
=
document
.
createTextNode
(
"Комментарий: "
);
nobr
.
appendChild
(
nobrText
);
nobr
.
appendChild
(
comment
);
p
.
appendChild
(
nobr
);
/* Message */
var
message
=
document
.
createElement
(
"p"
);
message
.
className
=
"e_typos_message"
;
/* Controls */
var
controls
=
document
.
createElement
(
"p"
);
controls
.
className
=
"e_typos_controll_buttons"
;
var
postButton
=
document
.
createElement
(
"input"
);
postButton
.
className
=
"e_typos_button e_typos_post"
;
postButton
.
type
=
"button"
;
postButton
.
title
=
"Отправить сообщение об опечатке"
;
postButton
.
value
=
"Отправить"
;
var
closeButton
=
document
.
createElement
(
"input"
);
closeButton
.
className
=
"e_typos_button e_typos_close"
;
closeButton
.
type
=
"button"
;
closeButton
.
title
=
"Закрыть окно"
;
closeButton
.
value
=
"Закрыть"
;
controls
.
appendChild
(
postButton
);
controls
.
appendChild
(
closeButton
);
/* Construct div */
div
.
appendChild
(
title
);
div
.
appendChild
(
desc
);
div
.
appendChild
(
p
);
div
.
appendChild
(
message
);
div
.
appendChild
(
controls
);
document
.
body
.
appendChild
(
div
);
this
.
element
=
document
.
querySelector
(
".e_typos_div"
);
},
/* Description */
var
desc
=
document
.
createElement
(
"p"
);
desc
.
className
=
"e_typos_desc"
;
desc
.
innerHTML
=
"Текст с ошибкой:
\"
<span class='e_typos_text'></span>
\"
"
;
/* Comment */
var
p
=
document
.
createElement
(
"p"
);
var
comment
=
document
.
createElement
(
"input"
);
comment
.
className
=
"e_typos_comment"
;
comment
.
type
=
"text"
;
comment
.
size
=
19
;
comment
.
maxlength
=
50
;
comment
.
placeholder
=
"Должна быть буква..."
;
var
nobr
=
document
.
createElement
(
"nobr"
);
var
nobrText
=
document
.
createTextNode
(
"Исправленный вариант: "
);
nobr
.
appendChild
(
nobrText
);
nobr
.
appendChild
(
comment
);
p
.
appendChild
(
nobr
);
/* Message */
var
message
=
document
.
createElement
(
"p"
);
message
.
className
=
"e_typos_message"
;
/* Controls */
var
controls
=
document
.
createElement
(
"p"
);
controls
.
className
=
"e_typos_controll_buttons"
;
var
postButton
=
document
.
createElement
(
"input"
);
postButton
.
className
=
"e_typos_button e_typos_post"
;
postButton
.
type
=
"button"
;
postButton
.
title
=
"Отправить сообщение об опечатке"
;
postButton
.
value
=
"Отправить"
;
var
closeButton
=
document
.
createElement
(
"input"
);
closeButton
.
className
=
"e_typos_button e_typos_close"
;
closeButton
.
type
=
"button"
;
closeButton
.
title
=
"Закрыть окно"
;
closeButton
.
value
=
"Закрыть"
;
controls
.
appendChild
(
postButton
);
controls
.
appendChild
(
closeButton
);
/* Construct div */
div
.
appendChild
(
title
);
div
.
appendChild
(
desc
);
div
.
appendChild
(
p
);
div
.
appendChild
(
message
);
div
.
appendChild
(
controls
);
document
.
body
.
appendChild
(
div
);
this
.
element
=
document
.
querySelector
(
".e_typos_div"
);
},
// Нужны для onmousemove
box_x
:
0
,
box_y
:
0
,
_handleEvents
:
function
()
{
var
self
=
this
;
document
.
querySelector
(
'.e_typos_div .e_typos_close'
).
addEventListener
(
'click'
,
function
()
{
self
.
closeWindow
();
},
false
);
document
.
querySelector
(
'.e_typos_button.e_typos_close'
).
addEventListener
(
'click'
,
function
()
{
self
.
closeWindow
();
},
false
);
document
.
querySelector
(
'.e_typos_button.e_typos_post'
).
addEventListener
(
'click'
,
function
()
{
self
.
postData
();
},
false
);
window
.
document
.
onkeydown
=
function
(
e
)
{
if
(
e
.
ctrlKey
==
1
&&
e
.
keyCode
==
13
)
{
self
.
selection
=
self
.
getSelectText
();
if
(
self
.
selection
===
""
||
self
.
selection
===
" "
)
{
alert
(
"Сервис опечаток.
\
nДля отчета об ошибке выделите текст!"
);
return
;
}
document
.
querySelector
(
'.e_typos_text'
).
innerHTML
=
self
.
selection
.
trim
();
self
.
controlPanel
();
}
};
this
.
element
.
addEventListener
(
"mousedown"
,
function
(
e
)
{
self
.
clearSelectedText
();
self
.
lastMousePos
.
x
=
e
.
clientX
;
self
.
lastMousePos
.
y
=
e
.
clientY
;
self
.
lastBoxPos
.
x
=
self
.
element
.
offsetLeft
;
self
.
lastBoxPos
.
y
=
self
.
element
.
offsetTop
;
self
.
isDragged
=
true
;
return
false
;
});
this
.
element
.
addEventListener
(
"mouseup"
,
function
()
{
self
.
isDragged
=
false
;
});
document
.
addEventListener
(
"mousemove"
,
function
(
e
)
{
if
(
self
.
isDragged
&&
self
.
isVisible
&&
(
e
.
buttons
&
1
))
{
self
.
box_x
=
(
self
.
lastBoxPos
.
x
+
(
e
.
clientX
-
self
.
lastMousePos
.
x
));
self
.
box_y
=
(
self
.
lastBoxPos
.
y
+
(
e
.
clientY
-
self
.
lastMousePos
.
y
));
if
(
self
.
box_x
+
self
.
element
.
scrollWidth
+
self
.
dragPadding
>
window
.
innerWidth
||
self
.
box_x
<
0
)
{
return
;
}
if
(
self
.
box_y
+
self
.
element
.
scrollHeight
+
self
.
dragPadding
>
window
.
innerHeight
||
self
.
box_y
<
0
)
{
return
;
}
self
.
element
.
style
.
left
=
self
.
box_x
+
"px"
;
self
.
element
.
style
.
top
=
self
.
box_y
+
"px"
;
}
});
},
_init
:
function
(
options
)
{
this
.
options
=
(
options
)
?
options
:
{};
if
(
this
.
options
[
'server_url'
])
{
this
.
server_url
=
this
.
options
[
'server_url'
];
}
if
(
this
.
options
[
'language'
])
{
if
(
this
.
language
[
this
.
options
[
'language'
]])
{
this
.
default_language
=
this
.
options
[
'language'
];
this
.
userdata
[
'language'
]
=
this
.
default_language
;
}
}
this
.
request
=
new
(
window
.
XDomainRequest
||
window
.
XMLHttpRequest
);
this
.
userdata
[
'old_browser'
]
=
(
this
.
request
.
withCredentials
==
undefined
)
?
1
:
0
;
},
clearSelectedText
:
function
()
{
if
(
window
.
getSelection
)
{
if
(
window
.
getSelection
().
empty
)
{
// Chrome
window
.
getSelection
().
empty
();
}
else
if
(
window
.
getSelection
().
removeAllRanges
)
{
// Firefox
window
.
getSelection
().
removeAllRanges
();
}
}
else
if
(
document
.
selection
)
{
// IE?
document
.
selection
.
empty
();
}
},
/*Получаем выделенный текст*/
getSelectText
:
function
()
{
return
(
window
.
getSelection
())
?
String
(
window
.
getSelection
())
:
this
.
selection
;
},
/*Скрытие/показ окна*/
controlPanel
:
function
()
{
(
this
.
element
.
style
.
display
===
"block"
)
?
this
.
closeWindow
()
:
this
.
openWindow
();
},
/*Открытие окна*/
openWindow
:
function
()
{
var
main_div
=
this
.
element
;
//Определяем на какой позиции X, Y всплывет элемент
var
top
=
window
.
pageYOffset
+
window
.
innerHeight
/
3
;
var
left
=
window
.
pageXOffset
+
window
.
innerWidth
/
3
;
main_div
.
style
.
top
=
top
+
"px"
;
main_div
.
style
.
left
=
left
+
"px"
;
main_div
.
style
.
display
=
"none"
;
main_div
.
querySelector
(
".e_typos_comment"
).
value
=
""
;
main_div
.
querySelector
(
".e_typos_message"
).
innerHTML
=
""
;
main_div
.
style
.
display
=
"block"
;
this
.
isVisible
=
true
;
},
/*Закрытия окна*/
closeWindow
:
function
()
{
this
.
element
.
style
.
display
=
"none"
;
this
.
isVisible
=
false
;
},
/*Проверка данных перед отправкой*/
validateData
:
function
()
{
if
(
typeof
(
this
.
userdata
)
!==
'object'
)
{
throw
new
Error
(
this
.
language
[
this
.
default_language
][
'error_userdata'
]);
return
false
;
}
if
(
this
.
userdata
[
'url'
]
===
''
)
{
this
.
error
=
this
.
language
[
this
.
default_language
][
'error_url'
];
return
false
;
}
if
(
!
this
.
userdata
[
'language'
])
{
this
.
userdata
[
'language'
]
=
this
.
default_language
;
}
if
(
!
this
.
userdata
[
'text'
])
{
this
.
error
=
this
.
language
[
this
.
default_language
][
'error_text'
];
return
false
;
}
if
(
!
this
.
userdata
[
'comment'
])
{
this
.
error
=
this
.
language
[
this
.
default_language
][
'error_comment'
];
return
false
;
}
else
if
(
this
.
userdata
[
'comment'
]
==
this
.
userdata
[
'text'
]
)
{
this
.
error
=
this
.
language
[
this
.
default_language
][
'error_comment_useless'
];
return
false
;
}
// Нужны для onmousemove
box_x
:
0
,
box_y
:
0
,
if
(
this
.
userdata
[
'text'
].
length
<
5
||
this
.
userdata
[
'text'
].
length
>
30
)
{
this
.
error
=
"Выделенный текст должен быть длиной от 5 до 30 символов (сейчас: "
+
this
.
userdata
[
'text'
].
length
+
")"
;
return
false
;
}
if
(
this
.
userdata
[
'comment'
].
length
>
30
)
{
this
.
error
=
"Комментарий должен быть длиной до 30 символов (сейчас: "
+
this
.
userdata
[
'comment'
].
length
+
")"
;
return
false
;
}
return
true
;
},
/*Сбор данных*/
postData
:
function
()
{
this
.
userdata
[
'url'
]
=
window
.
location
.
href
;
this
.
userdata
[
'text'
]
=
this
.
selection
.
trim
();
this
.
userdata
[
'comment'
]
=
(
document
.
querySelector
(
".e_typos_div .e_typos_comment"
))
?
document
.
querySelector
(
".e_typos_div .e_typos_comment"
).
value
:
''
;
this
.
userdata
[
'comment'
]
=
this
.
userdata
[
'comment'
].
trim
();
_handleEvents
:
function
()
{
var
self
=
this
;
document
.
querySelector
(
'.e_typos_div .e_typos_close'
).
addEventListener
(
'click'
,
function
()
{
self
.
closeWindow
();
},
false
);
document
.
querySelector
(
'.e_typos_button.e_typos_close'
).
addEventListener
(
'click'
,
function
()
{
self
.
closeWindow
();
},
false
);
document
.
querySelector
(
'.e_typos_button.e_typos_post'
).
addEventListener
(
'click'
,
function
()
{
self
.
postData
();
},
false
);
window
.
document
.
onkeydown
=
function
(
e
)
{
if
(
e
.
ctrlKey
==
1
&&
e
.
keyCode
==
13
)
{
self
.
selection
=
self
.
getSelectText
();
self
.
controlPanel
();
try
{
if
(
!
this
.
validateData
())
{
this
.
printMessage
(
'error'
,
this
.
error
);
return
false
;
}
}
catch
(
error
)
{
alert
(
error
);
this
.
printMessage
(
'error'
,
error
.
message
);
return
false
;
}
//Если не поддерживаются кроссдоменные запросы
if
(
this
.
userdata
[
'old_browser'
])
{
this
.
ajaxQueryOldBrowser
();
}
else
{
this
.
ajaxQuery
();
}
},
/*Создание формы с данными*/
formData
:
function
()
{
if
(
!
new
FormData
())
{
throw
new
Error
(
"FormData() не поддерживается"
);
return
false
;
}
var
form_data
=
new
FormData
();
for
(
var
key
in
this
.
userdata
)
{
form_data
.
append
(
key
,
this
.
userdata
[
key
]);
}
return
form_data
;
},
/*Отправка данных на старых броузерах*/
ajaxQueryOldBrowser
:
function
()
{
var
this_object
=
this
;
window
.
open
(
this
.
server_url
+
'?old_browser='
+
encodeURIComponent
(
this
.
userdata
[
'old_browser'
])
+
'&url='
+
encodeURI
(
this
.
userdata
[
'url'
])
+
'&comment='
+
encodeURIComponent
(
this
.
userdata
[
'comment'
])
+
'&text='
+
encodeURIComponent
(
this
.
userdata
[
'text'
]
+
'&language='
+
encodeURIComponent
(
this
.
userdata
[
'language'
])),
'_blank'
);
window
.
parent
.
focus
();
this
.
printMessage
(
"success"
,
this
.
language
[
this
.
default_language
][
'text_success'
]);
window
.
setTimeout
(
function
()
{
this_object
.
closeWindow
();
},
4000
);
return
true
;
},
/*Отправка запроса*/
ajaxQuery
:
function
()
{
var
this_object
=
this
;
try
{
var
form_data
=
this
.
formData
();
}
catch
(
error
)
{
this
.
printMessage
(
"error"
,
error
.
message
);
return
false
;
}
if
(
!
this
.
checkTime
())
{
this
.
printMessage
(
"error"
,
this
.
language
[
this
.
default_language
][
'error_time_activity'
]);
return
false
;
}
else
{
this
.
last_query_time
=
this
.
getTime
();
this
.
setStorage
(
"etersoft_typos/"
+
window
.
location
.
hostname
+
""
,
this
.
getTime
());
}
this
.
printMessage
(
"attention"
,
this
.
language
[
this
.
default_language
][
'text_post_data'
]);
this
.
request
.
open
(
"POST"
,
this
.
server_url
,
true
);
this
.
request
.
onload
=
function
()
{
try
{
var
response
=
window
.
JSON
.
parse
(
this_object
.
request
.
responseText
);
if
(
response
[
'success'
]
&&
response
[
'message'
])
{
if
(
response
[
'success'
]
==
'true'
)
{
var
success
=
'success'
;
}
else
{
var
success
=
'error'
;
}
this_object
.
printMessage
(
success
,
response
[
'message'
]);
}
else
{
this_object
.
printMessage
(
'attention'
,
this_object
.
language
[
this_object
.
default_language
][
'error_response'
]);
}
};
this
.
element
.
addEventListener
(
"mousedown"
,
function
(
e
)
{
self
.
lastMousePos
.
x
=
e
.
clientX
;
self
.
lastMousePos
.
y
=
e
.
clientY
;
self
.
lastBoxPos
.
x
=
self
.
element
.
offsetLeft
;
self
.
lastBoxPos
.
y
=
self
.
element
.
offsetTop
;
self
.
isDragged
=
true
;
});
this
.
element
.
addEventListener
(
"mouseup"
,
function
()
{
self
.
isDragged
=
false
;
});
document
.
addEventListener
(
"mousemove"
,
function
(
e
)
{
if
(
self
.
isDragged
&&
self
.
isVisible
&&
(
e
.
buttons
&
1
)
)
{
self
.
box_x
=
(
self
.
lastBoxPos
.
x
+
(
e
.
clientX
-
self
.
lastMousePos
.
x
)
);
self
.
box_y
=
(
self
.
lastBoxPos
.
y
+
(
e
.
clientY
-
self
.
lastMousePos
.
y
)
);
if
(
self
.
box_x
+
self
.
element
.
scrollWidth
+
self
.
dragPadding
>
window
.
innerWidth
||
self
.
box_x
<
0
)
{
return
;
}
if
(
self
.
box_y
+
self
.
element
.
scrollHeight
+
self
.
dragPadding
>
window
.
innerHeight
||
self
.
box_y
<
0
)
{
return
;
}
self
.
element
.
style
.
left
=
self
.
box_x
+
"px"
;
self
.
element
.
style
.
top
=
self
.
box_y
+
"px"
;
}
});
},
_init
:
function
(
options
)
{
this
.
options
=
(
options
)
?
options
:
{};
if
(
this
.
options
[
'server_url'
])
{
this
.
server_url
=
this
.
options
[
'server_url'
];
}
if
(
this
.
options
[
'language'
])
{
if
(
this
.
language
[
this
.
options
[
'language'
]])
{
this
.
default_language
=
this
.
options
[
'language'
];
this
.
userdata
[
'language'
]
=
this
.
default_language
;
}
}
this
.
request
=
new
(
window
.
XDomainRequest
||
window
.
XMLHttpRequest
);
this
.
userdata
[
'old_browser'
]
=
(
this
.
request
.
withCredentials
==
undefined
)
?
1
:
0
;
},
/*Получаем выделенный текст*/
getSelectText
:
function
()
{
return
(
window
.
getSelection
())
?
String
(
window
.
getSelection
())
:
this
.
selection
;
},
/*Скрытие/показ окна*/
controlPanel
:
function
()
{
(
this
.
element
.
style
.
display
==
"block"
)
?
this
.
closeWindow
()
:
this
.
openWindow
();
},
/*Открытие окна*/
openWindow
:
function
()
{
//console.log(this.selection);
var
main_div
=
this
.
element
;
//Определяем на какой позиции X, Y всплывет элемент
var
top
=
window
.
pageYOffset
+
window
.
innerHeight
/
3
;
var
left
=
window
.
pageXOffset
+
window
.
innerWidth
/
3
;
main_div
.
style
.
top
=
top
+
"px"
;
main_div
.
style
.
left
=
left
+
"px"
;
main_div
.
style
.
display
=
"none"
;
main_div
.
querySelector
(
".e_typos_comment"
).
value
=
""
;
main_div
.
querySelector
(
".e_typos_message"
).
innerHTML
=
""
;
main_div
.
style
.
display
=
"block"
;
this
.
isVisible
=
true
;
},
/*Закрытия окна*/
closeWindow
:
function
()
{
this
.
element
.
style
.
display
=
"none"
;
this
.
isVisible
=
false
;
},
/*Проверка данных перед отправкой*/
validateData
:
function
()
{
if
(
typeof
(
this
.
userdata
)
!=
'object'
)
{
throw
new
Error
(
this
.
language
[
this
.
default_language
][
'error_userdata'
]);
return
false
;
}
if
(
this
.
userdata
[
'url'
]
==
''
)
{
this
.
error
=
this
.
language
[
this
.
default_language
][
'error_url'
];
return
false
;
}
if
(
!
this
.
userdata
[
'language'
])
{
this
.
userdata
[
'language'
]
=
this
.
default_language
;
}
if
(
!
this
.
userdata
[
'text'
])
{
this
.
error
=
this
.
language
[
this
.
default_language
][
'error_text'
];
return
false
;
}
if
(
this
.
userdata
[
'text'
].
length
<
5
||
this
.
userdata
[
'text'
].
length
>
30
)
{
this
.
error
=
"Выделенный текст должен быть длиной от 5 до 30 символов (сейчас: "
+
this
.
userdata
[
'text'
].
length
+
")"
;
return
false
;
}
if
(
this
.
userdata
[
'comment'
].
length
>
30
)
{
this
.
error
=
"Комментарий должен быть длиной до 30 символов (сейчас: "
+
this
.
userdata
[
'comment'
].
length
+
")"
;
return
false
;
}
return
true
;
},
/*Сбор данных*/
postData
:
function
()
{
this
.
userdata
[
'url'
]
=
window
.
location
.
href
;
this
.
userdata
[
'text'
]
=
this
.
getSelectText
();
this
.
userdata
[
'comment'
]
=
(
document
.
querySelector
(
".e_typos_div .e_typos_comment"
))
?
document
.
querySelector
(
".e_typos_div .e_typos_comment"
).
value
:
''
;
try
{
if
(
!
this
.
validateData
())
{
this
.
printMessage
(
'error'
,
this
.
error
);
return
false
;
}
}
catch
(
error
)
{
alert
(
error
);
this
.
printMessage
(
'error'
,
error
.
message
);
return
false
;
}
//Если не поддерживаются кроссдоменные запросы
if
(
this
.
userdata
[
'old_browser'
])
{
this
.
ajaxQueryOldBrowser
();
}
else
{
this
.
ajaxQuery
();
}
},
/*Создание формы с данными*/
formData
:
function
()
{
if
(
!
new
FormData
())
{
throw
new
Error
(
"FormData() не поддерживается"
);
return
false
;
}
var
form_data
=
new
FormData
();
for
(
var
key
in
this
.
userdata
)
{
form_data
.
append
(
key
,
this
.
userdata
[
key
]);
}
return
form_data
;
},
/*Отправка данных на старых броузерах*/
ajaxQueryOldBrowser
:
function
()
{
var
this_object
=
this
;
window
.
open
(
this
.
server_url
+
'?old_browser='
+
encodeURIComponent
(
this
.
userdata
[
'old_browser'
])
+
'&url='
+
encodeURI
(
this
.
userdata
[
'url'
])
+
'&comment='
+
encodeURIComponent
(
this
.
userdata
[
'comment'
])
+
'&text='
+
encodeURIComponent
(
this
.
userdata
[
'text'
]
+
'&language='
+
encodeURIComponent
(
this
.
userdata
[
'language'
])),
'_blank'
);
window
.
parent
.
focus
();
this
.
printMessage
(
"success"
,
this
.
language
[
this
.
default_language
][
'text_success'
]);
window
.
setTimeout
(
function
()
{
this_object
.
closeWindow
();},
4000
);
return
true
;
},
/*Отправка запроса*/
ajaxQuery
:
function
()
{
var
this_object
=
this
;
try
{
var
form_data
=
this
.
formData
();
}
catch
(
error
)
{
this
.
printMessage
(
"error"
,
error
.
message
);
return
false
;
}
if
(
!
this
.
checkTime
())
{
this
.
printMessage
(
"error"
,
this
.
language
[
this
.
default_language
][
'error_time_activity'
]);
return
false
;
}
else
{
this
.
last_query_time
=
this
.
getTime
();
this
.
setStorage
(
"etersoft_typos/"
+
window
.
location
.
hostname
+
""
,
this
.
getTime
());
}
this
.
printMessage
(
"attention"
,
this
.
language
[
this
.
default_language
][
'text_post_data'
]);
this
.
request
.
open
(
"POST"
,
this
.
server_url
,
true
);
this
.
request
.
onload
=
function
()
{
try
{
var
response
=
window
.
JSON
.
parse
(
this_object
.
request
.
responseText
);
if
(
response
[
'success'
]
&&
response
[
'message'
])
{
if
(
response
[
'success'
]
==
'true'
)
{
var
success
=
'success'
;
}
else
{
var
success
=
'error'
;
}
this_object
.
printMessage
(
success
,
response
[
'message'
]);
}
else
{
this_object
.
printMessage
(
'attention'
,
this_object
.
language
[
this_object
.
default_language
][
'error_response'
]);
}
}
catch
(
e
)
{
this_object
.
printMessage
(
'error'
,
this_object
.
language
[
this_object
.
default_language
][
'error_response_parse'
]);
}
};
this
.
request
.
onerror
=
function
()
{
this_object
.
printMessage
(
"error"
,
this_object
.
language
[
this_object
.
default_language
][
'error_post_data'
]);
};
this
.
request
.
send
(
form_data
);
},
/*Печатаем сообщение пользователю в окно*/
printMessage
:
function
(
status
,
text
)
{
document
.
querySelector
(
".e_typos_div .e_typos_message"
).
innerHTML
=
"<span class='"
+
status
+
"'>"
+
text
+
"</span>"
;
},
//Вывод текста, выделенного пользователем
printUserText
:
function
(
text
)
{
document
.
querySelector
(
".e_typos_div .e_typos_user_text"
).
style
.
display
=
"block"
;
document
.
querySelector
(
".e_typos_div .e_typos_user_text"
).
innerHTML
=
"Ваш текст: "
+
text
;
},
/*Проверяем время, прошедшее с последнего отправления данных*/
checkTime
:
function
()
{
var
prev_time
=
(
parseInt
(
this
.
getStorage
(
"etersoft_typos/"
+
window
.
location
.
hostname
)))
?
parseInt
(
this
.
getStorage
(
"etersoft_typos/"
+
window
.
location
.
hostname
))
:
parseInt
(
this
.
last_query_time
);
if
(
isNaN
(
prev_time
))
{
return
true
;
}
if
(
(
this
.
getTime
()
-
prev_time
)
<
this
.
request_delay
)
{
return
false
;
}
return
true
;
},
/*Получаем текущее время*/
getTime
:
function
()
{
return
new
Date
().
getTime
();
},
/*Получаем из sessionStorage данные*/
getStorage
:
function
(
key
)
{
if
(
window
[
'sessionStorage'
])
{
return
(
sessionStorage
.
getItem
(
key
))
?
sessionStorage
.
getItem
(
key
)
:
false
;
}
else
{
return
false
;
}
},
/*Устанавливаем в sessionStorage данные*/
setStorage
:
function
(
key
,
data
)
{
if
(
window
[
'sessionStorage'
])
{
sessionStorage
.
setItem
(
key
+
""
,
data
);
return
true
;
}
return
false
;
}
}
catch
(
e
)
{
this_object
.
printMessage
(
'error'
,
this_object
.
language
[
this_object
.
default_language
][
'error_response_parse'
]);
}
};
this
.
request
.
onerror
=
function
()
{
this_object
.
printMessage
(
"error"
,
this_object
.
language
[
this_object
.
default_language
][
'error_post_data'
]);
};
this
.
request
.
send
(
form_data
);
},
/*Печатаем сообщение пользователю в окно*/
printMessage
:
function
(
status
,
text
)
{
document
.
querySelector
(
".e_typos_div .e_typos_message"
).
innerHTML
=
"<span class='"
+
status
+
"'>"
+
text
+
"</span>"
;
},
//Вывод текста, выделенного пользователем
printUserText
:
function
(
text
)
{
document
.
querySelector
(
".e_typos_div .e_typos_user_text"
).
style
.
display
=
"block"
;
document
.
querySelector
(
".e_typos_div .e_typos_user_text"
).
innerHTML
=
"Ваш текст: "
+
text
;
},
/*Проверяем время, прошедшее с последнего отправления данных*/
checkTime
:
function
()
{
var
prev_time
=
(
parseInt
(
this
.
getStorage
(
"etersoft_typos/"
+
window
.
location
.
hostname
)))
?
parseInt
(
this
.
getStorage
(
"etersoft_typos/"
+
window
.
location
.
hostname
))
:
parseInt
(
this
.
last_query_time
);
if
(
isNaN
(
prev_time
))
{
return
true
;
}
if
((
this
.
getTime
()
-
prev_time
)
<
this
.
request_delay
)
{
return
false
;
}
return
true
;
},
/*Получаем текущее время*/
getTime
:
function
()
{
return
new
Date
().
getTime
();
},
/*Получаем из sessionStorage данные*/
getStorage
:
function
(
key
)
{
if
(
window
[
'sessionStorage'
])
{
return
(
sessionStorage
.
getItem
(
key
))
?
sessionStorage
.
getItem
(
key
)
:
false
;
}
else
{
return
false
;
}
},
/*Устанавливаем в sessionStorage данные*/
setStorage
:
function
(
key
,
data
)
{
if
(
window
[
'sessionStorage'
])
{
sessionStorage
.
setItem
(
key
+
""
,
data
);
return
true
;
}
return
false
;
}
};
etersoft_typos_language-ru.js
View file @
51941ff0
...
...
@@ -2,7 +2,9 @@ ETYPOS.prototype.language['ru'] = {
'error_url'
:
'Не определен URL сайта'
,
'error_text'
:
'Текст не выделен'
,
'error_text_length'
:
'Длина текста должна быть от %s до %s символов (сейчас: %s)'
,
'error_comment'
:
'Длина комментария должна быть до 30 символов (сейчас: %s)'
,
'error_comment_lenght'
:
'Длина комментария должна быть до 30 символов (сейчас: %s)'
,
'error_comment'
:
'Пожалуйста, укажите исправленный вариант'
,
'error_comment_useless'
:
'Исправленный вариант идентичен исходному'
,
'error_time_activity'
:
'Вы слишком часто отправляете данные'
,
'error_response'
:
'Ошибка при получении ответа'
,
'error_response_parse'
:
'Ошибка при обработке ответа'
,
...
...
@@ -10,6 +12,6 @@ ETYPOS.prototype.language['ru'] = {
'error_userdata'
:
'userdata is not Object'
,
'text_post_data'
:
'Идет отправка данных...'
,
'text_success'
:
'Спасибо за ваше внимание!'
,
'text_success'
:
'Спасибо за ваше внимание!'
};
stylesheet.css
View file @
51941ff0
...
...
@@ -12,6 +12,7 @@
-moz-user-select
:
none
;
-webkit-user-select
:
none
;
border
:
1px
solid
#4169e1
;
cursor
:
pointer
;
}
.e_typos_div
.e_typos_title
{
...
...
@@ -86,4 +87,9 @@
.e_typos_div
.e_typos_controll_buttons
.e_typos_post
{
margin-right
:
40px
;
}
.e_typos_text
{
color
:
red
;
font-size
:
110%
;
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment