﻿// README
//
// There are two steps to adding a property:
//
// 1. Create a member variable to store your property
// 2. Add the get_ and set_ accessors for your property
//
// Remember that both are case sensitive!


/// <reference name="MicrosoftAjaxTimer.debug.js" />
/// <reference name="MicrosoftAjaxWebForms.debug.js" />
/// <reference name="AjaxControlToolkit.ExtenderBase.BaseScripts.js" assembly="AjaxControlToolkit" />

/// Здесь исполнекоторые интерфейсы
/// используемые в Online
/// Следует помнить, что они обладают той особенностью
/// что если метод интерфейса не исполен Вашим объектом
/// то берется исполнение метода по умолчанию, что указано в интерфейсе
/// поэтому интерфейсы здесь болнапоминают абстрактные классы


Type.registerNamespace('OnLineExt.Common');

// Интерфейс для тех кого нужно перепозицианировать по какой-либо причине.
OnLineExt.Common.IReposition = function() {
}
OnLineExt.Common.IReposition.prototype = {

    // Вычисление и применение новой позиции 
    _reposition: function(handler) {
        throw Error.notImplemented();
    }
}
OnLineExt.Common.IReposition.registerInterface('OnLineExt.Common.IReposition');


// Интерфейс применяется в различных классах 
// с целью поместить фокус на некоторый главный элемент 
// формы, если класс выставил этот инт. значит может это сделать
OnLineExt.Common.ISetFocus = function() {
}
OnLineExt.Common.ISetFocus.prototype = {
    // Помещает фокус на главный элемент страницы
    SetFocus: function() { throw Error.notImplemented(); }
}
OnLineExt.Common.ISetFocus.registerInterface('OnLineExt.Common.ISetFocus');

// Интерфейс применяется в различных классах 
// с целью подписаться на событие нажатия селектирующего chkBox
OnLineExt.Common.IChkClick = function() {
}
OnLineExt.Common.IChkClick.prototype = {
    // Помещает управление на клик
    add_Click: function(handler) {
        throw Error.notImplemented();
    },
    // Удаляет управление на клик
    remove_Click: function(handler) {
        throw Error.notImplemented();
    }
}
OnLineExt.Common.IChkClick.registerInterface('OnLineExt.Common.IChkClick');

// Интерфейс применяется с целью поместить 
// информацию о текущей строке поиска (например на форме поиска)
OnLineExt.Common.ISetDSFinder = function() {
}
OnLineExt.Common.ISetDSFinder.prototype = {

    // Это должно быть ID класса настроек 
    // вызова, дающих весь набор параметров,
    // для повторного вызова набора поиска
    get_DSFinderID: function() {
        throw Error.notImplemented();
    },

    set_DSFinderID: function(value) {
        throw Error.notImplemented();
    }
}
OnLineExt.Common.ISetDSFinder.registerInterface('OnLineExt.Common.ISetDSFinder');

// Интерфейс применяется с целью поместить 
// информацию о текущей строке поиска (например на форме поиска)
OnLineExt.Common.ISetFinder = function() {
}
OnLineExt.Common.ISetFinder.prototype = {
    get_DetailNum: function() {
        throw Error.notImplemented();
    },

    set_DetailNum: function(value) {
        throw Error.notImplemented();
    },

    get_MakeLogo: function() {
        throw Error.notImplemented();
    },

    set_MakeLogo: function(value) {
        throw Error.notImplemented();
    },

    get_PriceLogo: function() {
        throw Error.notImplemented();
    },

    set_PriceLogo: function(value) {
        throw Error.notImplemented();
    },

    get_DestinationLogo: function() {
        throw Error.notImplemented();
    },

    set_DestinationLogo: function(value) {
        throw Error.notImplemented();
    },

    get_DeliveryRegionType: function() {
        throw Error.notImplemented();
    },

    set_DeliveryRegionType: function(value) {
        // Не всем контролам нужен этот параметр.
        //throw Error.notImplemented();
    },

    get_CustomGroupKey: function() {
        throw Error.notImplemented();
    },

    set_CustomGroupKey: function(value) {
        throw Error.notImplemented();
    },

    get_ReplacementGroup: function() {
        // Необходимо обязательно расширить позже
        //throw Error.notImplemented();
    },

    set_ReplacementGroup: function(value) {
        // Необходимо обязательно расширить позже
        //throw Error.notImplemented();
    },

    get_Price: function() {
        throw Error.notImplemented();
    },

    set_Price: function(value) {
        // Помещает текущее значение стоимости детали
        // Нужно когда текущее значение может быть устаревшим
        // Чтобы показать разность цен при помещении в корзину например
        throw Error.notImplemented();
    },

    // Когда все поля заполнены дает сигнал обновления/удаления
    // Если параметр  temporary = true, действие произойдет немедленно для этих данных
    Update: function(temporary) {
        throw Error.notImplemented();
    },

    // Когда все поля заполнены дает сигнал удаления
    Delete: function() {
        throw Error.notImplemented();
    }
}
OnLineExt.Common.ISetFinder.registerInterface('OnLineExt.Common.ISetFinder');


// Интерфейс применяется с целью поместить 
// информацию о GlobalId
OnLineExt.Common.ISetGlobalId = function() {
}
OnLineExt.Common.ISetGlobalId.prototype = {

    get_GlobalID: function() {
        throw Error.notImplemented();
    },

    set_GlobalID: function(value) {
        throw Error.notImplemented();
    },

    del_GlobalID: function(value) {
        throw Error.notImplemented();
    }
}
OnLineExt.Common.ISetGlobalId.registerInterface('OnLineExt.Common.ISetGlobalId');


// Интерфейс применяется с целью запретить/разрешить 
// таймеры страницы
OnLineExt.Common.IDisableTimers = function() {
}
OnLineExt.Common.IDisableTimers.prototype = {

    disableTimers: function(dis) {
        throw Error.notImplemented();
    }

}
OnLineExt.Common.IDisableTimers.registerInterface('OnLineExt.Common.IDisableTimers');


// Интерфейс применяется с целью запретить/разрешить
// некий объект типа кнопки илметки или рисунка, 
// в типе указывается строка , идентифицирующая тип запрета
OnLineExt.Common.IDisable = function() {
}
OnLineExt.Common.IDisable.prototype = {

    disable: function(dis, tp) {
        throw Error.notImplemented();
    }

}
OnLineExt.Common.IDisable.registerInterface('OnLineExt.Common.IDisable');


// Интерфейс применяется с целью поместить
// информацию об аргументе PostBack
// temporary - немедленное выполнение
OnLineExt.Common.IArg = function() {
}
OnLineExt.Common.IArg.prototype = {

    get_Arg: function() {
        throw Error.notImplemented();
    },

    set_Arg: function(value, temporary) {
        throw Error.notImplemented();
    },

    del_Arg: function(value) {
        throw Error.notImplemented();
    }

}
OnLineExt.Common.IArg.registerInterface('OnLineExt.Common.IArg');

// IArg

// Интерфейс применяется с целью поместить 
// информацию о статистике пользователей
OnLineExt.Common.ISetUsersStat = function() {
}
OnLineExt.Common.ISetUsersStat.prototype = {

    get_UsersCount: function() {
        throw Error.notImplemented();
    },

    set_UsersCount: function(value) {
        throw Error.notImplemented();
    }
}
OnLineExt.Common.ISetUsersStat.registerInterface('OnLineExt.Common.ISetUsersStat');


// Интерфейс применяется с целью привязаться к некоторому контролпри позиционировании TB
OnLineExt.Common.IGetTBPosition = function() {
}
OnLineExt.Common.IGetTBPosition.prototype = {

    get_rightPosition: function() {
        throw Error.notImplemented();
    },

    set_rightPosition: function(value) {
        throw Error.notImplemented();
    },

    get_topPosition: function() {
        throw Error.notImplemented();
    },

    set_topPosition: function(value) {
        throw Error.notImplemented();
    },

    get_bottomPosition: function() {
        throw Error.notImplemented();
    },

    set_bottomPosition: function(value) {
        throw Error.notImplemented();
    },


    // Строка идентификатора панели, используется когда
    // несколько гридов на одной странице
    get_FloatPanelMark: function(value) {
        throw Error.notImplemented();
    }
}
OnLineExt.Common.IGetTBPosition.registerInterface('OnLineExt.Common.IGetTBPosition');


// Интерфейс применяется с целью поместить 
// дать сигнал окончания добавления нескольких позиций
OnLineExt.Common.IAddEnded = function() {
}
OnLineExt.Common.IAddEnded.prototype = {

    SetEnd: function() {
        throw Error.notImplemented();
    }
}
OnLineExt.Common.IAddEnded.registerInterface('OnLineExt.Common.IAddEnded');

// Интерфейс применяется с целью выполнить PostBack 
// PostBack - функция Post, в которой ARG придет как myvalue
OnLineExt.Common.IUserPostBack = function() {
}
OnLineExt.Common.IUserPostBack.prototype = {

    RunPostBack: function(PostBack, Arg) {
        throw Error.notImplemented();
    }
}
OnLineExt.Common.IUserPostBack.registerInterface('OnLineExt.Common.IUserPostBack');



////////////////////////////////////////////////////////////////////////////////
///////////////// Всевозможные функции  ////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

// Функции остановки - запуска таймера
function StartTimer() {
    var c = Sys.Application.getComponents();
    for (var i = 0; i < c.length; i++) {
        var tpVar = Object.getType(c[i]);
        if (tpVar.implementsInterface(OnLineExt.Common.IDisableTimers)) {
            c[i].disableTimers(false);
        }
    }
}

function StopTimer() {
    var c = Sys.Application.getComponents();
    for (var i = 0; i < c.length; i++) {
        var tpVar = Object.getType(c[i]);
        if (tpVar.implementsInterface(OnLineExt.Common.IDisableTimers)) {
            c[i].disableTimers(true);
        }
    }
}

// Посылка сигнала обновления панели
function UpdPanelPostTrigger(UpdPanelName) {
    var RM = Sys.WebForms.PageRequestManager.getInstance();
    // При удачном обновлении данных мы обновляем панели
    // Но может быть мы и не найдем нужную панель
    var ups = RM._updatePanelClientIDs;
    var bFinded = false;
    for (var i = 0; i < ups.length; i++) {
        if (ups[i].indexOf(UpdPanelName) >= 0) {
            RM._doPostBack(ups[i], '');
            bFinded = true;
            break;
        }
    }
    return bFinded;
}

// Конвертер , когда нужно преобразовать
// массив строк с разделителем в масссив массивов
function ArgsArray(ForSplit) {
    var arrayArgs = new Array();
    Array.forEach(ForSplit, function(b) {
        var ss = b.split("|");
        Array.add(arrayArgs, ss);
    });
    return arrayArgs;
}




// Поиск по ID(Shablon) либо внутри данного либо само данное
function FindShablon(popup, Shablon) {
    if (popup.id != null && popup.id.indexOf(Shablon) >= 0)
        return popup;
    var nextSibling = popup.firstChild;
    while (nextSibling != null) {
        if (nextSibling.id != null && nextSibling.id.indexOf(Shablon) >= 0)
            return nextSibling;
        var recSibling = FindShablon(nextSibling, Shablon);
        if (recSibling != null)
            return recSibling;
        nextSibling = nextSibling.nextSibling;
    }
    return null;
}

// Прежде чем удалить нужно проверить , можно ли удалить хандлер
function CheckHandler(element, eventName, handler) {
    var e = Function._validateParams(arguments, [
        { name: "element" },
        { name: "eventName", type: String },
        { name: "handler", type: Function }
    ]);
    if (e) throw e;

    //Sys.UI.DomEvent._ensureDomNode(element);

    var browserHandler = null;
    if ((typeof (element._events) !== 'object') || (element._events == null)) return false;
    var cache = element._events[eventName];
    if (!(cache instanceof Array)) throw Error.invalidOperation(Sys.Res.eventHandlerInvalid);
    for (var i = 0, l = cache.length; i < l; i++) {
        if (cache[i].handler === handler) {
            browserHandler = cache[i].browserHandler;
            break;
        }
    }
    if (typeof (browserHandler) !== 'function') return false;
    return true;
}


// Эту функцию необходимо применять
// в случае, когда контрол композитный и 
// содержит маленькие внутренние контролы
// тогда при движении выявляется родительский контрол
// как первый по родителю, имеющий ID , и к нему лепится 
// уже и всплытие на клик, по принципу , что от дочерних
// элементов все равно довсплывет до него
function FindSrcEventID(SrcEventID) {
    var nextParent = SrcEventID;
    while (nextParent.parentNode != null && nextParent.id == "") {
        nextParent = nextParent.parentNode;
    }
    return nextParent;
}


// Эту функцию следует применять, когда надо найти контрол, который
// порождает событие onmouseover, тот , на котором было прописано
// это событие, иначе это может быть кто то из внутренних контролов
function FindSrcEventIDonmouseover(SrcEventID) {
    var nextParent = SrcEventID;
    while (nextParent.parentNode != null && nextParent.onmouseover == null) {
        nextParent = nextParent.parentNode;
    }
    return nextParent;
}


// В данном случае лучше прописать в одном месте
// Некоторый хелпер для получения данных при саllback страницы 
function ReceiveServerData(rValue, context) {
    context.ReceiveServerData(rValue);
}

// Для IE и FF
function IsEnabled(element) {
    return (element.getAttribute('disabled') != true && element.getAttribute('disabled') != 'disabled');
}
function SetEnabled(element) {
    if (element.removeAttribute) {
        element.removeAttribute('disabled');

        // для обновления елемента. глюк оперы.
        if (Sys.Browser.agent == Sys.Browser.Opera) {
            var p = element.style.paddingTop;
            element.style.paddingTop = "1px";
            //element.style.paddingTop = p;
        }
    }
}
function SetDisabled(element) {
    if (element.setAttribute) {
        element.setAttribute('disabled', 'disabled', 1); // for FF comp;
        // для обновления елемента. глюк оперы.
        if (Sys.Browser.agent == Sys.Browser.Opera) {
            var p = element.style.paddingTop;
            element.style.paddingTop = "0px";
            //element.style.paddingTop = p;
        }
    }
}

function IsIE() {
    return (navigator.appName == 'Microsoft Internet Explorer');
}

//////////////////////////////////////////////////////////////////////////////

OnLineExt.Common.IDeclBehavior = function(element) {
    OnLineExt.Common.IDeclBehavior.initializeBase(this, [element]);
}
OnLineExt.Common.IDeclBehavior.prototype = {
    initialize: function() {
        OnLineExt.Common.IDeclBehavior.callBaseMethod(this, 'initialize');
    },

    dispose: function() {
        OnLineExt.Common.IDeclBehavior.callBaseMethod(this, 'dispose');
    }
}
OnLineExt.Common.IDeclBehavior.registerClass('OnLineExt.Common.IDeclBehavior', AjaxControlToolkit.BehaviorBase);
