//----------------------------------------------------------------------
// PCL's Floating Window 1.0.0
// Copyright (C) ManHunter / PCL
// http://www.manhunter.ru
//
// Скрипт успешно протестирован в браузерах:
// - Internet Explorer 5,6,7,8; TheWorld, MyIE2/Maxthon, Avant Browser
// - Opera 7.5+,8,9
// - 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);
  }
}

