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: '',
//данные для отправки (сайт страницы, текст с ошибкой, комментарий, язык, броузер)
userdata: {
'url': '',
'text': '',
'comment': '',
'language': 'ru',
'oldbrowser': 0,
},
init: function(options) {
this.options = (options) ? options : {};
//Выделенный текст if (this.options['server_url']) {
get_select_text: function() { this.server_url = this.options['server_url'];
var text = String(window.getSelection()).trim().substr(0, 50);
if (typeof(text) == 'undefined') {
text = "";
} }
return text;
this.request = new (window.XDomainRequest || window.XMLHttpRequest);
this.userdata['oldbrowser'] = 0;//(this.request.withCredentials == undefined) ? 1 : 0;
}, },
control_panel: function() { /*Получаем выделенный текст*/
if (document.getElementById("e_typos_div").style.display == "block") { getSelectText: function() {
this.close(); return (window.getSelection()) ? String(window.getSelection()) : '';
} else { },
this.div();
ETY.select_text = ETY.get_select_text(); /*Скрытие/показ окна*/
} controlPanel: function() {
(document.querySelector(".e_typos_div").style.display == "block") ? this.closeWindow() : this.openWindow();
}, },
div: function() { /*Открытие окна*/
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"; main_div.querySelector(".e_typos_comment").value = "";
document.getElementById("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;
} }
var new_text = ETY.get_select_text(); if (typeof(this.userdata) != 'object') {
throw new Error("userdata is not object!");
return false;
}
if (new_text != ETY.select_text && new_text.length != 0) { if (this.userdata['url'] == '') {
post_text = new_text; this.error = "Не определен URL сайта";
return false;
} }
//Выделенный текст if (!this.userdata['language']) {
var user_comment = document.getElementById("e_typos_comment").value.trim().substr(0, 50); this.userdata['language'] = 'ru';
if (user_comment == '') { return false;
user_comment = "";
} }
if (post_text.length == 0) { if (!this.userdata['text']) {
this.error("red", "Вы ничего не выделили"); this.error = "Текст не выделен";
} else if (post_text.length < 5) { return false;
this.error("red", "Выделенный текст слишком короток"); }
} else if (post_text.length > 30) {
this.error("red", "Выделенный текст слишком длинный"); if (this.userdata['text'].length < 5 || this.userdata['text'].length > 30) {
} else { this.error = "Выделенный текст должен быть длиной от 5 до 30 символов (сейчас: "+this.userdata['text'].length+")";
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['comment'].length > 50) {
this.error = "Комментарий должен быть длиной до 30 символов (сейчас: "+this.userdata['comment'].length+")";
return false;
} }
return true;
}, },
//Отправка запроса /*Сбор данных*/
ajax_query: function(url) { postData: function() {
this.error("black", "Идет отправка данных..."); 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 : '';
var XHR = window.XDomainRequest || window.XMLHttpRequest; try {
request = new XHR; if (!this.validateData()) {
this.printMessage('error', this.error);
return false;
}
} catch(error) {alert(error);
this.printMessage('error', error.message);
return false;
}
//Если не поддерживаются кроссдоменные запросы //Если не поддерживаются кроссдоменные запросы
if (request.withCredentials == undefined) { if (this.userdata['oldbrowser']) {
var old_url = window.location.href; this.ajaxQueryOldBrowser();
} else {
this.ajaxQuery();
}
newWin = window.open(url+'&e_typos_oldbrowser=1', '_blank'); },
/*Создание формы с данными*/
formData: function() {
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;
},
/*Отправка данных на старых броузерах*/
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(); 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", "Спасибо за ваше внимание.");
window.setTimeout('ETY.close()', 2000);
break;
case '10inserterror':
ETY.error("red", "Ошибка добавления данных");
break;
case '10servererror':
ETY.error("red", "На сервере произошла ошибка");
break;
default:
ETY.error("red", "На сервере произошла ошибка");
break;
}
}
request.onerror = function() {
ETY.error("red", "Ошибка отправки данных. Повторите позже");
this.time = 0;
}
request.send();
},
error: function(color, text) {
document.getElementById("e_typos_error").style.display = "block";
document.getElementById("e_typos_error").innerHTML = text;
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";
document.getElementById("e_typos_user_text").innerHTML = "Ваш текст: "+text;
},
timer: function() {
var sec = this.now_time();
var time_s = this.get_storage("etersoft_typos/"+window.location.hostname+"");
if (time_s != 0) {
this.time = time_s;
}
if (this.now_time() - parseFloat(this.time) < 60000) {
return 0;
} else { } else {
return 1; this_object.printMessage('attention', "Ошибка при получении ответа");
}
} catch (e) {
this_object.printMessage('error', "Ошибка при обработке ответа");
} }
};
this.request.onerror = function() {
this_object.printMessage("error", "Ошибка отправки данных. Повторите позже");
};
this.request.send(form_data);
}, },
now_time: function() { /*Печатаем сообщение пользователю в окно*/
var day = new Date(); printMessage: function(status, text) {
var sec = day.getTime(); document.querySelector(".e_typos_div .e_typos_message").innerHTML = "<span class='"+status+"'>"+text+"</span>";
return sec;
}, },
get_storage: function(key) { //Вывод текста, выделенного пользователем
if (window['sessionStorage'] != null) { printUserText: function(text) {
if (!sessionStorage.getItem(key+"")) { document.querySelector(".e_typos_div .e_typos_user_text").style.display = "block";
return 0; document.querySelector(".e_typos_div .e_typos_user_text").innerHTML = "Ваш текст: "+text;
} else { },
var data = sessionStorage.getItem(key+"");
return data; /*Проверяем время, прошедшее с последнего отправления данных*/
checkTime: function() {return true;
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) < 60000) {
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 { } 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