aboutsummaryrefslogblamecommitdiffstats
path: root/lib/util.js
blob: 77b7facea5029bdb678ac3128edd705b96bb849b (plain) (tree)
1
2
3
4
5
6
7
8
                                                                                
                         



                                                                 
                                
                            




                                                           
  











                                                         
                                


                                   
                                 


                              

  




                                                                                   
                                              





                                             


                                        

     

                                              
                                                   





                            
                                           


                                       
     


   












                                                                  





                              













                                                                    














                                                                      














                                                                            



















                                                                     
                                   










































                                                                               
                        
                          
                                                  








                                                                  









                                                     
/*global exports: false, require: false, console: false, Cc: false, Ci: false */
/*jslint onevar: false */
// Released under the MIT/X11 license
// http://www.opensource.org/licenses/mit-license.php
"use strict";
// ==============================================================
var {Cc,Ci} = require("chrome");
var urlMod = require("url");

/**
 * Function for the management of the prototypal inheritace
 * David Flanagan, Javascript: The Definitve Guide,
 * IV. edition, O'Reilly, 2006, p. 168
 *
 * @param superobject
 * @return new object, it needs new prototype.constructor
 *
 * <pre>
 * function Father(x) {
 *    this.family = x;
 * }
 *
 * function Son(x,w) {
 *    Father.call(this,x);
 *    this.wife = w;
 * }
 * Son.prototype = heir(Father);
 * Son.prototype.constructor = Son;
 * </pre>
 */
exports.heir = function heir(p) {
    function F() {};
    F.prototype = p.prototype;
    return new F();
};

/**
 * get parameters of URL as an object (name, value)
 */
var getParamsFromURL = exports.getParamsFromURL = function getParamsFromURL (url) {
    if (!url || (url.toString().length === 0)) {
        throw new Error("Missing URL value!");
    }
    
    if (!(url instanceof urlMod.URL)) {
        url = new urlMod.URL(url.toString());
    }

    var paramsArr = url.path.split("?");
    if (paramsArr.length === 1) {
        return {};
    }

    // get convert URL parameters to an Object
    var params = {}, s = [];
    paramsArr[1].split('&').forEach(function(par) {
        s = par.split('=');
        params[s[0]] = s[1];
    });
    return params;
};

exports.getBugNo = function getBugNo(url) {
    var params = getParamsFromURL(url);
    if (params && params.id) {
        return parseInt(params.id, 10);
    }
};

/**
 * Show a system notification with the given message
 *
 * @param String or Object with a message to be shown in a default
 * notification or object with properties title, icon, and body
 * @return None
 */
exports.notification = function notification(msg) {
    var body = msg;
    var title = "Bugzilla Notification";
    var icon = null;

    if (typeof(msg) === "object") {
        body = msg.body;
        if ("title" in msg) {
            title = msg.title;
        }
        if ("icon" in msg) {
            icon = msg.icon;
        }
    }
    try {
        var classObj = Cc["@mozilla.org/alerts-service;1"];
        var alertService = classObj.getService(Ci.nsIAlertsService);

        alertService.showAlertNotification(icon, title, body);
        return true;
    } catch (e) {
        console.error("Unable to display notification:", msg);
        return false;
    }
};

/**
 * format date to be in ISO format (just day part)
 *
 * @param date
 * @return string with the formatted date
 */
exports.getISODate = function getISODate(dateStr) {
    function pad(n) {
        return n < 10 ? '0' + n : n;
    }
    var date = new Date(dateStr);
    return date.getFullYear() + '-' + pad(date.getMonth() + 1) + '-' +
            pad(date.getDate());
};

/**
 * Check whether an item is member of the list. Idea is just to make long if
 * commands slightly more readable.
 *
 * @param mbr string to be searched in the list
 * @param list list
 * @return position of the string in the list, or -1 if none found.
 */
var isInList = exports.isInList = function isInList(mbr, list) {
    if (!list) {
        return false;
    }
    return (list.indexOf(mbr) !== -1);
};

/**
 * Make sure value returned is Array
 *
 * @param Array/String
 * @return Array
 *
 * If something else than Array or String is passed to the function
 * the result will be untouched actual argument of the call.
 */
var valToArray = exports.valToArray = function valToArray(val) {
    var isArr = val &&
        val.constructor &&
        val.constructor.name === "Array";
    return isArr ? val : [val];
};

/**
 * Merges two comma separated string as a list and returns new string
 *
 * @param str String with old values
 * @param value String/Array with other values
 * @return String with merged lists
 */
exports.addCSVValue = function addCSVValue(str, value) {
    var parts = (str.trim().length > 0 ? str.split(/,\s*/) : []);
    if (!value) {
        return str;
    }
    if (!isInList(value, parts)) {
        var newValue = valToArray(value);
        parts = parts.concat(newValue);
    }
    // this is necessary to get comma-space separated string even when
    // value is an array already
    parts = parts.join(",").split(",");
    return parts.join(", ");
};

/**
 * Treats comma separated string as a list and removes one item from it
 *
 * @param str String treated as a list
 * @param value String with the value to be removed from str
 * @return String with the resulting list comma separated
 */
exports.removeCSVValue = function removeCSVValue(str, value) {
    str = str.trim();
    var parts = str ? str.split(/,\s*/) : [];
    var valueArr = value instanceof Array ? value : value.split(/,\s*/);
    parts = parts.filter(function (e, i, a) {
        return (!isInList(e, valueArr));
    });
    return parts.join(", ");
};

/**
 * select element of the array where regexp in the first element matches second
 * parameter of this function
 *
 * @param list Array with regexps and return values
 * @param chosingMark String by which the element of array is to be matched
 * @return Object chosen element
 */
var filterByRegexp = exports.filterByRegexp =
        function filterByRegexp(list, chosingMark) {
    var chosenPair = [];
    if (list.length > 0) {
        chosenPair = list.filter(function (pair) {
            return new RegExp(pair.regexp, "i").test(chosingMark);
        });
    }
    if (chosenPair.length > 0) {
        return chosenPair[0].addr;
    } else {
        return "";
    }
};

exports.getObjectKeys = function getObjectKeys(obj) {
    var keys = [];
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            keys.push(key);
        }
    }
    return keys;
};