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.