/**

* JSON Schema link handler
* Copyright (c) 2007 Kris Zyp SitePen (www.sitepen.com)
* Licensed under the MIT (MIT-LICENSE.txt) license.
*/

(function (root, factory) {

if (typeof define === 'function' && define.amd) {
    // AMD. Register as an anonymous module.
    define([], function () {
        return factory();
    });
} else if (typeof module === 'object' && module.exports) {
    // Node. Does not work with strict CommonJS, but
    // only CommonJS-like environments that support module.exports,
    // like Node.
    module.exports = factory();
} else {
    // Browser globals
    root.jsonSchemaLinks = factory();
}

}(this, function () {// setup primitive classes to be JSON Schema types var exports = {}; exports.cacheLinks = true; exports.getLink = function(relation, instance, schema){

// gets the URI of the link for the given relation based on the instance and schema
// for example:
// getLink(
//              "brother", 
//              {"brother_id":33}, 
//              {links:[{rel:"brother", href:"Brother/{brother_id}"}]}) ->
//      "Brother/33"
var links = schema.__linkTemplates; 
if(!links){
        links = {};
        var schemaLinks = schema.links;
        if(schemaLinks && schemaLinks instanceof Array){
                schemaLinks.forEach(function(link){
/*                      // TODO: allow for multiple same-name relations
                        if(links[link.rel]){
                                if(!(links[link.rel] instanceof Array)){
                                        links[link.rel] = [links[link.rel]];
                                }
                        }*/
                        links[link.rel] = link.href;
                });
        }
        if(exports.cacheLinks){
                schema.__linkTemplates = links;
        }
}
var linkTemplate = links[relation];
return linkTemplate && exports.substitute(linkTemplate, instance);

};

exports.substitute = function(linkTemplate, instance){

return linkTemplate.replace(/\{([^\}]*)\}/g, function(t, property){
                var value = instance[decodeURIComponent(property)];
                if(value instanceof Array){
                        // the value is an array, it should produce a URI like /Table/(4,5,8) and store.get() should handle that as an array of values
                        return '(' + value.join(',') + ')';
                }
                return value;
        });

}; return exports; }));