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