/************************************************************************************************************
(C) www.dhtmlgoodies.com, January 2006

This is a script from www.dhtmlgoodies.com. You will find this and a lot of other scripts at our website.

Version:        1.0        : January 16th - 2006
1.1 : January 31th - 2006 - Added cookie support - remember rss sources
1.2 : July 13th - 2006 - Fixed a problem in the createRSSBoxesFromCookie function

Terms of use:
You are free to use this script as long as the copyright message is kept intact. However, you may not
redistribute, sell or repost it without our permission.

Thank you!

www.dhtmlgoodies.com
Alf Magne Kalleland

************************************************************************************************************/

/* USER VARIABLES */

var numberOfColumns = 2;        // Number of columns for dragable boxes
var columnParentBoxId = 'floatingBoxParentContainer';        // Id of box that is parent of all your dragable boxes
var src_rightImage = 'images/arrow_right.gif';
var src_downImage = 'images/arrow_down.gif';
var src_refreshSource = 'images/refresh.gif';
var src_smallRightArrow = 'images/small_arrow.gif';

var transparencyWhenDragging = false;
var txt_editLink = 'Edit';
var txt_editLink_stop = 'End edit';
var autoScrollSpeed = 4;        // Autoscroll speed        - Higher = faster
var dragObjectBorderWidth = 1;        // Border size of your RSS boxes - used to determine width of dotted rectangle
var useCookiesToRememberRSSSources = false;
var callPageToRememberBoxesSortOrder = "memorise_positions.php";
var nameOfCookie = 'dragable_rss_boxes';        // Name of cookie

//var globalSessionId = 'undefined';

/* END USER VARIABLES */


var columnParentBox;
var dragableBoxesObj;

var ajaxObjects = new Array();

var boxIndex = 0;
var autoScrollActive = false;
var dragableBoxesArray = new Array();

var dragDropCounter = -1;
var dragObject = false;
var dragObjectNextSibling = false;
var dragObjectParent = false;
var destinationObj = false;

var mouse_x;
var mouse_y;

var el_x;
var el_y;

var rectangleDiv;
var okToMove = true;

var documentHeight = false;
var documentScrollHeight = false;
var dragableAreaWidth = false;

var opera = navigator.userAgent.toLowerCase().indexOf('opera')>=0?true:false;
var cookieCounter=0;
var cookieRSSSources = new Array();

var staticObjectArray = new Array();


function getScrollTop()
{
        return document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop;
}

function autoScroll(direction,yPos)
{
        if(document.documentElement.scrollHeight>documentScrollHeight && direction>0)return;
        if(opera)return;
        window.scrollBy(0,direction);
        if(!dragObject)return;

        if(direction<0){
                if(getScrollTop()>0){
                        dragObject.style.top = (el_y - mouse_y + yPos + getScrollTop() - 12) + 'px';
                }else{
                        autoScrollActive = false;
                }
        }else{
                if(yPos>(documentHeight-50)){
                        dragObject.style.top = (el_y - mouse_y + yPos + getScrollTop() - 12) + 'px';
                }else{
                        autoScrollActive = false;
                }
        }
        if(autoScrollActive)setTimeout('autoScroll('+direction+',' + yPos + ')',5);
}

function initDragDropBox(e)
{


        dragDropCounter = 1;
        if(document.all)e = event;

        if (e.target) source = e.target;
        else if (e.srcElement) source = e.srcElement;
        if (source.nodeType == 3) // defeat Safari bug
        source = source.parentNode;

        if(source.tagName.toLowerCase()=='img' || source.tagName.toLowerCase()=='a' || source.tagName.toLowerCase()=='input' || source.tagName.toLowerCase()=='td' || source.tagName.toLowerCase()=='tr' || source.tagName.toLowerCase()=='table')return;


        mouse_x = e.clientX;
        mouse_y = e.clientY;
        var numericId = this.id.replace(/[^0-9]/g,'');
        el_x = getLeftPos(this.parentNode.parentNode)/1;
        el_y = getTopPos(this.parentNode.parentNode)/1 - getScrollTop();

        //dragObject = this.parentNode.parentNode;
        dragObject = this.parentNode;
        while (dragObject && dragObject.id.substr(0, 11) != "dragableBox") {
                dragObject = dragObject.parentNode;
        }

        documentScrollHeight = document.documentElement.scrollHeight + 100 + dragObject.offsetHeight;


        if(dragObject.nextSibling){
                dragObjectNextSibling = dragObject.nextSibling;
                if(dragObjectNextSibling.tagName!='DIV')dragObjectNextSibling = dragObjectNextSibling.nextSibling;
        }
        dragObjectParent = dragableBoxesArray[numericId]['parentObj'];

        dragDropCounter = 0;
        initDragDropBoxTimer();

        return false;
}


