
var elem = function(elem_id){
    var e = document.getElementById(elem_id);
    if( e ){
        return e;
    }else{
        return document;
    }
}

var toggle = function(elem, showelem){
	if( typeof(showelem) != 'undefined' ){
		if( showelem ){
			show(elem);
		}else{
			hide(elem);
		}
	}else{
		if( elem && elem.style && elem.style.display == 'none' ){
			show(elem);
		}else{
			hide(elem);
		}
    }
}

var show = function(elem){
	elem.style.display='';
	elem.style.visibility='visible';
}

var hide = function(elem){
	elem.style.display='none';
	elem.style.visibility='hidden';
}

/**
##########################################
##########################################
##########################################
These Methods are utility methods to be
used by the other methods
*/

/**
 * Searches up the DOM tree from the starting point
 * and checks each node for the specified css class.
 * returns either the first element it finds with the
 * specified class, or null
 */
var findParentWithClass = function(startObj, cssClass){
    var foundObj = null;
    var tmParent = startObj;
    var maxDepth = 50;
    var count = 0;
    while( foundObj == null && tmParent.parentNode && count<maxDepth ){
        if( hasCssClass( tmParent.parentNode, cssClass ) ){
           foundObj = tmParent.parentNode; 
        }
        count++;
    }
    return foundObj;
};

/**
 * Returns true of the passed element has the passed css class
 * false otherwise
 */
var hasCssClass = function( elem, cssClass ){
    var hasClass = false;
    if( elem && elem.className ){
        var cssArr = elem.className.split(' ');
        for( var c=0; c<cssArr.length; c++ ){
            if( hasClass == false && cssArr[c] == cssClass ){
               hasClass = true;
            }
        }
    }
    return hasClass;
};

/**
 * Finds and returns the list of dom
 * objects that match the nodename and 
 * cssName passed
 */
var getElements = function(enodeName, ecssClass, startingPoint){
    var elems = new Array();
    var domObjArray;
    if( startingPoint && startingPoint.getElementsByTagName ){
        domObjArray = startingPoint.getElementsByTagName(enodeName.toUpperCase());
    }else{
        domObjArray = document.getElementsByTagName(enodeName.toUpperCase());
    }
    if( ecssClass ){
        for( var i=0; i<domObjArray.length; i++ ){
            var classes = domObjArray[i].className.split(' ');
            for( var c=0; c<classes.length; c++ ){
                if( classes[c] == ecssClass ){
                    elems.push(domObjArray[i]);
                }
            }
        }
    }else{
        elems = domObjArray;
    }
    return elems;
};

/**
 * Adds the passed css class to the passed
 * css element's list of affected css
 * classes
 */
var addCssClass = function(elem, cssClass){
    if( elem ){
        if( elem.className ){
            if( elem.className.indexOf(cssClass) == -1 ){
                elem.className = elem.className + ' ' + cssClass;
            }
        }else{
            elem.className = cssClass;
        }
    }
};

/**
 * Removes the passed css class from the
 * passed css element's list of affected
 * css classes
 */
var removeCssClass = function(elem, cssClass){
    if( elem ){
        if( elem.className ){
            if( elem.className.indexOf(cssClass) != -1 ){
                var newClassName = '';
                var classes = elem.className.split(' ');
                for(var i=0; i<classes.length; i++){
                    if( classes[i] != cssClass ){
                        newClassName = newClassName+' '+classes[i];
                    }
                }
                elem.className = newClassName;
            }
        }
    }
};

var isFF = (navigator.userAgent.indexOf("Firefox") != -1);

function getX(elemObj){
    var x = elemObj.offsetLeft;
    while(elemObj.offsetParent){
       x += elemObj.offsetParent.offsetLeft;
       elemObj = elemObj.offsetParent;
    }
    return x;
}

function getY(elemObj){
    var y = elemObj.offsetTop;
    while(elemObj.offsetParent){
       y += elemObj.offsetParent.offsetTop;
       elemObj = elemObj.offsetParent;
    }
    return y;
}

function setObjPosition(elemObj, rcX, rcY){
	if( elemObj.style ){
		elemObj.style.top = rcY;
		elemObj.style.left= rcX; 
	}
}

function getPosition(e) {
    if (!e) var e = window.event;
    var lnx = 0;
    var lny = 0;
    if (e.pageX || e.pageY) {
        lnx = e.pageX;
        lny = e.pageY;
    } else {
        var rel = document.documentElement;
        if(!rel){ 
            rel = document.body;
        }else if(rel.clientLeft || rel.clientTop){
            lnx -= rel.clientLeft;
            lny -= rel.clientTop;
        }
        lnx += e.clientX + rel.scrollLeft;
        lny += e.clientY + rel.scrollTop;
    }
    var pos = new Array(lnx,lny);
    return pos;
}

