1/** 2 * messsaging class for handling local and ajax messages 3 */ 4 5//.ajaxSetup: added Mo, 13.09.2010 MWilbers, JGerke: (adding articles from bonusclub to shoppingcart: in IE8 wrong article-quantity is shown in 6// rightpanel-shoppingcart because of IE-specific caching) 7$.ajaxSetup({cache: false }); 8 9function Hermes() { 10 11 //var hs = this; 12 this.listenerMap = new Object(); 13 this.username = undefined; 14 this.password = undefined; 15 16 //private method getLoginListener 17 this.getLoginListener = function(id) { 18 var listeners = this.listenerMap[id]; 19 if (listeners) { 20 var cb; 21 for (var cb in listeners) { 22 cb = listeners[cb]; 23 if (cb instanceof LoginMessageListener) 24 return cb; 25 } 26 } 27 } 28 29 //private method getDataType 30 this.getDataType = function(urlId) { 31 var dataType; 32 if (urlId.indexOf("json") >= 0 || urlId.indexOf("Json.do") >= 0) { 33 dataType = "json"; 34 }else if (urlId.indexOf("xml") >= 0 || urlId.indexOf("Xml.do") >= 0) { 35 dataType = "xml"; 36 }else if (urlId.indexOf("html") >= 0 || urlId.indexOf("Html.do") >= 0) { 37 dataType = "html"; 38 }else { 39 dataType = "text"; 40 } 41 return dataType; 42 } 43 44 //private method getDataType 45 this.getContentType = function(data) { 46 if (data == null) { 47 return ""; 48 } 49 50 var contentType; 51 52 if (isJson(data)) { 53 contentType = "application/json; charset=UTF-8"; 54 }else if (data.indexOf("<?xml version") >= 0) { 55 contentType = "application/xml; charset=UTF-8"; 56 }else if (data.indexOf("<!DOCTYPE html") >= 0) { 57 contentType = "text/html; charset=UTF-8"; 58 }else { 59 contentType = "application/x-www-form-urlencoded; charset=UTF-8"; //neccessary for deleting items from rightpanel 60 } 61 return contentType; 62 } 63 64 function isJson(str) { 65 try { 66 JSON.parse(str); 67 } catch (e) { 68 return false; 69 } 70 return true; 71 } 72 73} 74 75/** 76 * method for checking the HTTP-Header for parameter X-Pegasos-Status and value NOT_LOGGED_IN 77 * @author: MWilbers (OPITZ) 78 * @param request HttpServletRequest 79 * returns true, if logged in 80 */ 81Hermes.prototype.loggedIn = function(urlId, data, request) { 82 var pegasosStatus = request.getResponseHeader("X-Pegasos-Status"); 83 if( pegasosStatus == 'NOT_LOGGED_IN' ) { 84 85 var loginListener = this.getLoginListener('messages-ajaxError'); 86 if(loginListener) { 87 //type LoginMessageListener (see pegasos-messages.js) 88 loginListener.ajaxError(urlId, data, request); 89 } 90 return false; 91 92 } 93 return true; 94} 95 96Hermes.prototype.autoLoggedIn = function(request) { 97 var pegasosStatus = request.getResponseHeader("X-Pegasos-Status"); 98 if( pegasosStatus == 'AUTO_LOGGED_IN' ) { 99 return true; 100 } 101 return false; 102} 103 104Hermes.prototype.clearListener = function(id) { 105 this.listenerMap[id] = undefined; 106} 107 108/** 109 * a listener is an object, which may implement those 3 methods: 110 * - receiveLocalMessage(data) - local javascript message dispatching. data is a JS Object 111 * - receiveAjaxSuccessMessage(id, data, response) - receive result of an ajax request. 112 * - receiveAjaxFailureMessage(id, data, response) - receive result of an ajax request. TODO: mayber signature will change 113 */ 114Hermes.prototype.addListener = function(id, callback) { 115 var listeners = this.listenerMap[id]; 116 if (listeners) { 117 var cb; 118 for (cb in listeners) { 119 if (cb === callback) 120 return; 121 } 122 } else { 123 this.listenerMap[id] = listeners = new Array(); 124 } 125 listeners.push(callback); 126} 127 128/** 129 * print all registered listeners on html page 130 */ 131Hermes.prototype.dumpListener = function(id) { 132 133 134 if (id) { 135 console.info("Dump all registered listener for '" + id + "'"); 136 var listener = this.listenerMap[id]; 137 if (listener) { 138 for (var i=0; i < listener.length; i++) { 139 console.info(id + ' ' + i + ": " + listener[i]); 140 } 141 } 142 else { 143 console.info(id + " does not contain any listener"); 144 } 145 } 146 else { /* dump all listener */ 147 console.info("Dump all registered listener"); 148 for (var key in this.listenerMap) { 149 var listener = this.listenerMap[key]; 150 for (var i=0; i < listener.length; i++) { 151 console.info(key + ' ' + i + ": " + listener[i]); 152 } 153 } 154 } 155} 156 157/** 158 * Example: id = 'cart/status/items' 159 * will register 3 listeners:
160 * 1. cart 161 * 2. cart/status 162 * 3. cart/status/items 163 * The callback parameter will act on every of these three id's 164 */ 165Hermes.prototype.addListenerDepth = function(id, callback) { 166 console.error('addListenerDepth is not imlemented'); 167} 168 169/** 170 der selector muss ein vollständiger JQUery-Selector sein 171*/ 172Hermes.prototype.bindElement = function(selector, value) { 173 var object = $(selector); 174 object.html(value); 175} 176 177/** 178 * send a message as an ajax request or to other listeners. dispatching of result is done via 179 * Hermes controller 180 * 181 * @param urlId ... target url, evetry listener which registered to this id is notified on an response 182 * urlId .. can also be an abstract identifier for mapping the type of listener which is registered and called by method listener.local() 183 * @param type ... 'get', 'post', 'local' 184 * @param urlParameter ... URL Parameter like "?matNo=123456&q123456=7" 185 */ 186Hermes.prototype.message = function(urlId, method, data, listener, dataType) { 187 188 if (listener != undefined) { 189 this.addListener(urlId, listener); 190 } 191 192 listener = this.listenerMap[urlId]; 193 if (!listener) { 194 console.info("No map defined for '" + urlId + "'"); 195 return; 196 } 197 198 199 var contentType = ""; 200 if (data == undefined) { 201 data = ""; 202 } 203 else if(data.length > 0 && method.toLocaleLowerCase() == 'post'){ 204 contentType = this.getContentType(data); 205 } 206 207 if(method != 'local') { 208 209 //define dataType 210 if (dataType == undefined || dataType == null) { 211 dataType = this.getDataType(urlId); 212 } 213 214 //pBrowserTab is not needed for returning xml or json 215 if (dataType != "xml" && dataType != "json") { 216 217 if (data != undefined && !data.substr(data.length - 1, 1) != '&') { 218 data += "&" 219 } 220 221 // pegasos is optional 222 if (window.pegasos) { 223 data += "pBrowserTab=" + window.pegasos.browserTab; 224 } 225 } 226 } 227 228 try { 229 if (method == 'local') { 230 for (var i=0; i < listener.length; i++) { 231 var callback = listener[i]; 232 if (callback.local != undefined) { 233 callback.local(urlId, data); 234 } 235 } 236 } 237 else { 238 var username = this.username; 239 var password = this.password; 240 241 window.console.debug('urlId: "' + urlId + '" querystring="' + data + '" datatyp: "' + dataType + '" contentType: "' + contentType + '"' ); 242 243 $.ajax({ 244 type: method, 245 url: urlId, 246 data: data, 247 dataType: dataType, 248 contentType : contentType, 249 beforeSend : function (req) { 250 if(username != undefined && password != undefined) { 251 var tok = username + ':' + password; 252 window.LOG.info("Sending HTTP Basic Auth = " + tok); 253 var basicAuth = 'Basic ' + Base64.encode(tok); 254 req.setRequestHeader('Authorization', basicAuth); 255 } 256 }, 257 error: function(request, status, thrown) { 258 /** 259 * @param request: the HttpServletRequest 260 * @status string describing the type of error 261 * @thrown optional exception object 262 */ 263 window.LOG.warn(status + " = " + thrown); 264 265 if(! HS.loggedIn(urlId, data, request)) { 266 for (var i=0; i < listener.length; i++) { 267 var callback = listener[i]; 268 if (callback.notLoggedIn != undefined) { 269 callback.notLoggedIn(urlId, data, request); 270 } 271 } 272 } else { 273 274 for (var i=0; i < listener.length; i++) { 275 var callback = listener[i]; 276 if (callback.ajaxError != undefined) { 277 callback.ajaxError(urlId, data, request); 278 } 279 } 280 281 } 282 }, 283 success: function(response, status, request) { 284 for (var i=0; i < listener.length; i++) { 285 var callback = listener[i]; 286 if (callback.ajaxSuccess != undefined) { 287 callback.ajaxSuccess(urlId, data, response, request); 288 } 289 else { 290 console.warn("no method ajaxSuccess defined for id " + urlId); 291 } 292 } 293 } 294 }); 295 } 296 } 297 catch(error) { 298 console.warn(error); 299 } 300 301} 302 303/* global stuff */ 304 305HS = new Hermes(); 306 307/* default listener implementations */ 308 309function SimpleClientListener(selector) { 310 this.selector = selector; 311} 312 313SimpleClientListener.prototype.local = function(id, data) { 314 HS.bindElement(this.selector, data); 315} 316 317/* probably stupid */ 318SimpleClientListener.prototype.ajaxSuccess = function(id, data, response) { 319 HS.bindElement(this.selector, response); 320} 321 322
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.