/**
 * noscrpt
 * @namespace
 */
var no = {};

// ----------------------------------------------------------------------------------------------------------------- //

no.inherits = function(ctor, base, mixin) {
    var F = function() {};
    F.prototype = base.prototype;
    var proto = ctor.prototype = new F();
    ctor.prototype.constructor = ctor;

    if (mixin) {
        no.extend(proto, mixin);
    }

    return ctor;
};

// ----------------------------------------------------------------------------------------------------------------- //

/**
    @param {!Object} dest
    @param {...!Object} srcs
    @return {!Object}
*/
no.extend = function(dest) {
    var srcs = [].slice.call(arguments, 1);

    for (var i = 0, l = srcs.length; i < l; i++) {
        var src = srcs[i];
        for (var key in src) {
            dest[key] = src[key];
        }
    }

    return dest;
};

// ----------------------------------------------------------------------------------------------------------------- //

/**
    Do not clone functions, only data.
    @param {!Object} dest
    @param {!Object} src
    @return {!Object}
*/
no.extendRecursive = function(dest, src) {
    for (var key in src) {
        var value = src[key];

        if (value instanceof Array) {
            var ar = dest[key] = [];
            for (var j = 0, m = value.length; j < m; j++) {
                var item = value[j];
                ar[j] = (typeof item === 'object') ? no.extendRecursive( {}, item ) : item;
            }

        } else if (typeof value === 'object') {
            dest[key] = no.extendRecursive( {}, value );

        } else {
            dest[key] = value;

        }
    }

    return dest;
};

// ----------------------------------------------------------------------------------------------------------------- //

/**
    Пустая функция. No operation.
*/
no.pe = function() {};

// ----------------------------------------------------------------------------------------------------------------- //

/**
    @param {string} className
    @param {Element} context
    @return {(Element|undefined)}
*/
//  FIXME: Мне не нравится использовать jQuery в noscript'е,
//  со временем я хочу выпилить jQuery совсем.
//  Пока что вот так странно.
if ((typeof document !== 'undefined') && document.getElementsByClassName) {

    no.byClass = function(className, context) {
        context = context || document;
        return context.getElementsByClassName(className);
    };

} else {

    no.byClass = function(className, context) {
        context = context || document;
        return $(context).find('.' + className);
    };

}

// ----------------------------------------------------------------------------------------------------------------- //

/**
    @param {Element} oldNode
    @param {Element} newNode
*/
no.replaceNode = function(oldNode, newNode) {
    oldNode.parentNode.replaceChild(newNode, oldNode);
};

// ----------------------------------------------------------------------------------------------------------------- //

no.todo = function() {
    throw new Error('Unimplemented');
};

no.html2node = function(html) {
    var div = document.createElement('div');
    div.innerHTML = html;

    return div.firstChild;
};

no.parseQuery = function(s) {
    var o = {};

    s.split('&').forEach(function(s) {
        var p = s.split('=');
        //  FIXME: decode-бла-бла.
        o[ p[0] ] = p[1];
    });

    return o;
};

/**
 *
 * @param mode
 * @param json
 * @param v
 */
no.tmpl = function(json, mode, v) {
    no.todo();
};

/**
 * Производит первоначальную инициализацию noscript.
 */
no.init = function() {
    no.action.init();
    no.router.init();

    no.initMainView();
};

/**
 * Инициализирует корневой View.
 */
no.initMainView = function() {
    var mainView = no.View.create('app');
    mainView.node = document.getElementById('app');

    /**
     * Корневой View.
     * @type {no.View}
     */
    no.MAIN_VIEW = mainView;
};

//  ---------------------------------------------------------------------------------------------------------------  //

if (typeof window === 'undefined') {
    module.exports = no;
}

//  ---------------------------------------------------------------------------------------------------------------  //


@@ -3976,127 +3976,400 @@
 %7D;%0A%0A
-//  ---------------------------------------------------------------------------------------------------------------  //
+no._ENTITIFY_REGEXP = /%5B%3C%3E%22%5D/g;%0A%0A/**%0A * %D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%83%D0%B5%D1%82 %D1%81%D0%BF%D0%B5%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5 %D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D1%8B %D0%B2 HTML %D1%81%D1%83%D1%89%D0%BD%D0%BE%D1%81%D1%82%D0%B8.%0A * @param %7BString%7D s %D0%A1%D1%82%D1%80%D0%BE%D0%BA%D0%B0%0A * @see http://jsperf.com/entityify-test%0A */%0Ano.entityify = function(s) %7B%0A    s = String(s);%0A    var chars = %7B%0A        '%3C' : '&lt;',%0A        '%3E' : '&gt;',%0A        '%22' : '&quot;'%0A    %7D;%0A    return s.replace(no._ENTITIFY_REGEXP, function(c)%7B%0A        return chars%5Bc%5D;%0A    %7D);%0A%7D;
 %0A%0Aif

no.entityify