function findNodeDown(startPoint, tagName){
    var findElem = null;
    if( typeof(startPoint) != 'undefined' ){
        if( !tagName ){
            tagName = "BODY";
        }
        if( typeof(startPoint) != 'undefined' && typeof(startPoint.childNodes) != 'undefined'){
            var index = 0;
            while( index < startPoint.childNodes.length && findElem == null ){
                if( startPoint.childNodes[index].nodeName == tagName ){
                    findElem = startPoint.childNodes[index];
                }
                index++;
            }
            // IF STILL HAVEN'T FOUND IT - START GOING DOWN THE DOM TREE
            index = 0;
            if( findElem == null ){
                while(index < startPoint.childNodes.length && findElem == null){
                    findElem = findNodeDown(startPoint.childNodes[index], tagName);
                    index++;
                }
            }
        }
    }
    return findElem;
}

function findNodeUp(startPoint, tagName){
    var findElem = null;
    if( typeof(startPoint) != 'undefined' ){
        if( !tagName ){
            tagName = "DIV";
        }
        if( startPoint && startPoint.parentNode ){
            if( (startPoint.parentNode.nodeName && startPoint.parentNode.nodeName == tagName)  || 
                (startPoint.parentNode.className && startPoint.parentNode.className == tagName)){
                findElem = startPoint.parentNode;
            }
            if( findElem == null ){
                findElem = findNodeUp(startPoint.parentNode, tagName);
            }
        }
    }
    return findElem;
}

function generateTitleBar(targetObj, displayText, ctrlFunc, cssClass, icon){
    if( typeof(cssClass) == 'undefined' ){
        cssClass = "unfocus";
    }
    if( typeof(icon) == 'undefined' ){
        icon = "../favicon.ico";
    }
    var titleBar = document.createElement("DIV");
    titleBar.className = cssClass;
    titleBar.width = "100%";
    titleBar.style.fontFamily = "'Comic Sans MS', 'Courier New', sans-serif";
    // titleBar.style.color = foreground;
    // titleBar.style.background = background;
    titleBar.style.padding = "0px 2px 0px 2px";
    titleBar.style.margin = "1px";

    var lcTable = document.createElement("TABLE");
    lcTable.width = "100%";
    lcTable.cellpadding = "0px";
    lcTable.cellspacing = "0px";
    lcTable.style.margin = "0px";
    var lcTBody = document.createElement("TBODY");
    lcTBody.width = "100%";
    var lcTRow = document.createElement("TR");
    var lcICell = document.createElement("TD");
    lcICell.style.padding = "0px";
    lcICell.style.margin = "0px";
    lcICell.innerHTML = "<img src='"+icon+"' width='16px' height='16px' border='0px'/>";
    var lcTCell = document.createElement("TD");
    lcTCell.className = "movable";
    lcTCell.width = "100%";
    lcTCell.style.fontSize = "10pt";
    lcTCell.style.fontWeight = "bold";
    lcTCell.style.verticalAlign = "top";
    // lcTCell.style.color = foreground;
    // lcTCell.style.fontWeight = "bold";
    lcTCell.style.padding = "0px 0px 0px 4px";
    lcTCell.style.margin = "0px";
    lcTCell.onclick = function(){
        $$('.focus').each(function(unfocussed){
            unfocussed.removeClassName('focus');
            unfocussed.addClassName('unfocus');
        });
        titleBar.addClassName('focus');
    }
    lcTCell.innerHTML = displayText;
    var lcCCell = document.createElement("TD");
    lcCCell.style.fontSize = "10pt";
    lcCCell.style.fontWeight = "bold";
    lcCCell.style.padding = "0px 3px 0px 3px";
    lcCCell.style.margin = "0px";
    lcCCell.style.cursor = "hand";
    lcCCell.style.cursor = "pointer";
    // lcCCell.style.border="1px solid "+background;
    // lcCCell.style.color = foreground;
    lcCCell.style.verticalAlign = "top";
    lcCCell.onclick = ctrlFunc;
    // lcCCell.onmouseover = function(){this.style.border="1px solid "+foreground;}
    // lcCCell.onmouseout = function(){this.style.border="1px solid "+background;}
    lcCCell.innerHTML = "X";
    titleBar.appendChild(lcTable);
    lcTable.appendChild(lcTBody);
    lcTBody.appendChild(lcTRow);
    lcTRow.appendChild(lcICell);
    lcTRow.appendChild(lcTCell);
    lcTRow.appendChild(lcCCell);
    return titleBar;
}

function addTitleBar(targetObj, targetTitle, cssClass){
    if(targetObj){
        var closeFunc = function(){ 
            targetObj.style.display="none"; 
            targetObj.style.visibility="hidden"; 
        };
        var newTitleBar = generateTitleBar(targetObj, targetTitle,closeFunc,cssClass);
        targetObj.insertBefore(newTitleBar, targetObj.firstChild);
    }
}

