/*
oo.Ajax
a simple ajax-library with element movement, collision detection and mouse coordinates
copyright Olli Oikarinen 2008 (http://oo.fi)

Released under LGPL, please see lgpl-3.0.txt

usage:

getHTML:
getHTML('url.php','parameters=here','targetid');

postForm:
<form action="javascript:postForm('url.php?parameters=here',document.getElementById('myform'),'targetid');" name="myform" id="myform">
*/

//internet explorer or not?
var ie = document.all?true:false;

//track mouse move
if(!ie) document.captureEvents(Event.MOUSEMOVE);
document.onmousemove=ooTrackMouse;

//mouse coordinates
var mouseX=0;
var mouseY=0;
var mouseId=0;

var request=false;

//is animation ready
var animationReady = [];

function formatRequest(){
	request=false;
    if(window.XMLHttpRequest) {
        try{
            request=new XMLHttpRequest();
        }catch(e){
            request=false;
        }
    }else if(window.ActiveXObject){
        try {
            request=new ActiveXObject("Msxml2.XMLHTTP");
        }catch(e){
            try{
                request=new ActiveXObject("Microsoft.XMLHTTP");
            }catch(e){
                request=false;
            }
        }
    }
}

function getHTML(url,pars,id,uf){
	id=confirmId(id);
    formatRequest();
	if(pars!=''){
       url=url+'?'+pars;
    }
	request.open("GET",url,false);
	request.send(null);
    //update id
    getElement(id).innerHTML=request.responseText;
    //run funtion
    if(uf!=''){
        eval(uf);
    }
    return true;
}

function postForm(url,obj,id,uf){
	id=confirmId(id);
    formatRequest();
	
	var post;
	for(var e=0;e<obj.elements.length;e++){
		if(obj.elements[e].name && obj.elements[e].name!=null){
			post+=obj.elements[e].name+'='+encodeURI(obj.elements[e].value)+'&';
		}
	}

	//remove undefined?!	
	post=post.substr(9);
	
	request.open("POST",url,true);
	request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	request.setRequestHeader("Content-length", post.length);
	request.setRequestHeader("Connection", "close");
	request.send(post);
    
    //update id
    getElement(id).innerHTML=request.responseText;
    //run function
    if(uf!=''){
        eval(uf);
    }
    //return true;
}

function getSuggestions(table,field,value,id,name){
  	id=confirmId(id);
    getHTML('oo/php/suggest.php','table='+table+'&field='+field+'&value='+value+'&name='+name,id);
}

function setHTML(id,html){
  	id=confirmId(id);
    getElement(id).innerHTML=html;
}

function moveTo(id,x,y){
  	id=confirmId(id);
    if(x==null){
        x=getX(id);
    }
    if(y==null){
        y=getY(id);
    }
    
    getElement(id).style.left=x+"px";
    getElement(id).style.top=y+"px";
}

function moveBy(id,x,y){
  	id=confirmId(id);
    if(x==null){
        x=0;
    }
    if(y==null){
        y=0;
    }
    x2=getX(id)+x;
    y2=getY(id)+y;
    moveTo(id,x2,y2);
}

function scaleTo(id,w,h){
  	id=confirmId(id);
    if(w==null){
        w=getW(id);
    }
    if(h==null){
        h=getH(id);
    }
    getElement(id).style.width=w+"px";
    getElement(id).style.height=h+"px";
}

function scaleBy(id,w,h){
  	id=confirmId(id);
    if(w==null){
        w=0;
    }
    if(h==null){
        h=0;
    }
    getElement(id).style.width=getW(id)+w;
    getElement(id).style.height=getH(id)+h;
}

function fadeTo(id,alpha){
  	id=confirmId(id);
    getElement(id).style.opacity = alpha/100;
    getElement(id).style.filter = 'alpha(opacity=' + alpha + ')';
}

function fadeBy(id,alpha){
  	id=confirmId(id);
    alpha+=getA(id);
    fadeTo(id,alpha);
}

function animateTo(id,x,y,w,h,a,time,steps){

  	id=confirmId(id);
    if(x!=null){
        x2=(x-getX(id))/steps;
    }else{
        var x2=x;
    }
    if(y!=null){
        var y2=(y-getY(id))/steps;  
    }else{
        var y2=y;
    }
    if(w!=null){
        var w2=(w-getW(id))/steps;  
    }else{
        var w2=w;
    }
    if(h!=null){
        var h2=(h-getH(id))/steps;  
    }else{
        var h2=h;
    }
    if(a!=null){
        var a2=(a-getA(id))/steps;
    }else{
        var a2=a;
    }

    var timePerStep=Math.round(time/steps);
    var steps2=steps-1;
    var time2=time-timePerStep;

    moveBy(id,x2,y2);
    scaleBy(id,w2,h2);
    fadeBy(id,a2);

    if(steps2>0){
        animationReady[id]=false;
        window.setTimeout('animateTo("'+id+'",'+x+','+y+','+w+','+h+','+a+','+time2+','+steps2+')',timePerStep);
    }else{
        animationReady[id]=true;
    }
}

function animateBy(id,x,y,w,h,a,time,steps){
  	id=confirmId(id);
    x=getX(id)+x;
    y=getY(id)+y;
    w=getW(id)+w;
    h=getH(id)+h;
    a=getA(id)+a;
    animateTo(id,x,y,w,h,a,time,steps);
}