function initDragDropBoxTimer()
{
        if(dragDropCounter>=0 && dragDropCounter<10){
                dragDropCounter++;
                setTimeout('initDragDropBoxTimer()',10);
                return;
        }
        if(dragDropCounter==10){
                mouseoutBoxHeader(false,dragObject);
        }

}

function moveDragableElement(e){
        if(document.all)e = event;
        if(dragDropCounter<10)return;

        if(document.all && e.button!=1 && !opera){
                stop_dragDropElement();
                return;
        }

        if(document.body!=dragObject.parentNode){
                dragObject.style.width = (dragObject.offsetWidth - (dragObjectBorderWidth*2)) + 'px';
                dragObject.style.position = 'absolute';
                dragObject.style.textAlign = 'left';
                if(transparencyWhenDragging){
                        dragObject.style.filter = 'alpha(opacity=70)';
                        dragObject.style.opacity = '0.7';
                }
                dragObject.parentNode.insertBefore(rectangleDiv,dragObject);
                rectangleDiv.style.display='block';
                document.body.appendChild(dragObject);

                rectangleDiv.style.width = dragObject.style.width;
                rectangleDiv.style.height = (dragObject.offsetHeight - (dragObjectBorderWidth*2)) + 'px';

        }

        if(e.clientY<50 || e.clientY>(documentHeight-50)){
                if(e.clientY<50 && !autoScrollActive){
                        autoScrollActive = true;
                        autoScroll((autoScrollSpeed*-1),e.clientY);
                }

                if(e.clientY>(documentHeight-50) && document.documentElement.scrollHeight<=documentScrollHeight && !autoScrollActive){
                        autoScrollActive = true;
                        autoScroll(autoScrollSpeed,e.clientY);
                }
        }else{
                autoScrollActive = false;
        }


        var leftPos = e.clientX;
        var topPos = e.clientY + getScrollTop();

        dragObject.style.left = (e.clientX - mouse_x + el_x) + 'px';
        dragObject.style.top = (el_y - mouse_y + e.clientY + getScrollTop() - 12) + 'px';



        if(!okToMove)return;
        okToMove = false;

        destinationObj = false;
        rectangleDiv.style.display = 'none';

        var objFound = false;
        var tmpParentArray = new Array();

        if(!objFound){
                for(var no=1;no<dragableBoxesArray.length;no++){
                        if(dragableBoxesArray[no]['obj']==dragObject)continue;
                        tmpParentArray[dragableBoxesArray[no]['obj'].parentNode.id] = true;
                        if(!objFound){
                                var tmpX = getLeftPos(dragableBoxesArray[no]['obj']);
                                var tmpY = getTopPos(dragableBoxesArray[no]['obj']);

                                if(leftPos>tmpX && leftPos<(tmpX + dragableBoxesArray[no]['obj'].offsetWidth) && topPos>(tmpY-20) && topPos<(tmpY + (dragableBoxesArray[no]['obj'].offsetHeight/2))){
                                        destinationObj = dragableBoxesArray[no]['obj'];
                                        destinationObj.parentNode.insertBefore(rectangleDiv,dragableBoxesArray[no]['obj']);
                                        rectangleDiv.style.display = 'block';
                                        objFound = true;
                                        break;

                                }

                                if(leftPos>tmpX && leftPos<(tmpX + dragableBoxesArray[no]['obj'].offsetWidth) && topPos>=(tmpY + (dragableBoxesArray[no]['obj'].offsetHeight/2)) && topPos<(tmpY + dragableBoxesArray[no]['obj'].offsetHeight)){
                                        objFound = true;
                                        if(dragableBoxesArray[no]['obj'].nextSibling){

                                                destinationObj = dragableBoxesArray[no]['obj'].nextSibling;
                                                if(!destinationObj.tagName)destinationObj = destinationObj.nextSibling;
                                                if(destinationObj!=rectangleDiv)destinationObj.parentNode.insertBefore(rectangleDiv,destinationObj);
                                        }else{
                                                destinationObj = dragableBoxesArray[no]['obj'].parentNode;
                                                dragableBoxesArray[no]['obj'].parentNode.appendChild(rectangleDiv);
                                        }
                                        rectangleDiv.style.display = 'block';
                                        break;
                                }


                                if(!dragableBoxesArray[no]['obj'].nextSibling && leftPos>tmpX && leftPos<(tmpX + dragableBoxesArray[no]['obj'].offsetWidth)
                                && topPos>topPos>(tmpY + (dragableBoxesArray[no]['obj'].offsetHeight))){
                                        destinationObj = dragableBoxesArray[no]['obj'].parentNode;
                                        dragableBoxesArray[no]['obj'].parentNode.appendChild(rectangleDiv);
                                        rectangleDiv.style.display = 'block';
                                        objFound = true;

                                }
                        }

                }

        }

        if(!objFound){

                for(var no=1;no<=numberOfColumns;no++){
                        if(!objFound){
                                var obj = document.getElementById('dragableBoxesColumn' + no);

                                var left = getLeftPos(obj)/1;
                                var top = getTopPos(obj)/1;
                                var width = obj.offsetWidth;
                                if(leftPos>left && leftPos<(left+width)){
                                        if (!objFound) {
                                                destinationObj = obj;
                                                if (topPos>top || !obj.firstChild) {
                                                        obj.appendChild(rectangleDiv);
                                                } else {
                                                        obj.insertBefore(rectangleDiv,obj.firstChild);
                                                }
                                                rectangleDiv.style.display='block';
                                                objFound=true;
                                        }

                                }

                        }
                }

        }


        setTimeout('okToMove=true',5);

}

