/** * JsHttpRequest: JavaScript "AJAX" data loader * Minimized version: see debug directory for the complete one. * * @license LGPL * @author Dmitry Koterov, http://en.dklab.ru/lib/JsHttpRequest/ * @version 5.x $Id$ */ function JsHttpRequest(){ var t=this; t.onreadystatechange=null; t.readyState=0; t.responseText=null; t.responseXML=null; t.status=200; t.statusText="OK"; t.responseJS=null; t.caching=false; t.loader=null; t.session_name="PHPSESSID"; t._ldObj=null; t._reqHeaders=[]; t._openArgs=null; t._errors={inv_form_el:"Invalid FORM element detected: name=%, tag=%",must_be_single_el:"If used,
must be a single HTML element in the list.",js_invalid:"JavaScript code generated by backend is invalid!\n%",url_too_long:"Cannot use so long query with GET request (URL is larger than % bytes)",unk_loader:"Unknown loader: %",no_loaders:"No loaders registered at all, please check JsHttpRequest.LOADERS array",no_loader_matched:"Cannot find a loader which may process the request. Notices are:\n%"}; t.abort=function(){ with(this){ if(_ldObj&&_ldObj.abort){ _ldObj.abort(); } _cleanup(); if(readyState==0){ return; } if(readyState==1&&!_ldObj){ readyState=0; return; } _changeReadyState(4,true); } }; t.open=function(_2,_3,_4,_5,_6){ with(this){ if(_3.match(/^((\w+)\.)?(GET|POST)\s+(.*)/i)){ this.loader=RegExp.$2?RegExp.$2:null; _2=RegExp.$3; _3=RegExp.$4; } try{ if(document.location.search.match(new RegExp("[&?]"+session_name+"=([^&?]*)"))||document.cookie.match(new RegExp("(?:;|^)\\s*"+session_name+"=([^;]*)"))){ _3+=(_3.indexOf("?")>=0?"&":"?")+session_name+"="+this.escape(RegExp.$1); } } catch(e){ } _openArgs={method:(_2||"").toUpperCase(),url:_3,asyncFlag:_4,username:_5!=null?_5:"",password:_6!=null?_6:""}; _ldObj=null; _changeReadyState(1,true); return true; } }; t.send=function(_7){ if(!this.readyState){ return; } this._changeReadyState(1,true); this._ldObj=null; var _8=[]; var _9=[]; if(!this._hash2query(_7,null,_8,_9)){ return; } var _a=null; if(this.caching&&!_9.length){ _a=this._openArgs.username+":"+this._openArgs.password+"@"+this._openArgs.url+"|"+_8+"#"+this._openArgs.method; var _b=JsHttpRequest.CACHE[_a]; if(_b){ this._dataReady(_b[0],_b[1]); return false; } } var _c=(this.loader||"").toLowerCase(); if(_c&&!JsHttpRequest.LOADERS[_c]){ return this._error("unk_loader",_c); } var _d=[]; var _e=JsHttpRequest.LOADERS; for(var _f in _e){ var ldr=_e[_f].loader; if(!ldr){ continue; } if(_c&&_f!=_c){ continue; } var _11=new ldr(this); JsHttpRequest.extend(_11,this._openArgs); JsHttpRequest.extend(_11,{queryText:_8.join("&"),queryElem:_9,id:(new Date().getTime())+""+JsHttpRequest.COUNT++,hash:_a,span:null}); var _12=_11.load(); if(!_12){ this._ldObj=_11; JsHttpRequest.PENDING[_11.id]=this; return true; } if(!_c){ _d[_d.length]="- "+_f.toUpperCase()+": "+this._l(_12); }else{ return this._error(_12); } } return _f?this._error("no_loader_matched",_d.join("\n")):this._error("no_loaders"); }; t.getAllResponseHeaders=function(){ with(this){ return _ldObj&&_ldObj.getAllResponseHeaders?_ldObj.getAllResponseHeaders():[]; } }; t.getResponseHeader=function(_13){ with(this){ return _ldObj&&_ldObj.getResponseHeader?_ldObj.getResponseHeader(_13):null; } }; t.setRequestHeader=function(_14,_15){ with(this){ _reqHeaders[_reqHeaders.length]=[_14,_15]; } }; t._dataReady=function(_16,js){ with(this){ if(caching&&_ldObj){ JsHttpRequest.CACHE[_ldObj.hash]=[_16,js]; } responseText=responseXML=_16; responseJS=js; if(js!==null){ status=200; statusText="OK"; }else{ status=500; statusText="Internal Server Error"; } _changeReadyState(2); _changeReadyState(3); _changeReadyState(4); _cleanup(); } }; t._l=function(_18){ var i=0,p=0,msg=this._errors[_18[0]]; while((p=msg.indexOf("%",p))>=0){ var a=_18[++i]+""; msg=msg.substring(0,p)+a+msg.substring(p+1,msg.length); p+=1+a.length; } return msg; }; t._error=function(msg){ msg=this._l(typeof (msg)=="string"?arguments:msg); msg="JsHttpRequest: "+msg; if(!window.Error){ throw msg; }else{ if((new Error(1,"test")).description=="test"){ throw new Error(1,msg); }else{ throw new Error(msg); } } }; t._hash2query=function(_1e,_1f,_20,_21){ if(_1f==null){ _1f=""; } if((""+typeof (_1e)).toLowerCase()=="object"){ var _22=false; if(_1e&&_1e.parentNode&&_1e.parentNode.appendChild&&_1e.tagName&&_1e.tagName.toUpperCase()=="FORM"){ _1e={form:_1e}; } for(var k in _1e){ var v=_1e[k]; if(v instanceof Function){ continue; } var _25=_1f?_1f+"["+this.escape(k)+"]":this.escape(k); var _26=v&&v.parentNode&&v.parentNode.appendChild&&v.tagName; if(_26){ var tn=v.tagName.toUpperCase(); if(tn=="FORM"){ _22=true; }else{ if(tn=="INPUT"||tn=="TEXTAREA"||tn=="SELECT"){ }else{ return this._error("inv_form_el",(v.name||""),v.tagName); } } _21[_21.length]={name:_25,e:v}; }else{ if(v instanceof Object){ this._hash2query(v,_25,_20,_21); }else{ if(v===null){ continue; } if(v===true){ v=1; } if(v===false){ v=""; } _20[_20.length]=_25+"="+this.escape(""+v); } } if(_22&&_21.length>1){ return this._error("must_be_single_el"); } } }else{ _20[_20.length]=_1e; } return true; }; t._cleanup=function(){ var _28=this._ldObj; if(!_28){ return; } JsHttpRequest.PENDING[_28.id]=false; var _29=_28.span; if(!_29){ return; } _28.span=null; var _2a=function(){ _29.parentNode.removeChild(_29); }; JsHttpRequest.setTimeout(_2a,50); }; t._changeReadyState=function(s,_2c){ with(this){ if(_2c){ status=statusText=responseJS=null; responseText=""; } readyState=s; if(onreadystatechange){ onreadystatechange(); } } }; t.escape=function(s){ return escape(s).replace(new RegExp("\\+","g"),"%2B"); }; } JsHttpRequest.COUNT=0; JsHttpRequest.MAX_URL_LEN=2000; JsHttpRequest.CACHE={}; JsHttpRequest.PENDING={}; JsHttpRequest.LOADERS={}; JsHttpRequest._dummy=function(){ }; JsHttpRequest.TIMEOUTS={s:window.setTimeout,c:window.clearTimeout}; JsHttpRequest.setTimeout=function(_2e,dt){ window.JsHttpRequest_tmp=JsHttpRequest.TIMEOUTS.s; if(typeof (_2e)=="string"){ id=window.JsHttpRequest_tmp(_2e,dt); }else{ var id=null; var _31=function(){ _2e(); delete JsHttpRequest.TIMEOUTS[id]; }; id=window.JsHttpRequest_tmp(_31,dt); JsHttpRequest.TIMEOUTS[id]=_31; } window.JsHttpRequest_tmp=null; return id; }; JsHttpRequest.clearTimeout=function(id){ window.JsHttpRequest_tmp=JsHttpRequest.TIMEOUTS.c; delete JsHttpRequest.TIMEOUTS[id]; var r=window.JsHttpRequest_tmp(id); window.JsHttpRequest_tmp=null; return r; }; JsHttpRequest.query=function(url,_35,_36,_37){ var req=new this(); req.caching=!_37; req.onreadystatechange=function(){ if(req.readyState==4){ _36(req.responseJS,req.responseText); } }; req.open(null,url,true); req.send(_35); }; JsHttpRequest.dataReady=function(d){ var th=this.PENDING[d.id]; delete this.PENDING[d.id]; if(th){ th._dataReady(d.text,d.js); }else{ if(th!==false){ throw "dataReady(): unknown pending id: "+d.id; } } }; JsHttpRequest.extend=function(_3b,src){ for(var k in src){ _3b[k]=src[k]; } }; JsHttpRequest.LOADERS.xml={loader:function(req){ JsHttpRequest.extend(req._errors,{xml_no:"Cannot use XMLHttpRequest or ActiveX loader: not supported",xml_no_diffdom:"Cannot use XMLHttpRequest to load data from different domain %",xml_no_headers:"Cannot use XMLHttpRequest loader or ActiveX loader, POST method: headers setting is not supported, needed to work with encodings correctly",xml_no_form_upl:"Cannot use XMLHttpRequest loader: direct form elements using and uploading are not implemented"}); this.load=function(){ if(this.queryElem.length){ return ["xml_no_form_upl"]; } if(this.url.match(new RegExp("^([a-z]+://[^\\/]+)(.*)","i"))){ if(RegExp.$1.toLowerCase()!=document.location.protocol+"//"+document.location.hostname.toLowerCase()){ return ["xml_no_diffdom",RegExp.$1]; } } var xr=null; if(window.XMLHttpRequest){ try{ xr=new XMLHttpRequest(); } catch(e){ } }else{ if(window.ActiveXObject){ try{ xr=new ActiveXObject("Microsoft.XMLHTTP"); } catch(e){ } if(!xr){ try{ xr=new ActiveXObject("Msxml2.XMLHTTP"); } catch(e){ } } } } if(!xr){ return ["xml_no"]; } var _40=window.ActiveXObject||xr.setRequestHeader; if(!this.method){ this.method=_40&&this.queryText.length?"POST":"GET"; } if(this.method=="GET"){ if(this.queryText){ this.url+=(this.url.indexOf("?")>=0?"&":"?")+this.queryText; } this.queryText=""; if(this.url.length>JsHttpRequest.MAX_URL_LEN){ return ["url_too_long",JsHttpRequest.MAX_URL_LEN]; } }else{ if(this.method=="POST"&&!_40){ return ["xml_no_headers"]; } } this.url+=(this.url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+(req.caching?"0":this.id)+"-xml"; var id=this.id; xr.onreadystatechange=function(){ if(xr.readyState!=4){ return; } xr.onreadystatechange=JsHttpRequest._dummy; req.status=null; try{ req.status=xr.status; req.responseText=xr.responseText; } catch(e){ } if(!req.status){ return; } try{ var _42=req.responseText||"{ js: null, text: null }"; eval("JsHttpRequest._tmp = function(id) { var d = "+_42+"; d.id = id; JsHttpRequest.dataReady(d); }"); } catch(e){ return req._error("js_invalid",req.responseText); } JsHttpRequest._tmp(id); JsHttpRequest._tmp=null; }; xr.open(this.method,this.url,true,this.username,this.password); if(_40){ for(var i=0;i=0?"&":"?")+this.queryText; } this.url+=(this.url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+this.id+"-"+"script"; this.queryText=""; if(!this.method){ this.method="GET"; } if(this.method!=="GET"){ return ["script_only_get"]; } if(this.queryElem.length){ return ["script_no_form"]; } if(this.url.length>JsHttpRequest.MAX_URL_LEN){ return ["url_too_long",JsHttpRequest.MAX_URL_LEN]; } var th=this,d=document,s=null,b=d.body; if(!window.opera){ this.span=s=d.createElement("SCRIPT"); var _4a=function(){ s.language="JavaScript"; if(s.setAttribute){ s.setAttribute("src",th.url); }else{ s.src=th.url; } b.insertBefore(s,b.lastChild); }; }else{ this.span=s=d.createElement("SPAN"); s.style.display="none"; b.insertBefore(s,b.lastChild); s.innerHTML="Workaround for IE."; var _4a=function(){ s=s.getElementsByTagName("SCRIPT")[0]; s.language="JavaScript"; if(s.setAttribute){ s.setAttribute("src",th.url); }else{ s.src=th.url; } }; } JsHttpRequest.setTimeout(_4a,10); return null; }; }}; JsHttpRequest.LOADERS.form={loader:function(req){ JsHttpRequest.extend(req._errors,{form_el_not_belong:"Element \"%\" does not belong to any form!",form_el_belong_diff:"Element \"%\" belongs to a different form. All elements must belong to the same form!",form_el_inv_enctype:"Attribute \"enctype\" of the form must be \"%\" (for IE), \"%\" given."}); this.load=function(){ var th=this; if(!th.method){ th.method="POST"; } th.url+=(th.url.indexOf("?")>=0?"&":"?")+"JsHttpRequest="+th.id+"-"+"form"; if(th.method=="GET"){ if(th.queryText){ th.url+=(th.url.indexOf("?")>=0?"&":"?")+th.queryText; } if(th.url.length>JsHttpRequest.MAX_URL_LEN){ return ["url_too_long",JsHttpRequest.MAX_URL_LEN]; } var p=th.url.split("?",2); th.url=p[0]; th.queryText=p[1]||""; } var _4e=null; var _4f=false; if(th.queryElem.length){ if(th.queryElem[0].e.tagName.toUpperCase()=="FORM"){ _4e=th.queryElem[0].e; _4f=true; th.queryElem=[]; }else{ _4e=th.queryElem[0].e.form; for(var i=0;i")+""; if(!_4e){ _4e=th.span.firstChild; } d.body.insertBefore(s,d.body.lastChild); var _57=function(e,_59){ var sv=[]; var _5b=e; if(e.mergeAttributes){ var _5b=d.createElement("form"); _5b.mergeAttributes(e,false); } for(var i=0;i<_59.length;i++){ var k=_59[i][0],v=_59[i][1]; sv[sv.length]=[k,_5b.getAttribute(k)]; _5b.setAttribute(k,v); } if(e.mergeAttributes){ e.mergeAttributes(_5b,false); } return sv; }; var _5f=function(){ top.JsHttpRequestGlobal=JsHttpRequest; var _60=[]; if(!_4f){ for(var i=0,n=_4e.elements.length;i=0;i--){ var _64=qt[i].split("=",2); var e=d.createElement("INPUT"); e.type="hidden"; e.name=unescape(_64[0]); e.value=_64[1]!=null?unescape(_64[1]):""; _4e.appendChild(e); } for(var i=0;i back to // See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1 qs = qs.replace(/\+/g, ' '); var args = qs.split('&') // parse out name/value pairs separated via & // split out each name=value pair for (var i = 0; i < args.length; i++) { var value; var pair = args[i].split('='); var name = unescape(pair[0]); if (pair.length == 2) value = unescape(pair[1]); else value = name; this.params[name] = value; } } function GetQuerystring(key, default_) { // This silly looking line changes UNDEFINED to NULL if (default_ == null) default_ = null; var value = this.params[key] if (value == null) value = default_; return value } function GetTranslation(key) { switch (key) { case "delete-page-confirm": return "Вы действительно хотите удалить страницу %PageTitle%?"; case "delete-menuimage-confirm": return "Вы действительно хотите удалить иконку?"; case "has-subpages": return "У этой страницы есть подстраницы!"; case "error-removing-page": return "Ошибка при попытке удаления страницы"; case "error-moving-page": return "Ошибка при попытке перемещения страницы"; case "no-title": return "Без названия"; case "no-description": return "Нет описания"; case "click-to-edit-meta": return "Нажмите для редактирования META информации страницы"; case "meta-info": return "Meta информация"; case "meta-title": return "Meta Title"; case "meta-keywords": return "Meta Keywords"; case "meta-description": return "Meta Description"; case "close": return "Закрыть"; case "saving": return "сохранение..."; case "removing": return "удаление..."; case "save": return "Сохранить"; case "cancel": return "Отменить"; case "error-removing-menuimage": return "Ошибка при попытке удаления иконки"; case "loading": return "загрузка..."; case "msg-no-url": return "Введите URL ссылки"; case "msg-no-page-selected": return "Выберите страницу из списка"; case "msg-no-email": return "Введите адрес эл.почты"; case "icon-up": return "Переместить вверх"; case "icon-down": return "Переместить вниз"; case "icon-edit": return "Редактировать"; case "icon-delete": return "Удалить"; case "title-prefix": return "Администратор"; case "title-site-structure": return "Структура сайта"; case "title-file-manager": return "Менеджер файлов"; case "title-page-edit": return "Редактирование содержимого страницы"; case "title-module-edit": return "Редактирование страницы модуля"; case "title-menu-edit": return "Редактирование меню"; case "title-link-edit": return "Редактирование информации о ссылке"; case "title-user-list": return "Пользователи"; case "title-user-add": return "Добавление пользователя"; case "title-user-edit": return "Редактирование пользователя"; case "title-empty": return "Введите заголовок"; case "template-is-not-defined": return "Выберите шаблон страницы из списка"; case "static-path-empty": return "Введите URL страницы"; case "static-path-is-not-unique": return "Введенный URL не уникален. Выбрите другой URL"; case "static-path-incorrect": return "Введенный URL неверен! Пожалуйста используйте только латинские буквы, цифры, тире (-), точки (.) и знак подчеркивания (_)"; case "parent-is-not-defined": return "Укажите родительскую страницу/меню"; case "parent-language-different": return "Язык родительской страницы не соответсвует языку текущей страницы. Сохранение данных не возможно."; case "unsupported-image-function": return "Для завершения процесса изменения размеров картинки, требуется функция %Function%. Но данная функция не поддерживается вашим хостинг провайдером"; case "page-removed": return "Страницы, которую вы выбрали, не существует. Нажмите F5 чтобы обновить список страниц"; case "password-is-changed-and-sent": return "Ваш пароль был успешно изменен и отправлен на ваш эл. адрес"; case "logged-out": return "Вы вышли из системы"; case "wrong-login-password": return "Неправильное сочетание логина и пароля"; case "create": return "Создать"; case "edit": return "Редактировать"; case "new-password": return "Новый пароль"; case "open-calendar": return "Нажмите сюда, чтобы открыть календарь"; case "your-session-expired": return "Время сессии истекло"; case "this-page-in-other-language": return "Эта страница на другом языке"; case "this-link-in-other-language": return "Эта ссылка на другом языке"; case "this-module-in-other-language": return "Этот модуль на другом языке"; case "this-menu-in-other-language": return "Это меню на другом языке"; case "unknown-module": return "Модуль "%Module%" не найден"; case "page-type-is-undefined": return "Неверно определен тип страницы"; case "email-is-not-unique": return "Введенный вами адрес эл. почты уже занят одним из пользователей. Введите другой адрес"; case "incorrect-email-format": return "Введите адрес эл. почты в формате name@yoursite.ru"; case "incorrect-email-address": return "Введенный вами адрес эл. почты не зарегистрирован"; case "wrong-old-password": return "Старый пароль введен неверно"; case "password-empty": return "Новый пароль не может быть пустым"; case "password-not-equal": return "Пароли не совпадают"; case "first-name-required": return "Поле "Имя" является обязательным"; case "last-name-required": return "Поле "Фамилия" является обязательным"; case "role-undefined": return "Вы не выбрали роль пользователя"; case "website-undefined": return "Вы не выбрали вебсайт к которому будет относиться пользователь"; case "user-edit-access-denied": return "Доступ к редактированию чужих данных запрещен"; case "user-is-updated": return "Информация о пользователе обновлена"; case "public-user-is-registered": return "Вы успешно зарегистрированы"; case "public-user-is-updated": return "Ваша информация была обновлена"; case "user-is-removed": return "Пользователь %UserList% был удален"; case "users-are-removed": return "Пользователи %UserList% были удалены. Всего удалено %UserCount% пользовател(-ей,-я)"; case "home-page": return "Главная"; case "sql-error": return "Ошибка в SQL запросе. Детальная информация об ошибке в log файле"; case "file-doesnt-exist": return "Исходный файл не существует"; case "copy-error": return "Ошибка копирования файла из %From% в %To%"; case "unsupported-image-mime-type": return "Картинки с типом "%MimeType%" не поддерживаются"; case "unsupported-file-mime-type": return "Файлы с типом "%MimeType%" не поддерживаются"; case "incorrect-file-name": return "Имя файла %FileName% неверное. Пожалуйста переименуйте и попробуйте загрузить снова"; case "file-upload-error": return "Произошла ошибка при загрузке файла на сервер. Номер ошибки %ErrorNumber%"; case "file-exists": return "Файл с именем %FileName% уже существует в папке %FolderName%"; case "getimagesize-error": return "Невозможно получить размеры картинки для файла %File%"; case "file-is-not-uploaded": return "Файл не загружен"; case "upload-max-file-size": return "Максимальный размер: %UploadMaxFileSize%"; case "no-templates": return "Вы должны создать файл с именем page.html в папке %Folder%"; case "template-general": return "Основной"; case "MenuImage1": return "Иконка 1"; case "MenuImage2": return "Иконка 2"; case "MenuImage3": return "Иконка 3"; case "phpmailer-provide-address": return "Вы должны указать как минимум один E-mail адрес получателя"; case "phpmailer-mailer-not-supported": return "%Mailer% не поддерживается"; case "phpmailer-execute": return "Невозможно выполнить: %Sendmail%"; case "phpmailer-instantiate": return "Функция mail() не определена"; case "phpmailer-authenticate": return "SMTP Ошибка: Ошибка авторизации"; case "phpmailer-from-failed": return "Невозможно использовать следующие From адреса: %Address%"; case "phpmailer-recipients-failed": return "SMTP Ошибка: Невозможно отправить E-mail следующим получателям: %Address%"; case "phpmailer-data-not-accepted": return "SMTP Ошибка: Данные не приняты сервером"; case "phpmailer-connect-host": return "SMTP Ошибка: Невозможно соединиться с SMTP хостом %Host%"; case "phpmailer-file-access": return "Ошибка доступа к файлу: %File%"; case "phpmailer-file-open": return "Невозможно открыть файл: %File%"; case "phpmailer-encoding": return "Неизвестная кодировка: %Encoding%"; case "error-sending-email": return "Ваше сообщение не было отправлено из-за внутренней ошибки сервера"; case "incorrect-captcha": return "Вы ввели неверный код подтверждения"; case "date-Sun": return "вс"; case "date-Mon": return "пн"; case "date-Tue": return "вт"; case "date-Wed": return "ср"; case "date-Thu": return "чт"; case "date-Fri": return "пт"; case "date-Sat": return "сб"; case "date-Sunday": return "воскресенье"; case "date-Monday": return "понедельник"; case "date-Tuesday": return "вторник"; case "date-Wednesday": return "среда"; case "date-Thursday": return "четверг"; case "date-Friday": return "пятница"; case "date-Saturday": return "суббота"; case "date-Jan": return "янв"; case "date-Feb": return "фев"; case "date-Mar": return "мар"; case "date-Apr": return "апр"; case "date-May": return "мая"; case "date-Jun": return "июн"; case "date-Jul": return "июл"; case "date-Aug": return "авг"; case "date-Sep": return "сен"; case "date-Oct": return "окт"; case "date-Nov": return "ноя"; case "date-Dec": return "дек"; case "date-January": return "января"; case "date-February": return "февраля"; case "date-March": return "марта"; case "date-April": return "апреля"; case "date-June": return "июня"; case "date-July": return "июля"; case "date-August": return "августа"; case "date-September": return "сентября"; case "date-October": return "октября"; case "date-November": return "ноября"; case "date-December": return "декабря"; case "role-integrator": return "Разработчик"; case "role-administrator": return "Администратор"; case "role-moderator": return "Модератор"; case "role-user": return "Пользователь"; case "page-description1": return "Описание"; case "page-description1-description": return "Общее описание страницы для атрибута title тэга A"; case "menu-image1": return "Иконка"; default: return key; } }