(function (root, initialize){

var Mapnya = initialize();
if(typeof define !== "undefined" && define.amd)define(Mapnya);
root.Mapnya = Mapnya;

}(this, function(){

//modules here

/**

* @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
* Available via the MIT or new BSD license.
* see: http://github.com/jrburke/almond for details
*/

//Going sloppy to avoid ‘use strict’ string cost, but strict practices should //be followed. /*jslint sloppy: true */ /*global setTimeout: false */

var requirejs, require, define; (function (undef) {

var main, req, makeMap, handlers,
    defined = {},
    waiting = {},
    config = {},
    defining = {},
    hasOwn = Object.prototype.hasOwnProperty,
    aps = [].slice,
    jsSuffixRegExp = /\.js$/;

function hasProp(obj, prop) {
    return hasOwn.call(obj, prop);
}

/**
 * Given a relative module name, like ./something, normalize it to
 * a real name that can be mapped to a path.
 * @param {String} name the relative name
 * @param {String} baseName a real name that the name arg is relative
 * to.
 * @returns {String} normalized name
 */
function normalize(name, baseName) {
    var nameParts, nameSegment, mapValue, foundMap, lastIndex,
        foundI, foundStarMap, starI, i, j, part,
        baseParts = baseName && baseName.split("/"),
        map = config.map,
        starMap = (map && map['*']) || {};

    //Adjust any relative paths.
    if (name && name.charAt(0) === ".") {
        //If have a base name, try to normalize against it,
        //otherwise, assume it is a top-level require that will
        //be relative to baseUrl in the end.
        if (baseName) {
            //Convert baseName to array, and lop off the last part,
            //so that . matches that "directory" and not name of the baseName's
            //module. For instance, baseName of "one/two/three", maps to
            //"one/two/three.js", but we want the directory, "one/two" for
            //this normalization.
            baseParts = baseParts.slice(0, baseParts.length - 1);
            name = name.split('/');
            lastIndex = name.length - 1;

            // Node .js allowance:
            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
            }

            name = baseParts.concat(name);

            //start trimDots
            for (i = 0; i < name.length; i += 1) {
                part = name[i];
                if (part === ".") {
                    name.splice(i, 1);
                    i -= 1;
                } else if (part === "..") {
                    if (i === 1 && (name[2] === '..' || name[0] === '..')) {
                        //End of the line. Keep at least one non-dot
                        //path segment at the front so it can be mapped
                        //correctly to disk. Otherwise, there is likely
                        //no path mapping for a path starting with '..'.
                        //This can still fail, but catches the most reasonable
                        //uses of ..
                        break;
                    } else if (i > 0) {
                        name.splice(i - 1, 2);
                        i -= 2;
                    }
                }
            }
            //end trimDots

            name = name.join("/");
        } else if (name.indexOf('./') === 0) {
            // No baseName, so this is ID is resolved relative
            // to baseUrl, pull off the leading dot.
            name = name.substring(2);
        }
    }

    //Apply map config if available.
    if ((baseParts || starMap) && map) {
        nameParts = name.split('/');

        for (i = nameParts.length; i > 0; i -= 1) {
            nameSegment = nameParts.slice(0, i).join("/");

            if (baseParts) {
                //Find the longest baseName segment match in the config.
                //So, do joins on the biggest to smallest lengths of baseParts.
                for (j = baseParts.length; j > 0; j -= 1) {
                    mapValue = map[baseParts.slice(0, j).join('/')];

                    //baseName segment has  config, find if it has one for
                    //this name.
                    if (mapValue) {
                        mapValue = mapValue[nameSegment];
                        if (mapValue) {
                            //Match, update name to the new value.
                            foundMap = mapValue;
                            foundI = i;
                            break;
                        }
                    }
                }
            }

            if (foundMap) {
                break;
            }

            //Check for a star map match, but just hold on to it,
            //if there is a shorter segment match later in a matching
            //config, then favor over this star map.
            if (!foundStarMap && starMap && starMap[nameSegment]) {
                foundStarMap = starMap[nameSegment];
                starI = i;
            }
        }

        if (!foundMap && foundStarMap) {
            foundMap = foundStarMap;
            foundI = starI;
        }

        if (foundMap) {
            nameParts.splice(0, foundI, foundMap);
            name = nameParts.join('/');
        }
    }

    return name;
}

function makeRequire(relName, forceSync) {
    return function () {
        //A version of a require function that passes a moduleName
        //value for items that may need to
        //look up paths relative to the moduleName
        return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));
    };
}

function makeNormalize(relName) {
    return function (name) {
        return normalize(name, relName);
    };
}

function makeLoad(depName) {
    return function (value) {
        defined[depName] = value;
    };
}

function callDep(name) {
    if (hasProp(waiting, name)) {
        var args = waiting[name];
        delete waiting[name];
        defining[name] = true;
        main.apply(undef, args);
    }

    if (!hasProp(defined, name) && !hasProp(defining, name)) {
        throw new Error('No ' + name);
    }
    return defined[name];
}

//Turns a plugin!resource to [plugin, resource]
//with the plugin being undefined if the name
//did not have a plugin prefix.
function splitPrefix(name) {
    var prefix,
        index = name ? name.indexOf('!') : -1;
    if (index > -1) {
        prefix = name.substring(0, index);
        name = name.substring(index + 1, name.length);
    }
    return [prefix, name];
}

/**
 * Makes a name map, normalizing the name, and using a plugin
 * for normalization if necessary. Grabs a ref to plugin
 * too, as an optimization.
 */
makeMap = function (name, relName) {
    var plugin,
        parts = splitPrefix(name),
        prefix = parts[0];

    name = parts[1];

    if (prefix) {
        prefix = normalize(prefix, relName);
        plugin = callDep(prefix);
    }

    //Normalize according
    if (prefix) {
        if (plugin && plugin.normalize) {
            name = plugin.normalize(name, makeNormalize(relName));
        } else {
            name = normalize(name, relName);
        }
    } else {
        name = normalize(name, relName);
        parts = splitPrefix(name);
        prefix = parts[0];
        name = parts[1];
        if (prefix) {
            plugin = callDep(prefix);
        }
    }

    //Using ridiculous property names for space reasons
    return {
        f: prefix ? prefix + '!' + name : name, //fullName
        n: name,
        pr: prefix,
        p: plugin
    };
};

function makeConfig(name) {
    return function () {
        return (config && config.config && config.config[name]) || {};
    };
}

handlers = {
    require: function (name) {
        return makeRequire(name);
    },
    exports: function (name) {
        var e = defined[name];
        if (typeof e !== 'undefined') {
            return e;
        } else {
            return (defined[name] = {});
        }
    },
    module: function (name) {
        return {
            id: name,
            uri: '',
            exports: defined[name],
            config: makeConfig(name)
        };
    }
};

main = function (name, deps, callback, relName) {
    var cjsModule, depName, ret, map, i,
        args = [],
        callbackType = typeof callback,
        usingExports;

    //Use name if no relName
    relName = relName || name;

    //Call the callback to define the module, if necessary.
    if (callbackType === 'undefined' || callbackType === 'function') {
        //Pull out the defined dependencies and pass the ordered
        //values to the callback.
        //Default to [require, exports, module] if no deps
        deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
        for (i = 0; i < deps.length; i += 1) {
            map = makeMap(deps[i], relName);
            depName = map.f;

            //Fast path CommonJS standard dependencies.
            if (depName === "require") {
                args[i] = handlers.require(name);
            } else if (depName === "exports") {
                //CommonJS module spec 1.1
                args[i] = handlers.exports(name);
                usingExports = true;
            } else if (depName === "module") {
                //CommonJS module spec 1.1
                cjsModule = args[i] = handlers.module(name);
            } else if (hasProp(defined, depName) ||
                       hasProp(waiting, depName) ||
                       hasProp(defining, depName)) {
                args[i] = callDep(depName);
            } else if (map.p) {
                map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
                args[i] = defined[depName];
            } else {
                throw new Error(name + ' missing ' + depName);
            }
        }

        ret = callback ? callback.apply(defined[name], args) : undefined;

        if (name) {
            //If setting exports via "module" is in play,
            //favor that over return value and exports. After that,
            //favor a non-undefined return value over exports use.
            if (cjsModule && cjsModule.exports !== undef &&
                    cjsModule.exports !== defined[name]) {
                defined[name] = cjsModule.exports;
            } else if (ret !== undef || !usingExports) {
                //Use the return value from the function.
                defined[name] = ret;
            }
        }
    } else if (name) {
        //May just be an object definition for the module. Only
        //worry about defining if have a module name.
        defined[name] = callback;
    }
};

requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
    if (typeof deps === "string") {
        if (handlers[deps]) {
            //callback in this case is really relName
            return handlers[deps](callback);
        }
        //Just return the module wanted. In this scenario, the
        //deps arg is the module name, and second arg (if passed)
        //is just the relName.
        //Normalize module name, if it contains . or ..
        return callDep(makeMap(deps, callback).f);
    } else if (!deps.splice) {
        //deps is a config object, not an array.
        config = deps;
        if (config.deps) {
            req(config.deps, config.callback);
        }
        if (!callback) {
            return;
        }

        if (callback.splice) {
            //callback is an array, which means it is a dependency list.
            //Adjust args if there are dependencies
            deps = callback;
            callback = relName;
            relName = null;
        } else {
            deps = undef;
        }
    }

    //Support require(['a'])
    callback = callback || function () {};

    //If relName is a function, it is an errback handler,
    //so remove it.
    if (typeof relName === 'function') {
        relName = forceSync;
        forceSync = alt;
    }

    //Simulate async callback;
    if (forceSync) {
        main(undef, deps, callback, relName);
    } else {
        //Using a non-zero value because of concern for what old browsers
        //do, and latest browsers "upgrade" to 4 if lower value is used:
        //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
        //If want a value immediately, use require('id') instead -- something
        //that works in almond on the global level, but not guaranteed and
        //unlikely to work in other AMD implementations.
        setTimeout(function () {
            main(undef, deps, callback, relName);
        }, 4);
    }

    return req;
};

/**
 * Just drops the config on the floor, but returns req in case
 * the config return value is used.
 */
req.config = function (cfg) {
    return req(cfg);
};

/**
 * Expose module registry for debugging and tooling
 */
requirejs._defined = defined;

define = function (name, deps, callback) {

    //This module may not have dependencies
    if (!deps.splice) {
        //deps is not an array, so probably means
        //an object literal or factory function for
        //the value. Adjust args.
        callback = deps;
        deps = [];
    }

    if (!hasProp(defined, name) && !hasProp(waiting, name)) {
        waiting[name] = [name, deps, callback];
    }
};

define.amd = {
    jQuery: true
};

}());

