
function process_url_recipe (data, recipe_name) {
    var url_recipe = data[recipe_name] !== undefined 
        ? data[recipe_name][0] : null;
    return url_recipe ? prepare_url(url_recipe, data) : null;
}

function choose_url (data) {
    var local_url = process_url_recipe(data, "md-url-recipe");
    if (local_url)
	return local_url;

    var resource_url = data["md-electronic-url"] !== undefined 
        ? data["md-electronic-url"][0] : null;
    if (local_url != null)
        return local_url;
    else if (resource_url != null)
        return resource_url;
    else
        return null;
}

// Prepares urls from recipes with expressions in the form:
// ${variable-name[pattern/replacement/mode]}, [regex] is optional
// eg. http://sever.com?title=${md-title[\s+//]} will strip all whitespaces 
function prepare_url(url_recipe, meta_data) {
    if (typeof url_recipe != "string" || url_recipe.length == 0)
        return null;
    if (typeof meta_data != "object")
        return null;
    try {
        return url_recipe.replace(/\${[^}]*}/g, function (match) { 
          return get_var_value(match, meta_data);
        });
    } catch (e) {
        return "Malformed URL recipe: " + e.message;
    }
}

function get_var_value (expr_in, meta_data) {
    //strip ${ and }
    var expr = expr_in.substring(2, expr_in.length-1)
    if (expr == "") return "";
    //extract name
    var var_name = expr.match(/^[^\[]+/)[0];
    if (typeof meta_data[var_name] == "undefined") return "";
    else var var_value = meta_data[var_name][0];
    if (var_name.length < expr.length) { //possibly a regex
       var_value = exec_sregex(
          expr.substring(var_name.length+1, expr.length-1),
          var_value);
    }
    return var_value;
}

// exec perl-like substitution regexes in the form: pattern/replacement/mode
function exec_sregex (regex_str, input_str) {   
    var regex_parts = ["", "", ""];
    var i = 0;
    for (var j=0; j<regex_str.length && i<3; j++) {
        if (j>0 && regex_str.charAt(j) == '/' && regex_str.charAt(j-1) != '\\')
            i++;
        else
            regex_parts[i] += regex_str.charAt(j);
    }
    var regex_obj = new RegExp(regex_parts[0], regex_parts[2]);
    return input_str.replace(regex_obj, regex_parts[1]);    
}

function test_url_recipe() {
  var url_recipe = "http://www.indexdata.com/?title=${md-title[\\s+/+/g]}&author=${md-author}";
  var meta_data = { "md-title" : ["Art of Computer Programming"], "md-author" : ["Knuth"]}
  var final_url = prepare_url(url_recipe, meta_data);
  alert(final_url);
}
