Commit a044c95d authored by Vladislav Bolshakov's avatar Vladislav Bolshakov

barbass: рефакторинг скрипта

parent 97231efe
...@@ -4,205 +4,255 @@ ...@@ -4,205 +4,255 @@
* дата: 2012-04-18 * дата: 2012-04-18
*/ */
////////////////////////////////////////////////////// function ETYPOS(options) {
this.init(options);
window.document.onkeydown = function(e) {
if (e.ctrlKey==1 && e.keyCode == 13) {
ETY.control_panel();
}
} }
ETYPOS.prototype = {
var ETY = { //время последнего запроса
time: 0, //время последнего запроса last_query_time: 0,
//сайт обработки опечаток
server_url: "http://barbass.pubsandbox.eterhost.ru/typos/server.php", server_url: "http://barbass.pubsandbox.eterhost.ru/typos/server.php",
select_text: "", //текст ошибок
error: '',
//Выделенный текст //данные для отправки (сайт страницы, текст с ошибкой, комментарий, язык, броузер)
get_select_text: function() { userdata: {
var text = String(window.getSelection()).trim().substr(0, 50); 'url': '',
if (typeof(text) == 'undefined') { 'text': '',
text = ""; 'comment': '',
} 'language': 'ru',
return text; 'oldbrowser': 0,
}, },
control_panel: function() { init: function(options) {
if (document.getElementById("e_typos_div").style.display == "block") { this.options = (options) ? options : {};
this.close();
} else { if (this.options['server_url']) {
this.div(); this.server_url = this.options['server_url'];
ETY.select_text = ETY.get_select_text();
} }
this.request = new (window.XDomainRequest || window.XMLHttpRequest);
this.userdata['oldbrowser'] = 0;//(this.request.withCredentials == undefined) ? 1 : 0;
}, },
div: function() { /*Получаем выделенный текст*/
getSelectText: function() {
return (window.getSelection()) ? String(window.getSelection()) : '';
},
/*Скрытие/показ окна*/
controlPanel: function() {
(document.querySelector(".e_typos_div").style.display == "block") ? this.closeWindow() : this.openWindow();
},
/*Открытие окна*/
openWindow: function() {
var main_div = document.querySelector(".e_typos_div");
//Определяем на какой позиции X, Y всплывет элемент //Определяем на какой позиции X, Y всплывет элемент
var top = window.pageYOffset + window.innerHeight/3; var top = window.pageYOffset + window.innerHeight/3;
var left = window.pageXOffset + window.innerWidth/3; var left = window.pageXOffset + window.innerWidth/3;
document.getElementById("e_typos_div").style.top = top + "px"; main_div.style.top = top + "px";
document.getElementById("e_typos_div").style.left = left + "px"; main_div.style.left = left + "px";
main_div.style.display = "none";
document.getElementById("e_typos_error").style.display = "none";
document.getElementById("e_typos_comment").value = ""; main_div.querySelector(".e_typos_comment").value = "";
main_div.querySelector(".e_typos_message").innerHTML = "";
document.getElementById("e_typos_div").style.display = "block"; main_div.style.display = "block";
}, },
close: function() { /*Закрытия окна*/
document.getElementById("e_typos_div").style.display = "none"; closeWindow: function() {
document.querySelector(".e_typos_div").style.display = "none";
}, },
post_data: function() { /*Проверка данных перед отправкой*/
var this_url = window.location.href; //Текущая страница validateData: function() {
var post_text; if (!this.userdata) {
if (ETY.select_text == "") { throw new Error("Not found userdata-object!");
post_text = ETY.get_select_text(); return false;
} else { }
post_text = ETY.select_text;
if (typeof(this.userdata) != 'object') {
throw new Error("userdata is not object!");
return false;
} }
var new_text = ETY.get_select_text(); if (this.userdata['url'] == '') {
this.error = "Не определен URL сайта";
return false;
}
if (!this.userdata['language']) {
this.userdata['language'] = 'ru';
return false;
}
if (!this.userdata['text']) {
this.error = "Текст не выделен";
return false;
}
if (this.userdata['text'].length < 5 || this.userdata['text'].length > 30) {
this.error = "Выделенный текст должен быть длиной от 5 до 30 символов (сейчас: "+this.userdata['text'].length+")";
return false;
}
if (new_text != ETY.select_text && new_text.length != 0) { if (this.userdata['comment'].length > 50) {
post_text = new_text; this.error = "Комментарий должен быть длиной до 30 символов (сейчас: "+this.userdata['comment'].length+")";
return false;
} }
//Выделенный текст return true;
var user_comment = document.getElementById("e_typos_comment").value.trim().substr(0, 50); },
if (user_comment == '') {
user_comment = ""; /*Сбор данных*/
} 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 : '';
if (post_text.length == 0) { try {
this.error("red", "Вы ничего не выделили"); if (!this.validateData()) {
} else if (post_text.length < 5) { this.printMessage('error', this.error);
this.error("red", "Выделенный текст слишком короток"); return false;
} else if (post_text.length > 30) { }
this.error("red", "Выделенный текст слишком длинный"); } catch(error) {alert(error);
} else { this.printMessage('error', error.message);
ETY.select_text = post_text; return false;
//Ajax-запрос
this.ajax_query(this.server_url+"?e_typos_url="+this_url+"&e_typos_comment="+encodeURIComponent(user_comment)+"&e_typos_error_text="+encodeURIComponent(post_text));
} }
//Если не поддерживаются кроссдоменные запросы
if (this.userdata['oldbrowser']) {
this.ajaxQueryOldBrowser();
} else {
this.ajaxQuery();
}
}, },
//Отправка запроса /*Создание формы с данными*/
ajax_query: function(url) { formData: function() {
this.error("black", "Идет отправка данных..."); if (!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;
},
var XHR = window.XDomainRequest || window.XMLHttpRequest; /*Отправка данных на старых броузерах*/
request = new XHR; ajaxQueryOldBrowser: function() {
window.open(this.server_url+'?oldbrowser='+encodeURIComponent(this.userdata['oldbrowser'])+'&url='+encodeURI(this.userdata['url'])+'&comment='+encodeURIComponent(this.userdata['comment'])+'&text='+encodeURIComponent(this.userdata['text']+'&language='+encodeURIComponent(this.userdata['language'])), '_blank');
//Если не поддерживаются кроссдоменные запросы window.parent.focus();
if (request.withCredentials == undefined) {
var old_url = window.location.href;
newWin = window.open(url+'&e_typos_oldbrowser=1', '_blank');
window.parent.focus();
this.error("green", "Спасибо за ваше внимание."); this.printMessage("success", "Спасибо за ваше внимание");
window.setTimeout('ETY.close()', 2000); //Ошибка закрытия окна!
var this_object = this;
window.setTimeout('this.closeWindow()', 2000);
return true;
},
/*Отправка запроса*/
ajaxQuery: function() {
var this_object = this;
try {
var form_data = this.formData();
} catch (error) {
this.printMessage("error", error.message);
return false; return false;
} }
var result = this.timer(); if (!this.checkTime()) {
if (result == 0) { this.printMessage("error", "Не отправляйте данные часто!");
this.error("red", "Не отправляйте данные часто");
return false; return false;
} else { } else {
this.time = this.now_time(); this.last_query_time = this.getTime();
this.set_storage("etersoft_typos/"+window.location.hostname+"", this.time); this.setStorage("etersoft_typos/"+window.location.hostname+"", this.getTime());
} }
request.open("POST", url, true); this.printMessage("attention", "Идет отправка данных...");
request.onload = function() {
var data = request.responseText; this.request.open("POST", this.server_url, true);
switch (data) {
case '10robot': this.request.onload = function() {
ETY.error("red", "Есть подозрения что вы робот");
break; try {
case '10dataerror': var response = window.JSON.parse(this_object.request.responseText);
ETY.error("red", "Данные некорректны");
break;
case '10siteerror': if (response['success'] && response['message']) {
ETY.error("red", "Данный сайт не поддерживается"); if (response['success'] == 'true') {
break; var success = 'success';
case '10emailerror': } else {
ETY.error("red", "Сервер не смог отправить письмо"); var success = 'error';
break; }
case '10win': this_object.printMessage(success, response['message']);
ETY.error("green", "Спасибо за ваше внимание."); } else {
window.setTimeout('ETY.close()', 2000); this_object.printMessage('attention', "Ошибка при получении ответа");
break; }
case '10inserterror': } catch (e) {
ETY.error("red", "Ошибка добавления данных"); this_object.printMessage('error', "Ошибка при обработке ответа");
break;
case '10servererror':
ETY.error("red", "На сервере произошла ошибка");
break;
default:
ETY.error("red", "На сервере произошла ошибка");
break;
} }
} };
request.onerror = function() { this.request.onerror = function() {
ETY.error("red", "Ошибка отправки данных. Повторите позже"); this_object.printMessage("error", "Ошибка отправки данных. Повторите позже");
this.time = 0; };
} this.request.send(form_data);
request.send();
}, },
error: function(color, text) { /*Печатаем сообщение пользователю в окно*/
document.getElementById("e_typos_error").style.display = "block"; printMessage: function(status, text) {
document.getElementById("e_typos_error").innerHTML = text; document.querySelector(".e_typos_div .e_typos_message").innerHTML = "<span class='"+status+"'>"+text+"</span>";
document.getElementById("e_typos_error").style.color = color;
document.getElementById("e_typos_error").style.borderColor = color;
}, },
text: function(text) { //Вывод текста, выделенного пользователем
document.getElementById("e_typos_user_text").style.display = "block"; printUserText: function(text) {
document.getElementById("e_typos_user_text").innerHTML = "Ваш текст: "+text; document.querySelector(".e_typos_div .e_typos_user_text").style.display = "block";
document.querySelector(".e_typos_div .e_typos_user_text").innerHTML = "Ваш текст: "+text;
}, },
timer: function() { /*Проверяем время, прошедшее с последнего отправления данных*/
var sec = this.now_time(); checkTime: function() {return true;
var time_s = this.get_storage("etersoft_typos/"+window.location.hostname+""); 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 (time_s != 0) { if (isNaN(prev_time)) {
this.time = time_s; return true;
} }
if (this.now_time() - parseFloat(this.time) < 60000) { if ( (this.getTime() - prev_time) < 60000) {
return 0; return false;
} else {
return 1;
} }
return true;
}, },
now_time: function() { /*Получаем текущее время*/
var day = new Date(); getTime: function() {
var sec = day.getTime(); return new Date().getTime();
return sec;
}, },
get_storage: function(key) { /*Получаем из sessionStorage данные*/
if (window['sessionStorage'] != null) { getStorage: function(key) {
if (!sessionStorage.getItem(key+"")) { if (window['sessionStorage']) {
return 0; return (sessionStorage.getItem(key)) ? sessionStorage.getItem(key) : false;
} else {
var data = sessionStorage.getItem(key+"");
return data;
}
} else { } else {
return 0; return false;
} }
}, },
set_storage: function(key, data) { /*Устанавливаем в sessionStorage данные*/
if (window['sessionStorage'] != null) { setStorage: function(key, data) {
if (window['sessionStorage']) {
sessionStorage.setItem(key+"", data); sessionStorage.setItem(key+"", data);
} return true;
}
return false;
} }
} };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment