//----------------------------------------------------------------------
// PCL's Floating Window 1.0.0
// Copyright (C) ManHunter / PCL
// http://www.manhunter.ru
//
// Скрипт успешно протестирован в браузерах:
// - Internet Explorer 5,6,7,8,9; TheWorld, MyIE2/Maxthon, Avant Browser
// - Opera 7.5+,8,9,10
// - Mozilla Firefox 2,3; K-Meleon
// - Netscape 8,9
// - Google Chrome, Safari, Iron
//----------------------------------------------------------------------

// Глобальные переменные
var PCL_doMoveWindow=0;
var PCL_wX=0;
var PCL_wY=0;
var PCL_mouse_x=0;
var PCL_mouse_y=0;
var PCL_zIndex=Array();
var PCL_cIndex=1;

function PCL_CenterWindow(id) {
    var e=document.getElementById(id);
    if (e) {
        var doc = document.documentElement;
        var body = document.body;

        // Получить размеры видимой области экрана
        if (typeof(window.innerWidth) == 'number') {
            my_width = window.innerWidth;
            my_height = window.innerHeight;
        }
        else if (doc && (doc.clientWidth || doc.clientHeight)) {
            my_width = doc.clientWidth;
            my_height = doc.clientHeight;
        }
        else if (body && (body.clientWidth || body.clientHeight)) {
            my_width = body.clientWidth;
            my_height = body.clientHeight;
        }

        // Относительное смещение по вертикали
        var scrollY = 0;
        if (doc && doc.scrollTop) {
            scrollY = doc.scrollTop;
        }
        else if (body && body.scrollTop) {
            scrollY = body.scrollTop;
        }
        else if (window.pageYOffset) {
            scrollY = window.pageYOffset;
        }
        else if (window.scrollY) {
            scrollY = window.scrollY;
        }

        // Относительное смещение по горизонтали
        var scrollX = 0;
        if (doc && doc.scrollLeft) {
            scrollX = doc.scrollLeft;
        }
        else if (body && body.scrollLeft) {
            scrollX = body.scrollLeft;
        }
        else if (window.pageXOffset) {
            scrollX = window.pageXOffset;
        }
        else if (window.scrollX) {
            scrollX = window.scrollX;
        }

        // Вычислить координаты центра экрана
        var setX=(my_width-e.offsetWidth)/2+scrollX;
        var setY=(my_height-e.offsetHeight)/2+scrollY;

        setX=(setX<0)?0:setX;
        setY=(setY<0)?0:setY;

        // Установить окно по центру экрана
        e.style.left=setX+"px";
        e.style.top=setY+"px";
    }
}

function PCL_MoveWindowProc(e) {
    // Получить событие
    var e = e ? e : window.event;

    var doc = document.documentElement;
    var body = document.body;

    // Получить текущие координаты мыши
    // Используется короткий метод определения IE от Gareth Heyes
    if ("\v" == "v") {
        PCL_mouse_x = e.clientX;
        if (doc.clientLeft) { PCL_mouse_x -= doc.clientLeft; }
        if (doc && doc.scrollLeft) { PCL_mouse_x += doc.scrollLeft; }
        if (body && body.scrollLeft) { PCL_mouse_x += body.scrollLeft; }
        PCL_mouse_y = e.clientY;
        if (doc.clientTop) { PCL_mouse_y -=doc.clientTop; }
        if (doc && doc.scrollTop) { PCL_mouse_y += doc.scrollTop; }
        if (body && body.scrollTop) { PCL_mouse_y += body.scrollTop; }
    }
    else {
        PCL_mouse_x=e.pageX;
        PCL_mouse_y=e.pageY;
    }

    if (PCL_doMoveWindow!=0) {
        var w=document.getElementById(PCL_doMoveWindow);

        if (w) {
            PCL_mouse_x;
            PCL_mouse_y;

            // Установить новые координаты окна
            w.style.left=(PCL_mouse_x-PCL_wX)+'px';
            w.style.top=(PCL_mouse_y-PCL_wY)+'px';
            // Убирает неприятное мерцание в Opera
            w.style.visibility = 'visible';

            if (e.stopPropagation) {
                e.stopPropagation();
            }
            if (e.preventDefault) {
                e.preventDefault();
            }
            e.cancelBubble = true;
            e.cancel = true;
            e.returnValue = false;

            return false;
        }
    }
}

// Перемещение окна наверх
function PCL_SetZIndex(id) {
    var found=false;
    for (var i=0; i<PCL_zIndex.length; i++) {
        if (PCL_zIndex[i]==id) {
            PCL_zIndex[i]=Array(id, 9999);
            found=true;
        }
    }
    // Если такого окна еще нет, то добавить в список
    if (!found) { PCL_zIndex[i]=new Array(id, 9999); }

    // Сортировка массива пузырьком
    for (i=0; i<PCL_zIndex.length; i++) {
        for (j=i; j<PCL_zIndex.length; j++) {
            if (PCL_zIndex[i][1]<PCL_zIndex[j][1]) {
                var tmp=PCL_zIndex[i][1];
                PCL_zIndex[i][1]=PCL_zIndex[j][1];
                PCL_zIndex[j][1]=tmp;
            }
        }
    }

    // Установка положения окон
    for (i=0; i<PCL_zIndex.length; i++) {
        PCL_zIndex[i][1]=i;
        var ee=document.getElementById(PCL_zIndex[i][0]);
        if (ee) {
            ee.style.zIndex=99+i;
        }
    }
}

// Начало перетаскивания окна
function PCL_StartDrag(id) {
    var e=document.getElementById(id);
    if (e) {
        e.style.position='absolute';
        e.style.cursor='move';

        PCL_SetZIndex(id);

        PCL_doMoveWindow=id;
        var offsetLeft=0;
        var offsetTop=0;
        do {
            offsetLeft+=e.offsetLeft;
            offsetTop+=e.offsetTop;
        } while (e=e.offsetParent);

        PCL_wX=PCL_mouse_x-offsetLeft;
        PCL_wY=PCL_mouse_y-offsetTop;
    }
}

// Конец перетаскивания окна
function PCL_StopDrag(e) {
    var e=document.getElementById(PCL_doMoveWindow);
    if (e) {
        e.style.cursor='';
    }
    PCL_doMoveWindow=0;
}

// Скрыть окно
function PCL_CloseWindow(id) {
    var e=document.getElementById(id);
    if (e) {
        e.style.visibility='hidden';
        PCL_doMoveWindow=0;
    }
}

// Показать окно
function PCL_ShowWindow(id) {
    var e=document.getElementById(id);
    if (e) {
        e.style.visibility='visible';
        PCL_doMoveWindow=0;
    }
}

// Инициализация скрипта
function PCL_InitFloatWindow() {
    // Установить обработчик перемещения мыши
    var element = document.getElementsByTagName('html')[0];

    if (element.addEventListener) {
        element.addEventListener("mousemove", PCL_MoveWindowProc, false);
        element.addEventListener("onmouseup", PCL_StopDrag, false);
    }
    else {
        element.attachEvent("onmousemove", PCL_MoveWindowProc);
        element.attachEvent("onmouseup", PCL_StopDrag);
    }
}
