/**
 *$Id: framework_init.js 109 2009-02-12 15:33:21Z aanpilogov $
 *
 * Внедрение фреймворка и расширение системных прототипов
 */

/*
* Расширение pf глобальными методами и глобализация, если в конфиге так написано
*/
(function(){
for (var p in PuskFramework.globals)
{
    if ((typeof PuskFramework.globals[p] == 'function') && p.charAt(0) == '$')
    {
        if (PuskFramework._cfg.globals) window[p] = PuskFramework.globals[p];
        PuskFramework[p] = PuskFramework.globals[p];
    }
}
})();
/**
 * Конструктор адаптеров
 *
 * @param {Object} func функция
 * @param {Object} source прототип
 * @return {Function}
 */
PuskFramework._protoFactory = function(func, source)
{
    return function()
    {
        var args = [];
        for (var i = 0; i<arguments.length; i++)
            args.push(arguments[i]);
        args.unshift(this);
        return source[func].apply(this, args);
    }
};

/**
 * Прототипизация встроенных в фреймворк функций
 *
 * @param {Object} destination прототип
 * @param {Object} source расширение
 */
PuskFramework.prototypize = function(destination, source)
{
    for(var func in source)
    {
        if (!destination.prototype[func])
        {
            destination.prototype[func] = PuskFramework._protoFactory(func, source);
        }
    }
};

if (PuskFramework._cfg.extendArray)  { PuskFramework.prototypize(Array,  PuskFramework.arr); }
if (PuskFramework._cfg.extendString) { PuskFramework.prototypize(String, PuskFramework.str); }
if (PuskFramework._cfg.extendDate)   { PuskFramework.prototypize(Date,   PuskFramework.date); }

if (PuskFramework._cfg.namespace) 
{
    window[PuskFramework._cfg.namespace] = PuskFramework; 
} 
/*if (PuskFramework._cfg.globals))
{
    PuskFramework.globals.$extend(window, PuskFramework);
}*/

/*
 * Support for the DOMContentLoaded event in IE.
 * Based on work by Dean Edwards.
 * Usage: pf.evt.add(document, 'dataavailable', myHandler)
 */
(function(){
if (/*@cc_on!@*/false)
{
    fireContentLoadedEvent = function()
    {
        var event = document.createEventObject();
        event.eventType = 'ondataavailable';
        event.eventName = 'dataavailable';
        document.fireEvent(event.eventType, event);    
    };
    
    if (window == window.top)
    {
        document.write("<script id=__pfOnDOMContentLoaded defer src=javascript:void(0)><\/script>");
        var scr = PuskFramework.$("__pfOnDOMContentLoaded");
        if (scr) scr.onreadystatechange = function()
        {
            if (this.readyState == 'complete')
            {
                this.onreadystatechange = null;
                fireContentLoadedEvent();
            }
        };
    } else {
        window.attachEvent('onload', fireContentLoadedEvent);
    }
}
})();


PuskFramework.init = function()
{
    var listener = null;
    while(listener = PuskFramework._initListeners.shift()) { listener(); }
}
PuskFramework.evt.add(document, 'dataavailable', PuskFramework.init);

PuskFramework._initListeners.push(function()
{
    PuskFramework._scriptContainer = PuskFramework.$$$('DIV', {'id':'puskScriptContainer'}, {'display':'none'});
    document.body.insertBefore(PuskFramework._scriptContainer, document.body.firstChild);
});