function arrangeTo(id,z){
  	id=confirmId(id);
    getElement(id).style.zIndex=z;
}

function arrangeBy(id,factor){
  	id=confirmId(id);
    var z=getZ(id)+factor;
    arrangeTo(id,z);
}

function confirmId(input){
    var id;
    if(typeof input=='object'){
        var elements=document.getElementsByTagName(input.tagName);
        for(var i=0;i<elements.length;i++){
            if(input===elements[i]){
                id=input.id=input.tagName.toLowerCase()+'_'+i;
                break;
            }
        }
    }else{
        id=input;
    }
    return id;
}

function getX(id){
  	id=confirmId(id);
    var x=0;
    var y=0;
    var element=getElement(id);
    if (element.offsetParent){
        do{
			x+=element.offsetLeft;
		}while(element=element.offsetParent);
        return x;
    }else{
        return null;
    }
}

function getY(id){
  	id=confirmId(id);
    var x=0;
    var y=0;
    var element=getElement(id);
    if (element.offsetParent){
        do{
			y+=element.offsetTop;
		}while(element=element.offsetParent);
        return y;
    }else{
        return null;
    }
}

function getW(id){
  	id=confirmId(id);
    var w=getElement(id).clientWidth;
    return w;
}

function getH(id){
  	id=confirmId(id);
    var h=getElement(id).clientHeight;
    return h;
}

function getA(id){
	id=confirmId(id);
    	var alpha;
    	if(ie){
		var filter=getElement(id).style.filter;
		var opacity;
		if(filter!=null){
			opacity=getElement(id).style.filter.match(/alpha\(opacity=(.*)\)/);
		}
		if(opacity!=null){
			alpha=opacity[1];
		}else{
			alpha=100;
		}
	}else{
		if(getElement(id).style.opacity==''){
			alpha=100;
		}else{
			alpha=getElement(id).style.opacity*100
		}
	}
	alpha=parseInt(alpha);
	return alpha;
}

function getZ(id){
  	id=confirmId(id);
    var z=getElement(id).style.zIndex;
    if(z==''){
        z=0;  //should be 'auto', but it's easier to handle
    }
    return z;
}

function getMouseX(){
    return mouseX;
}

function getMouseY(){
    return mouseY;
}

function getMouseId(){
    return mouseId;
}

function getElement(id) {
  	id=confirmId(id);
    if (document.getElementById) {
        return document.getElementById(id);
    }
    else if(document.all){
        return window.document.all[id];
    }
    else if(document.layers){
        return window.document.layers[id];
    }else{
        return null;
    }
}

function setMouseXY(e){
    if(ie){
    	mouseX=event.clientX+document.body.scrollLeft;
		mouseY=event.clientY+document.body.scrollTop;
	}else{
        mouseX=e.pageX;
        mouseY=e.pageY;
    }
}

function setMouseId(e){
    var element;
    if(!e) var e=window.event;
    if(e.target){
        element=e.target;
    }else if(e.srcElement){
        element=e.srcElement;
    }
    //for Safari
    if(element.nodeType==3){
        element=element.parentNode;
    }
    mouseId=element.id;
}

function ooTrackMouse(e){
    setMouseXY(e);
    setMouseId(e);
    //oo.dragdrop.js
    if(typeof ooMouseMove=='function'){ 
        ooMouseMove(); 
    }
}

function getVisibility(id){
  	id=confirmId(id);
    var v=getElement(id).style.display;
    return v;
}

function visibilityOn(id){
  	id=confirmId(id);
    getElement(id).style.display='';
}

function visibilityOff(id){
  	id=confirmId(id);
    getElement(id).style.display='none';
}

function visibilityToggle(id){
  	id=confirmId(id);
    if(getElement(id).style.display==''){
        getElement(id).style.display='none';
    }else{
        getElement(id).style.display='';
    }
}

function collisionTo(id,id2){
  	id=confirmId(id);
  	id2=confirmId(id2);
    var w=getX(id)<=getX(id2)+getW(id2) && getX(id)+getW(id)>=getX(id2);
    var h=getY(id)<=getY(id2)+getH(id2) && getY(id)+getH(id)>=getY(id2);
    if (w && h){
	    return true;
    }else{
        return false;    
    }
}

function collisionBy(id){
  	id=confirmId(id);
    var elements = document.getElementsByTagName('id');
    for(var e=0;e<elements.length;e++){
       if(id!=elements[e].id){
           var collision=collisionTo(id,elements[e].id);
           if(collision==true){
               return elements[e].id;
           }
       }
    }
    return null;
}

function collisionToPixel(id,x,y){
  	id=confirmId(id);
    var w = getX(id)<=x+1 && getX(id)+getW(id)>=x;
    var h = getY(id)<=y+1 && getY(id)+getH(id)>=y;
    if (w && h){
	    return true;
    }else{
        return false;    
    }
}

function collisionByPixel(x,y){
    var elements = document.getElementsByTagName('div');
    for(var e=0;e<elements.length;e++){
       var collision=collisionToPixel(elements[e].id,x,y);
       if(collision==true){
           return elements[e].id;
       }
    }
    return null;
}
