PageSourceSearch

https://www.czecot.de/scripts/jak/request.js?1

js czecot.de collected 2026-10-02 23:24:39 UTC 14,600 bytes, 444 lines download raw bytes

1/*
2Licencováno pod MIT Licencí
3
4© 2008 Seznam.cz, a.s.
5
6Tímto se uděluje bezúplatná nevýhradní licence k oprávnění užívat Software,
7časově i místně neomezená, v souladu s příslušnými ustanoveními autorského zákona.
8
9Nabyvatel/uživatel, který obdržel kopii tohoto softwaru a další přidružené 
10soubory (dále jen „software“) je oprávněn k nakládání se softwarem bez 
11jakýchkoli omezení, včetně bez omezení práva software užívat, pořizovat si 
12z něj kopie, měnit, sloučit, šířit, poskytovat zcela nebo zčásti třetí osobě 
13(podlicence) či prodávat jeho kopie, za následujících podmínek:
14
15- výše uvedené licenční ujednání musí být uvedeno na všech kopiích nebo 
16podstatných součástech Softwaru.
17
18- software je poskytován tak jak stojí a leží, tzn. autor neodpovídá 
19za jeho vady, jakož i možné následky, ledaže věc nemá vlastnost, o níž autor 
20prohlásí, že ji má, nebo kterou si nabyvatel/uživatel výslovně vymínil.
21
22
23
24Licenced under the MIT License
25
26Copyright (c) 2008 Seznam.cz, a.s.
27
28Permission is hereby granted, free of charge, to any person obtaining a copy
29of this software and associated documentation files (the "Software"), to deal
30in the Software without restriction, including without limitation the rights
31to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
32copies of the Software, and to permit persons to whom the Software is
33furnished to do so, subject to the following conditions:
34
35The above copyright notice and this permission notice shall be included in
36all copies or substantial portions of the Software.
37
38THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
39IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
40FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
41AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
42LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
43OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
44THE SOFTWARE.
45*/
46
47/**
48 * @overview Třída pro práci s HTTPXmlRequestem pro komunikaci klient - server.
49 * @version 1.0
50 * @author koko, jelc 
51 */   
52
53/**
54 * @class třída provádějící komunikaci klient - server prostřednictvím  HTTPxmlRequest
55 * defaultně posíláme dotaz metodou GET, asynchroně a odpověď očekáváme v TXT formátu
56 * @name SZN.HTTPRequest
57 */
58SZN.HTTPRequest = SZN.ClassMaker.makeClass({
59	NAME: "HTTPRequest",
60	VERSION: "1.0",
61	CLASS: "class"
62});
63
64/**
65 * @method
66 * @constructor 
67 * @param {string} url url, na které budeme posílat dotazy
68 * @param {object} callBackObj objekt, v jehož oboru platnosti zpracováváme odpověď
69 * @param {string} callBackFunc metoda, která bude odpověď zpracovávat 
70 */ 
71SZN.HTTPRequest.prototype.$constructor = function(url,callBackObj,callBackFunc){
72	/** @field {object} aktuální nastavení pro request*/
73	this.data = new Object();
74	/** @field {string} url na které se ptáme */
75	this.url = url ? url : '';
76	/** @field {object} objekt v jehož oboru platnosti zpracujeme odpověď */
77	this.callBackObj = callBackObj;
78	/** @field {function} metoda, která odpověď zpracuje */
79	this.callBackFunc = callBackFunc;
80
81	this.setFormat();
82	this.setMode();
83	this.setMethod();
84	this.setPostData();
85	this.setHeaders();
86};
87
88/** 
89@static 
90@constructor
91@class konstruktor vytváří "objekt" nastavení (settings) pro instanci SZN.Request
92@param {string} [url] url serveru, kterého se ptáme
93@param {string} [method] metoda dotazu [post,get = default]
94@param {string} [postData] data pro dotaz posílaný metodou post
95@param {array} [headers] nastavení hlaviček, pole objektů s vlatnostmi <em>type</em> a <em>content</em>
96@param {string} [mode]  mod dotazu [sync,async = default]
97@param {string} [format] formát odpovědi [xml = default]
98*/
99SZN.HTTPRequest.Setting = function(url,method,postData,headers,mode,format){
100	/** @field {string}  url serveru, kterého se ptáme */
101	this.url = url ? url : '';
102	/** @field {string} metoda dotazu [post,get = default]*/
103	this.method = method ? method : '';
104	/** @field {string} mod dotazu [sync,async = default]*/
105	this.mode = mode ? mode : '';
106	/** @field {string} formát odpovědi [xml = default]*/
107	this.format = format ? format : '';
108	/** @field {array} nastavení hlaviček, pole objektů s vlatnostmi <em>type</em> a <em>content</em> */
109	this.headers = headers ? headers : '';
110	/** @field {string} data pro dotaz posílaný metodou post*/
111	this.postData = postData ? postData : '';
112};
113
114
115/**
116 * @field {object} <strong>konstanta</strong> výčtové pole metod, které se mouhou používat a definice defaultní metody
117 */
118SZN.HTTPRequest.prototype.METHOD = {
119	post : 'post',
120	get : 'get',
121	def : 'get'
122};
123/**
124 * @field {object} <strong>konstanta</strong> výčtové pole formatů odpovědí, které se mouhou používat a definice defaultního formatu
125 * 
126 */
127SZN.HTTPRequest.prototype.FORMAT = {
128	xml : 'xml',
129	txt : 'txt',
130	def : 'txt'
131};
132/**
133 * @field {object} <strong>konstanta</strong> výčtové pole modu dotazu, které se mouhou používat a definice defaultního modu
134 */
135SZN.HTTPRequest.prototype.MODE = {
136	async : true,
137	sync :  false,
138	def : true
139};
140
141/**
142 * @field {array} <strong>konstanta</strong> výchozí nastaveni http hlavičky dotazu
143 */
144SZN.HTTPRequest.prototype.HEADER = [{typ:'Content-Type', content:'application/x-www-form-urlencoded' }];
145
146/**
147 * destruktor
148 * @method  
149 *
150 */  
151SZN.HTTPRequest.prototype.destructor = function(){
152	for(var i in this){
153		this[i] = null;
154	}
155};
156/**
157 * inicializace <strong>nepoužívá se</strong>
158 * @method 
159 * @deprecated
160 */  
161SZN.HTTPRequest.prototype.init = function(){};
162
163/**
164 * nastavuje metodu komunikace klient - server dle argumentu, pokud argument
165 * není definován v objektu METHOD použije se výchozí (get)
166 * @method  
167 * @param {string} method metoda komunikace klient server [get,post]
168 */  
169SZN.HTTPRequest.prototype.setMethod = function(method){
170	this.data.method = this._getMethod(method);
171};
172/**
173 * nastavuje möd komunikace klient - server dle argumentu, pokud argument
174 * není definován v objektu MODE použije se výchozí
175 * @method  
176 * @param {string} mode mod komunikace klient server [sync,async]
177 */  
178SZN.HTTPRequest.prototype.setMode = function(mode){
179	this.data.mode = this._getMode(mode);
180};
181/**
182 * nastavuje format odpovědi serveru dle argumentu, pokud argument
183 * není definován v objektu FORMAT použije se výchozí
184 * @method  
185 * @param {string} format format odpovědi serveru [xml,txt]
186 */  
187SZN.HTTPRequest.prototype.setFormat = function(format){
188	this.data.format = this._getFormat(format);
189};
190/**
191 * nastavuje HTTP hlavičky dotazu
192 * @method 
193 * @param {array} headers pole objektu s vlastnostmi:
194 * <ul>
195 * <li>typ - typ hlavičky</li>
196 * <li>content - hodnota hlavičky</li>
197 * </ul>    
198 */  
199SZN.HTTPRequest.prototype.setHeaders = function(headers){
200	this.data.headers = this._setHeaders(headers);
201};
202/**
203 * nastavuje data, která se mají posílat metodou POST
204 * @method 
205 * @param {string} data data, která se budou posílat POSTem
206 */  
207SZN.HTTPRequest.prototype.setPostData = function(data){
208	this.data.postData = data ? data : '';
209};
210
211/**
212 *  vlastní vyvolání HTTPxmlRequestu, předané parametry se použijí pro konkretní dotaz
213 * pokud některý není definován použije se výchozí, nebo nastavený
214 * @method  
215 * @param {string} url url, na které budeme posílat dotazy (musí být zadán, ale může být prazdný)
216 * @param {object} callBackObj objekt v jehož oboru platnosti zpracováváme odpověď (musí být zadán, ale může být prazdný)
217 * @param {string} callBackFunc metoda, ktera bude odpoved zpracovavat (musí být zadán, ale může být prazdný)
218 * @param {object} requestData [<em>volitelne</em>] instance objektu Setting s dalšími daty
219 * @param {boolean} [returnOnly] pokud používáme synchronní request určuje zda se volá callback funkce (parametr má
220 * hodnou "false" nebo není zadán - výchozí stav ), nebo bude pouze vracet odpověď od serveru (parametr má hodnotu "true")
221 * musí být zadán pokaždé, když použijeme metodu send a nechceme výchozí chování, na asynchroní volání nemá vliv 
222 * @returns {object} <ol><li>v případě asynchroního requestu objekt reprezentující request</li>
223 * <li>v případě synchroního requestu vrací odpověď serveru  jako objekt s vlastnostmi <em>status</em> a <em>data</em> je-li
224 *  returnOnly zadáno jako true, jinak nevrací nic</li></ol>
225 */      
226SZN.HTTPRequest.prototype.send = function(url,obj,method,requestData,returnOnly){
227	var mySelf = this;
228	var param = requestData ? requestData : {};
229	var data = this._setFromData(url,obj,method,param);
230	//debug(data.mode)
231	// vytvorim request
232	var XHR = this._getRequest();
233	// otevru request
234    try {
235		XHR.open(data.method, data.url, data.mode);
236	} catch(e){
237		return 0;
238	}
239	
240	// nastavim hlavicky
241	for(var i = 0; i < data.headers.length; i++){
242		XHR.setRequestHeader(data.headers[i].typ,data.headers[i].content);
243	}
244	// zpracovani asynchroniho requestu
245	if(data.mode){
246		function stateChangeFunction(){
247	        if( XHR.readyState == 4 ) {
248				if(data.format == 'xml'){
249					var out = XHR.responseXML;
250				} else if(data.format == 'txt'){
251					var out = XHR.responseText;
252				}
253				data.callBackObj[data.callBackFunc](out,XHR.status);
254				XHR = null;
255	        }		
256		}
257		XHR.onreadystatechange = stateChangeFunction;
258	}
259	// odeslani requestu dle nastavenoeho modu post/get
260	if(data.method == this.METHOD['post']){ 
261	    if(typeof data.postData != 'undefined') {
262			XHR.send(data.postData);
263		} else {
264			return 0;
265		}
266	} else {
267		XHR.send(null);
268	}
269	// zpracovani synchroniho requestu
270	if(!data.mode){
271		if(data.format == 'xml'){
272			var out = XHR.responseXML;
273		} else {
274			var out = XHR.responseText
275		}
276		if(returnOnly){
277			return { status : XHR.status, data : out };
278		} else {
279			data.callBackObj[data.callBackFunc](out,XHR.status);
280		}
281	} else {
282		return XHR;
283	}
284};
285
286/**
287 * umožňuje zrušit asynchroní dotaz pokud již není zpracováván
288 * @method 
289 * @param {object} XHR objekt requestu vracený metodou send
290 */   
291SZN.HTTPRequest.prototype.abort = function(XHR){
292	if (typeof XHR == 'object') {
293		XHR.abort();
294	} else {
295		return 0;
296	}
297};
298
299/**
300 * vrací metodu jakou bude probíhat komunikace klient - server pokud je známá,
301 * jinak vrací výchozí, definovanou v objektu METHOD
302 * @private
303 * @method  
304 * @param {string} method požadovaná metoda   
305 * @returns {string}
306 */  
307SZN.HTTPRequest.prototype._getMethod = function(method){
308	return (typeof this.METHOD[method] != 'undefined') ? this.METHOD[method] : this.METHOD['def'];
309};
310/**
311 * vrací mod v jakém bude probíhat komunikace klient - server pokud je známá,
312 * jinak vrací vychozí, definovanou v objektu MODE
313 * @private
314 * @method 
315 * @param {string} mode požadovaný mod
316 * @returns {string}
317 */ 
318SZN.HTTPRequest.prototype._getMode = function(mode){
319	return (typeof this.MODE[mode] != 'undefined') ? this.MODE[mode] : this.MODE['def'];
320};
321/**
322 * vrací formát jakou bude probíhat komunikace klient - server pokud je znám,
323 * jinak vrací vychozí, definovaný v objektu FORMAT
324 * @private
325 * @method  
326 * @param {string} format požadovaný formát
327 * @returns {string}
328 */ 
329SZN.HTTPRequest.prototype._getFormat = function(format){
330	return (typeof this.FORMAT[format] != 'undefined') ? this.FORMAT[format] : this.FORMAT['def'];
331};
332/**
333 * připravuje nastavení HTTP hlaviček pro zasílany dotaz, pokud nenajde v
334 * argumentu hlavičku 'Content-type', použije definovanou v HEADER
335 * @private
336 * @method   
337 * @param {array} headers pole objektů s vlastnostmi:
338 * <ul>
339 * <li>typ - typ hlavičky</li>
340 * <li>content - hodnota hlavičky</li>
341 * </ul> 
342 * @returns {array} pole požadovaných hlaviček, které mají být nastaveny 
343 */   
344SZN.HTTPRequest.prototype._setHeaders = function(headers){
345	var headers = (headers instanceof Array) ? headers : new Array();
346	var out = new Array();
347	var setContent = false;
348	for(var i = 0; i < headers.length; i++){
349		if(headers[i].typ == 'Content-Type'){
350			setContent = true;
351		}
352		out[i] = {
353			typ : headers[i].typ,
354			content : headers[i].content		
355		}
356	}
357	if(!setContent){
358		out.push({typ : this.HEADER[0].typ,content : this.HEADER[0].content});
359	}
360	return out;
361}
362/**
363 * provadí nastavení vlastností pro daný dotaz, aktuálně volanou metodu
364 * <em>send</em> aniž by přepisoval nastavené (nutné kvůli asynchronímu volání)
365 * @private
366 * @method   
367 * @param {string} url url, na které budeme posílat dotazy (musí být zadán, ale může být prazdný)
368 * @param {object} obj objekt, v jehož oboru platnosti zpracováváme odpověď (musí být zadán, ale může být prazdný)
369 * @param {string} func metoda, která bude odpověď zpracovávat (musí být zadán, ale může být prazdný)
370 * @param {object} setting [<em>volitelné</em>] instance objektu Setting s dalšími daty
371 * @returns {object} data, která se použijí v metodě <em>send</em>
372 */   
373SZN.HTTPRequest.prototype._setFromData = function(url,obj,func,setting){
374	var data = new Object();
375	for(var i in this.data){
376		switch (i){
377			case 'method':
378				if(setting[i]){
379					data[i] = this._getMethod(setting[i])
380				} else {
381					data[i] = this.data[i]
382				}
383				break;
384			case 'format':
385				if(setting[i]){
386					data[i] = this._getFormat(setting[i])
387				} else {
388					data[i] = this.data[i]
389				}
390				break;
391			case 'mode':
392				if(setting[i]){
393					data[i] = this._getMode(setting[i])
394				} else {
395					data[i] = this.data[i]
396				}
397				break;
398			case 'headers':
399				if(setting[i]){
400					data.headers = this._setHeaders(setting[i]);
401				} else {
402					data.headers = this._setHeaders(this.data[i]);
403				}
404				break;
405			default:
406				if(setting[i]){
407					data[i] = setting[i];
408				} else {
409					data[i] = this.data[i];
410				}				
411				break;
412		}
413	}
414	data.url = url ? url : this.url;
415	data.callBackObj = obj ? obj : this.callBackObj;
416	data.callBackFunc = func ? func : this.callBackFunc;
417	return data;
418};
419/**
420 * crossplatformí vytváření HTTPxmlRequestu
421 * @private
422 * @method  
423 * @returns XMLHttpRequest
424 *
425 */   
426SZN.HTTPRequest.prototype._getRequest = function(){
427    if(typeof(XMLHttpRequest) != 'undefined') {
428		return new XMLHttpRequest();
429	}
430	else {
431		try {
432			/*- IE */
433			return new ActiveXObject("Msxml2.XMLHTTP"); /*- "Microsoft.XMLHTTP*/
434		}
435		catch (e) {
436			try { 
437				return new ActiveXObject("Microsoft.XMLHTTP"); 
438			}
439			catch (e) {
440				return 0;
441			}
442		}
443	}
444};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.