define(“contrib/almond/almond”, function(){});

define(‘tools’,[], function(){

var Tools = {
    STL: Nyaplot.STL,
    _: Nyaplot._,
    uuid: Nyaplot.uuid,
    Manager: Nyaplot.Manager
};

return Tools;

});

define(‘components/scale’,, function(Tools){

var _ = Tools._;

function scale(domains, ranges, _options){
    var width = Math.abs(ranges.x[1] - ranges.x[0]);
    var height = Math.abs(ranges.y[1] - ranges.y[0]);
    this.offset = {x: 0, y:0};
    this.scale = 1;
    return this;
}

scale.prototype.init = function(projection){
    this.projection = projection;
};

scale.prototype.get = function(longitude, latitude){
    var point = this.projection([longitude, latitude]);
    return {
        x: point[0]*this.scale + this.offset.x,
        y: point[1]*this.scale + this.offset.y
    };
};

scale.prototype.setTranslate = function(x, y){
    this.offset.x = x;
    this.offset.y = y;
};

scale.prototype.setScale = function(scale){
    this.scale = scale;
};

return scale;

});

define(‘components/axis’,, function(Tools){

function Axis(parent, scales, _options){
    var _ = Tools._;
    var Manager = Tools.Manager;

    var options = {
        width:0,
        height:0,
        margin: {top:0,bottom:0,left:0,right:0},
        x_label:'X',
        y_label:'Y',
        zoom:true,
        zoom_range:[0, 500],
        rotate_x_label:0,
        rotate_y_label:0,
        pane_uuid: null,
        z_index:0,
        extra: {}
    };

    var options_extra = {
        df_id: null,
        map_data: null,
        cca3: null,
        fill_by: null,
        color: ["none"],
        text_color: '#fff',
        text_size: '1em',
        stroke_color: '#000',
        no_data_color: 'none',
        center: [13, 35],
        scale: 1000
    };

    if(arguments.length>2){
        _.extend(options, _options);
        _.extend(options_extra, _options.extra);
        options.extra = options_extra;
    }

    var fill_scale = (function(){
        var country_id = _.map(options.extra.map_data.features, function(d){return d.properties.iso_a3;});

        if(_.every(country_id, function(id){return typeof id == "undefined";})){
            return d3.scale.ordinal().range(options.extra.color);
        }

        if(options.extra.fill_by != null){
            var df = Manager.getData(options.extra.df_id);
            var scale = df.scale(options.extra.fill_by, options.extra.color);
            var fill_by_column = df.column(options.extra.fill_by);
            var id_column = df.column(options.extra.cca3);
            return d3.scale.ordinal()
                .domain(country_id)
                .range(_.map(country_id, function(id, i){
                    var pos = id_column.indexOf(id);
                    if(pos != -1)return scale(fill_by_column[pos]);
                    else return options.extra.no_data_color;
                }));
        }else{
            return d3.scale.ordinal()
                .domain(country_id)
                .range(options.extra.color);
        }
    })();

    var model = parent.append("g");
    var clip_id = "clip" + options.pane_uuid;

    model.append("clipPath")
        .attr("id", clip_id)
        .append("rect")
        .attr({
            "x": 0,
            "y": 0,
            "width": options.width,
            "height": options.height
        });

    model
        .attr("clip-path", "url(#" + clip_id + ")")
        .append("g").attr("class", "map")
        .style("z-index", options.z_index);

    var projection = d3.geo.mercator()
            .center(options.extra.center)
            .scale(options.extra.scale);

    scales.init(projection);

    var path = d3.geo.path().projection(projection);

    var graticule = d3.geo.graticule();
    model.select(".map").append("path")
        .datum(graticule)
        .attr({
            "d": path,
            "stroke": "#fff",
            "stroke-width":2
        });

    var map = model.select(".map").selectAll("path")
            .data(options.extra.map_data.features)
            .enter()
            .append('path')
            .attr("d", path)
            .attr("stroke", options.extra.stroke_color)
            .attr("fill", function(d){
                if(typeof d.properties.iso_a3 == "undefined")return options.extra.no_data_color;
                else return fill_scale(d.properties.iso_a3);
            });

   if(options.zoom){
       parent.call(
           d3.behavior.zoom()
               .scaleExtent(options.zoom_range)
               .on("zoom", function(){
                   var translate = d3.event.translate;
                   var scale = d3.event.scale;
                   scales.setTranslate(translate[0], translate[1]);
                   scales.setScale(scale);
                   parent.select(".context_child").attr('transform', 'translate(' + translate + ') scale(' + scale + ')');
                   model.select(".map").attr('transform', 'translate(' + translate + ') scale(' + scale + ')');
               })
       );
   }
}
return Axis;

});

define(‘main’,,function(require, exports, module){

var Bionya = {};
Bionya.Nya = {
    'scale':require('components/scale'),
    'axis':require('components/axis')
};

return Bionya;

});

return require(‘main’); }));