function stop_dragDropElement()
{

        if(dragDropCounter<10){
                dragDropCounter = -1
                return;
        }
        dragDropCounter = -1;
        if(transparencyWhenDragging){
                dragObject.style.filter = null;
                dragObject.style.opacity = null;
        }
        dragObject.style.position = 'static';
        dragObject.style.width = null;
        var numericId = dragObject.id.replace(/[^0-9]/g,'');
        if(destinationObj && destinationObj.id!=dragObject.id){

                if(destinationObj.id.indexOf('dragableBoxesColumn')>=0){
                        destinationObj.appendChild(dragObject);
                        dragableBoxesArray[numericId]['parentObj'] = destinationObj;
                }else{
                        destinationObj.parentNode.insertBefore(dragObject,destinationObj);
                        dragableBoxesArray[numericId]['parentObj'] = destinationObj.parentNode;
                }



        }else{
                if(dragObjectNextSibling){
                        dragObjectParent.insertBefore(dragObject,dragObjectNextSibling);
                }else{
                        dragObjectParent.appendChild(dragObject);
                }


        }

        autoScrollActive = false;
        rectangleDiv.style.display = 'none';
        dragObject = false;
        dragObjectNextSibling = false;
        destinationObj = false;

        documentHeight = document.documentElement.clientHeight;

        if (callPageToRememberBoxesSortOrder) {
                setTimeout("rememberBoxesSortOrder()", 100);
        }

}

function rememberBoxesSortOrder()
{
        var sort_order = ""; // ordre de tri
        // pour chaque colonne
        var boxIndex = 1;
        var div;
        while (div = document.getElementById("dragableBoxesColumn" + boxIndex)) {
                sort_order = sort_order + "&sort_order[" + boxIndex + "]=";
                var sort_order_2 = "";
                var div2;
                div2 = div.firstChild;
                while (div2) {
                        if (div2.id.substr(0, 11) == "dragableBox") {
                                sort_order_2 = sort_order_2 + "," + div2.id.substr(11, 5);
                        }
                        div2 = div2.nextSibling;
                }
                sort_order = sort_order + sort_order_2.substr(1, 200);
                boxIndex ++;
        }
        sort_order = sort_order.substr(1, 1000);
        // appel ajax avec l'ordre de tri
        ajaxIndex = ajaxObjects.length;
        ajaxObjects[ajaxIndex] = new sack();
        ajaxObjects[ajaxIndex].requestFile = callPageToRememberBoxesSortOrder + "?" + sort_order;
        ajaxObjects[ajaxIndex].runAJAX();

}


