1 /** 2 * @ignore 3 */ 4 var Ozone = Ozone || {}; 5 Ozone.util = Ozone.util || {}; 6 Ozone.util.formField = Ozone.util.formField || {}; 7 Ozone.config = Ozone.config || {}; 8 9 /** 10 * @private 11 * 12 * @description This method is useful if you want to see if a specfic url is the same 13 * as the local url. Can be used to test if AJAX can be used. If url 14 * is not a URL, it's assumed to be a relative filename, so this function 15 * returns true. 16 * 17 * @param {String} url String that you want to check to see if its local. 18 * 19 * @returns Boolean 20 * 21 * @throws "Not a valid URL" if the parameter is not a valid url 22 */ 23 Ozone.util.isUrlLocal = function(url) { 24 25 var webContextPath = Ozone.util.contextPath(); 26 27 //append last '/' this value should never be null 28 if (webContextPath != '' && webContextPath != null) { 29 webContextPath += '/'; 30 } 31 32 //this regex matches urls against the configured webcontext path https://<contextPath>/..... 33 //only one match is possible since this regex matches from the start of the string 34 var regex = new RegExp("^(https?:)//([^/:]+):?(.*)" + webContextPath); 35 var server = url.match(regex); 36 37 //check if this might be a relative url 38 if (!server) { 39 if (url.match(new RegExp('^https?:\/\/'))) { 40 return false; 41 } 42 else { 43 return true; 44 } 45 } 46 47 var port = window.location.port;// || ( window.location.protocol === "https:" ? "443" : "80" ) 48 49 //todo need to find a better way of checking same domain requests 50 // see if solution posted here works: http://stackoverflow.com/questions/9404793/check-if-same-origin-policy-applies 51 return window.location.protocol === server[1] && window.location.hostname === server[2] && port === server[3] 52 }; 53 54 /** 55 * @private 56 * 57 * @description This method will convert a string into a json object. There is a check 58 * done to ensure no unsafe json is included. 59 * 60 * @param {String} str String that represents a json object 61 * 62 * @returns {Object} json object 63 * 64 * @throws Error if parameter is not a string 65 * @throws Error if secure check finds unsafe JSON 66 * @throws Error if there is an issue converting to JSON 67 * 68 * @requires dojox.secure.capability 69 * @requires dojo base 70 */ 71 Ozone.util.parseJson = function(str) { 72 if (typeof(str) === 'string') { 73 owfdojox.secure.capability.validate(str,[],{}); // will error if there is unsafe JSON 74 var x = owfdojo.fromJson(str); 75 return x; 76 } else { 77 throw "Ozone.util.parseJson expected a string, but didn't get one"; 78 } 79 }; 80 81 /** 82 * @private 83 */ 84 Ozone.util.HTMLEncodeReservedJS = function(str) { 85 return str.replace(/"/g, '"').replace(/'/g, "'"); 86 }; 87 88 /** 89 * @private 90 * 91 * @description Similar to Ext.util.Format.htmlEncode except this method also handles the single quote 92 */ 93 Ozone.util.HTMLEncode = function(str){ 94 return !str ? str : String(str).replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, """).replace(/'/g, "'"); 95 }; 96 97 /** 98 * @private 99 * 100 * Constructively clears the entire array 101 */ 102 Ozone.util.parseWindowNameData = function() { 103 var configParams = null; 104 return function() { 105 106 //if already parsed just return the value 107 if (configParams) return configParams; 108 109 //parse out the config 110 try { 111 configParams = Ozone.util.parseJson( 112 window.name 113 ); 114 return configParams; 115 } 116 catch (e) { 117 return null; 118 } 119 } 120 }(); 121 122 123 /** 124 * @private 125 * 126 * @description This method returns the current context path by 127 * calling a controller at the server (will not 128 * make the call if it has already been done). 129 * 130 * @param {Object} o unused 131 * 132 * @returns context path with leading slash 133 * (ex. "/owf") 134 * 135 * @requires Ext base, dojo 136 */ 137 Ozone.util.contextPath = (function() { 138 var configParams = Ozone.util.parseWindowNameData(), 139 contextPath = Ozone.config.webContextPath; 140 141 if (configParams && configParams.webContextPath) { 142 contextPath = Ozone.config.webContextPath = configParams.webContextPath; 143 } 144 145 return function () { 146 return contextPath || ''; 147 } 148 })(); 149 150 /** 151 * @private 152 * 153 * @description Checks whether the url context is local or not, 154 * then returns the valid url w/ context. 155 * 156 * @param {String} value the url 157 * @param {String} validContext valid context 158 * 159 * @returns valid url w/context if necessary, if not local then the url 160 */ 161 Ozone.util.validUrlContext = function(value, validContext){ 162 var containsRelDotPath = (value.indexOf("../") == 0)?true:false; 163 var containsRelPath = (value.indexOf("/") == 0)?true:false; 164 var isLocalUrl = (containsRelPath || containsRelDotPath || (value.indexOf("localhost") == 7) || (value.indexOf("localhost") == 11) || (value.indexOf("127.0.0.1") == 7)) ? true : false; 165 var urlValidContext = value; 166 validContext = ((validContext == undefined) ? Ozone.util.contextPath() : validContext); 167 if((isLocalUrl == true) && (validContext != null)){ 168 if(containsRelPath){ 169 urlValidContext = String.format("{0}{1}", validContext, value); 170 }else if(containsRelDotPath){ 171 var valuePathNoRel = value.substring(3); 172 urlValidContext = String.format("{0}/{1}", validContext, valuePathNoRel); 173 } 174 } 175 return urlValidContext; 176 }; 177 178 /** 179 * @private 180 * 181 * @description This method centralizes the container relay file for 182 * RPC calls. 183 * 184 * @returns relay file path with context 185 */ 186 Ozone.util.getContainerRelay = function() { 187 return Ozone.util.contextPath() + 188 '/js/eventing/rpc_relay.uncompressed.html'; 189 }; 190 191 /** 192 * @private 193 * 194 * @description This method will convert anything to a string. 195 * There is no check for recursion, so don't do that 196 * 197 * @param {Object} obj object to convert 198 * 199 * @returns string 200 * 201 * @requires dojo base 202 */ 203 Ozone.util.toString = function(obj) { 204 if (typeof(obj) === 'object') { 205 return owfdojo.toJson(obj); 206 } else { 207 return obj+''; 208 } 209 }; 210 211 /** 212 * @private 213 */ 214 Ozone.util.formatWindowNameData = function(data) { 215 // this value needs to be not uri encoded 216 // return decodeURIComponent(owfdojo.objectToQuery(data)); 217 return Ozone.util.toString(data); 218 }; 219 220 /** 221 * @private 222 * 223 * Removes the Leading and Trailing Spaces in any ExtJs Form Field 224 */ 225 Ozone.util.formField.removeLeadingTrailingSpaces = function(thisField){ 226 var thisField_noLeadingTrailingSpacesValue = thisField.getValue().replace(new RegExp(Ozone.lang.regexLeadingTailingSpaceChars), ''); 227 thisField.setValue(thisField_noLeadingTrailingSpacesValue); 228 return thisField_noLeadingTrailingSpacesValue; 229 }; 230 231 if (!Ozone.util.ModalBox) { 232 Ozone.util.ModalBox = function() { 233 var ab = 'absolute'; 234 var n = 'none'; 235 var obody = document.getElementsByTagName('body')[0]; 236 var frag = document.createDocumentFragment(); 237 var obol = document.createElement('div'); 238 obol.setAttribute('id', 'ol'); 239 obol.style.display = n; 240 obol.style.position = ab; 241 obol.style.top = 0; 242 obol.style.left = 0; 243 obol.style.zIndex = 10000; 244 obol.style.width = '100%'; 245 obol.style.backgroundColor = "#555"; 246 obol.style.filter = 'alpha(opacity=50)'; 247 obol.style.MozOpacity = 0.5; 248 obol.style.opacity = 0.5; 249 250 251 frag.appendChild(obol); 252 this.obol = obol; 253 var obbx = document.createElement('div'); 254 obbx.setAttribute('id', 'mbox'); 255 obbx.style.display = n; 256 obbx.style.position = ab; 257 obbx.style.backgroundColor = '#eee'; 258 obbx.style.padding = '8px'; 259 obbx.style.border = '2px outset #666'; 260 obbx.style.zIndex = 10001; 261 this.obbx = obbx; 262 var obl = document.createElement('span'); 263 obbx.appendChild(obl); 264 var obbxd = document.createElement('div'); 265 obbxd.setAttribute('id', 'mbd'); 266 var d = document.createElement('div'); 267 var txt = document.createElement('span'); 268 txt.innerHTML = 'Press OK to continue.'; 269 this.txt = txt; 270 var d2 = document.createElement('div'); 271 d2.style.textAlign = 'center'; 272 d2.style.fontSize = '14px'; 273 d2.appendChild(txt); 274 d2.appendChild(document.createElement('br')); 275 var but = document.createElement('button'); 276 277 but.innerHTML = 'OK'; 278 var self = this; 279 but.onclick= function() 280 { 281 self.hide(); 282 } 283 d2.appendChild(but); 284 d.appendChild(d2); 285 obbxd.appendChild(d); 286 this.obbxd = obbxd; 287 obl.appendChild(obbxd); 288 frag.insertBefore(obbx, obol.nextSibling); 289 obody.insertBefore(frag, obody.firstChild); 290 window.onscroll = function(){ 291 self.scrollFix(); 292 } 293 window.onresize = function(){ 294 self.sizeFix(); 295 } 296 } 297 298 Ozone.util.ModalBox.prototype.pageWidth = function () { 299 return window.innerWidth != null ? window.innerWidth 300 : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth 301 : document.body != null ? document.body.clientWidth : null; 302 } 303 Ozone.util.ModalBox.prototype.pageHeight = function () { 304 return window.innerHeight != null ? window.innerHeight 305 : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight 306 : document.body != null ? document.body.clientHeight : null; 307 } 308 Ozone.util.ModalBox.prototype.posLeft = function() { 309 return typeof window.pageXOffset != 'undefined' ? window.pageXOffset 310 : document.documentElement && document.documentElement.scrollLeft ? document.documentElement.scrollLeft 311 : document.body.scrollLeft ? document.body.scrollLeft : 0; 312 } 313 Ozone.util.ModalBox.prototype.posTop = function () { 314 return typeof window.pageYOffset != 'undefined' ? window.pageYOffset 315 : document.documentElement && document.documentElement.scrollTop ? document.documentElement.scrollTop 316 : document.body.scrollTop ? document.body.scrollTop : 0; 317 } 318 319 Ozone.util.ModalBox.prototype.scrollFix = function() 320 { 321 //var obol = $('ol'); 322 this.obol.style.top = this.posTop() + 'px'; 323 this.obol.style.left = this.posLeft() + 'px' 324 } 325 Ozone.util.ModalBox.prototype.sizeFix = function () { 326 //var obol = $('ol'); 327 this.obol.style.height = this.pageHeight() + 'px'; 328 this.obol.style.width = this.pageWidth() + 'px'; 329 var tp = this.posTop() + ((this.pageHeight() - this.height) / 2) - 12; 330 var lt = this.posLeft() + ((this.pageWidth() - this.width) / 2) - 12; 331 this.obbx.style.top = (tp < 0 ? 0 : tp) + 'px'; 332 this.obbx.style.left = (lt < 0 ? 0 : lt) + 'px'; 333 334 } 335 Ozone.util.ModalBox.prototype.kp = function (e) { 336 ky = e ? e.which : event.keyCode; 337 if (ky == 88 || ky == 120) 338 this.hide(); 339 return false 340 } 341 Ozone.util.ModalBox.prototype.inf = function (h) { 342 tag = document.getElementsByTagName('select'); 343 for (i = tag.length - 1; i >= 0; i--) 344 tag[i].style.visibility = h; 345 tag = document.getElementsByTagName('iframe'); 346 for (i = tag.length - 1; i >= 0; i--) 347 tag[i].style.visibility = h; 348 tag = document.getElementsByTagName('object'); 349 for (i = tag.length - 1; i >= 0; i--) 350 tag[i].style.visibility = h; 351 } 352 Ozone.util.ModalBox.prototype.hide = function () { 353 var v = 'visible'; 354 var n = 'none'; 355 this.obol.style.display = n; 356 this.obbx.style.display = n; 357 this.inf(v); 358 document.onkeypress = '' 359 } 360 Ozone.util.ModalBox.prototype.show = function (msg,wd, ht) { 361 var h = 'hidden'; 362 var b = 'block'; 363 var p = 'px'; 364 wd = wd | 200; 365 ht = ht | 100; 366 var obol = this.obol 367 var obbxd = this.obbxd; 368 this.txt.innerHTML = msg; 369 obol.style.height = this.pageHeight() + p; 370 obol.style.width = this.pageWidth() + p; 371 obol.style.top = this.posTop() + p; 372 obol.style.left = this.posLeft() + p; 373 obol.style.display = b; 374 var tp = this.posTop() + ((this.pageHeight() - ht) / 2) - 12; 375 var lt = this.posLeft() + ((this.pageWidth() - wd) / 2) - 12; 376 var obbx = this.obbx 377 obbx.style.top = (tp < 0 ? 0 : tp) + p; 378 obbx.style.left = (lt < 0 ? 0 : lt) + p; 379 obbx.style.width = wd + p; 380 obbx.style.height = ht + p; 381 this.inf(h); 382 obbx.style.display = b; 383 this.width = wd; 384 this.height = ht; 385 return false; 386 } 387 } 388 if (!Ozone.util.ErrorDlg) 389 { 390 Ozone.util.ErrorDlg = {}; 391 Ozone.util.ErrorDlg.show=function(msg,width,height) 392 { 393 if (!this.dlgBox) 394 this.dlgBox = new Ozone.util.ModalBox(); 395 this.dlgBox.show(msg,width,height); 396 }; 397 } 398 399 400 /** 401 * @private 402 */ 403 Ozone.util.fireBrowserEvent = function(dom, type, bubble, cancelable) { 404 if (document.createEvent) { 405 var event = document.createEvent('Events'); 406 event.initEvent(type, bubble || true, cancelable || true); 407 dom.dispatchEvent(event); 408 } 409 else if (document.createEventObject) { 410 dom.fireEvent('on' + type); 411 } 412 }; 413 414 /** 415 Clones dashboard and returns a dashboard cfg object that can be used to create new dashboards. 416 @name cloneDashboard 417 @methodOf OWF.Util 418 419 @returns Object dashboard cfg object that can be used to create new dashboards. 420 */ 421 Ozone.util.cloneDashboard = function(dashboardCfg, regenerateIds, removeLaunchData) { 422 423 var dashboardStr = Ozone.util.toString(dashboardCfg); 424 425 if(regenerateIds === true) { 426 var newDashboardGuid = guid.util.guid(), 427 dashboardGuid = dashboardCfg.guid; 428 429 // update dashboard guid 430 dashboardStr = dashboardStr.replace(new RegExp(dashboardGuid, 'g'), newDashboardGuid); 431 dashboardStrCopy = dashboardStr; 432 433 // update widget instance ids 434 var widgetInstanceIdRegex = /\"uniqueId\"\:\"([A-Fa-f\d]{8}-[A-Fa-f\d]{4}-[A-Fa-f\d]{4}-[A-Fa-f\d]{4}-[A-Fa-f\d]{12})\"/g; 435 var result; 436 while ((result = widgetInstanceIdRegex.exec(dashboardStrCopy)) != null) { 437 // var msg = "Found " + result[1]; 438 // console.log(msg); 439 dashboardStr = dashboardStr.replace(new RegExp(result[1], 'g'), guid.util.guid()); 440 } 441 } 442 443 var dashboard = Ozone.util.parseJson(dashboardStr); 444 445 if(removeLaunchData === true) { 446 var cleanData = function(cfg) { 447 if(!cfg || !cfg.items) 448 return; 449 450 if(cfg.items.length === 0 && cfg.widgets) { 451 for(var i = 0, len = cfg.widgets.length; i < len; i++) { 452 delete cfg.widgets[i].launchData; 453 } 454 } 455 else { 456 for(var i = 0, len = cfg.items.length; i < len; i++) { 457 cleanData(cfg.items[i]); 458 } 459 460 } 461 }; 462 463 cleanData(dashboard.layoutConfig); 464 } 465 466 return dashboard; 467 }; 468 469 Ozone.util.createRequiredLabel= function(label) { 470 return "<span class='required-label'>" + label + " <span class='required-indicator'>*</span></span>"; 471 }