function getTopPos(inputObj)
{
        var returnValue = inputObj.offsetTop;
        while((inputObj = inputObj.offsetParent) != null){
                if(inputObj.tagName!='HTML')returnValue += inputObj.offsetTop;
        }
        return returnValue;
}

function getLeftPos(inputObj)
{
        var returnValue = inputObj.offsetLeft;
        while((inputObj = inputObj.offsetParent) != null){
                if(inputObj.tagName!='HTML')returnValue += inputObj.offsetLeft;
        }
        return returnValue;
}



function mouseoverBoxHeader()
{
        if(dragDropCounter==10)return;
        var id = this.id.replace(/[^0-9]/g,'');
        //document.getElementById('dragableBoxExpand' + id).style.visibility = 'visible';
        //document.getElementById('dragableBoxRefreshSource' + id).style.visibility = 'visible';
        //document.getElementById('dragableBoxCloseLink' + id).style.visibility = 'visible';
        //if(document.getElementById('dragableBoxEditLink' + id))document.getElementById('dragableBoxEditLink' + id).style.visibility = 'visible';

}
function mouseoutBoxHeader(e,obj)
{
        if(!obj)obj=this;
        var id = obj.id.replace(/[^0-9]/g,'');
        //document.getElementById('dragableBoxExpand' + id).style.visibility = 'hidden';
        //document.getElementById('dragableBoxRefreshSource' + id).style.visibility = 'hidden';
        //document.getElementById('dragableBoxCloseLink' + id).style.visibility = 'hidden';
        //if(document.getElementById('dragableBoxEditLink' + id))document.getElementById('dragableBoxEditLink' + id).style.visibility = 'hidden';

}



function createHelpObjects()
{
        /* Creating rectangle div */
        rectangleDiv = document.createElement('DIV');
        rectangleDiv.id='rectangleDiv';
        rectangleDiv.style.display='none';
        document.body.appendChild(rectangleDiv);


}

function cancelSelectionEvent(e)
{
        if(document.all)e = event;

        if (e.target) source = e.target;
        else if (e.srcElement) source = e.srcElement;
        if (source.nodeType == 3) // defeat Safari bug
        source = source.parentNode;
        if(source.tagName.toLowerCase()=='input')return true;

        if(dragDropCounter>=0)return false; else return true;

}

function cancelEvent()
{
        return false;
}

function initEvents()
{
        document.body.onmousemove = moveDragableElement;
        document.body.onmouseup = stop_dragDropElement;
        document.body.onselectstart = cancelSelectionEvent;

        document.body.ondragstart = cancelEvent;

        documentHeight = document.documentElement.clientHeight;

}

//-------------------------------------------------------------------- function createExistingBoxes
function createExistingBoxes()
{
        var boxIndex = 1;
        var div;
        while (div = document.getElementById("dragableBoxesColumn" + boxIndex)) {
                //var clearObj = document.createElement("HR");
                //clearObj.style.clear = "both";
                //clearObj.style.visibility = "hidden";
                //div.insertBefore(clearObj, div.firstChild);
                boxIndex ++;
        }
        numberOfColumns = boxIndex - 1;
        boxIndex = 1;
        while (div = document.getElementById('dragableBoxHeader' + boxIndex)) {
                // events
                div.onmouseover = mouseoverBoxHeader;
                div.onmouseout  = mouseoutBoxHeader;
                div.onmousedown = initDragDropBox;
                // refer dragable box
                var maindiv = document.getElementById('dragableBox' + boxIndex);
                var uniqueIdentifier = 'dragableBox' + boxIndex;
                dragableBoxesArray[boxIndex] = new Array();
                dragableBoxesArray[boxIndex]['obj'] = maindiv;
                dragableBoxesArray[boxIndex]['parentObj'] = maindiv.parentNode;
                dragableBoxesArray[boxIndex]['uniqueIdentifier'] = uniqueIdentifier;
                dragableBoxesArray[boxIndex]['heightOfBox'] = maindiv.style.height;
                dragableBoxesArray[boxIndex]['boxState'] = 1;
                staticObjectArray[uniqueIdentifier] = boxIndex;
                // next box
                boxIndex ++;
        }
}

//function initDragableBoxesScript(sessionid)
function initDragableBoxesScript()
{
        createHelpObjects();   // Always the second line of this function
        initEvents();          // Always the third line of this function
        createExistingBoxes();
}


window.onload = initDragableBoxesScript;
