//stores reference to XMLHttpRequest object
var xmlHttp = createXmlHttpRequestObject();

//retrieve XMLHttpRequest object
function createXmlHttpRequestObject(){
	//stores reference to XMLHttpRequest object
	var xmlHttp;
	
    try{
        xmlHttp = new XMLHttpRequest();
    }
	catch (e){
       try{
			xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
        catch (e){xmlHttp = false;}
    }
    
	//return object or display error
	if(xmlHttp)
		return xmlHttp;
	else
		alert('Error creating the XMLHttpRequest object');	
}


//make asyncronous HTTP request using XMLHttpRequest object
function update_form_value(id, table, return_class){
    
	//proceed only if object is not busy...
	if(xmlHttp.readyState == 4 || xmlHttp.readyState == 0){
    
        base_url="ajax.php?mode=update&id=" + id + "&table=" + table + "&class=" + return_class;
        if(document.getElementById(id).type == 'checkbox'){
            if(document.getElementById(id).checked)
                url_str=base_url + "&value=1";
            else
                url_str=base_url + "&value=0";
        }
        else if(document.getElementById(id).type == 'radio'){
            base_url="ajax.php?mode=update&id=" + document.getElementById(id).name + "&table=" + table + "&class=" + return_class;
            url_str=base_url + "&value=" + encodeURIComponent(document.getElementById(id).value);
        }
        else{
            new_value = encodeURIComponent(document.getElementById(id).value);
            url_str=base_url + "&value=" + new_value;
        }
        
		//process the request
		xmlHttp.open("GET", url_str, true);
		
		//define method to handle server responses
		xmlHttp.onreadystatechange = update_form_value_action;
		
		//make the server request
		xmlHttp.send(null);
	}
	else{
		//if busy, try again in 1 second
		setTimeout("update_form_value('" + id +"', '" + table + "', '" + return_class + "')",1000);
	}
}



//executed automatically when a message is received from the server
function update_form_value_action(){
	//move forward only if transaction has completed...
	if(xmlHttp.readyState == 4){
		//status of 200 indicates successful completion
		if(xmlHttp.status == 200){
			//extract the xml sent from the server
			xmlResponse = xmlHttp.responseXML;
			
			//get the document element of the XML structure
			xmlRoot = xmlResponse.documentElement;
			
			//get the elements
			id_array = xmlRoot.getElementsByTagName('target');
			msg_array = xmlRoot.getElementsByTagName('message');
			class_array = xmlRoot.getElementsByTagName('class');
            
            id_value = id_array.item(0).firstChild.data;
            msg_value = msg_array.item(0).firstChild.data;
            class_value = class_array.item(0).firstChild.data;
            
			//update the client display
            if(msg_value=='Success'){
    			document.getElementById(id_value).className=class_value;
            }
            else{
    			document.getElementById(id_value).className='error';
    			document.getElementById(id_value).title=msg_value;
			}
		}
		else{
			alert('Problem accessing the server: ' + xmlHttp.statusText);
		}
	}
}



//make asyncronous HTTP request using XMLHttpRequest object
function update_value(table, keyCol, keyVal, column, newVal){
    id=column + '_' + keyVal;
    
	//proceed only if object is not busy...
	if(xmlHttp.readyState == 4 || xmlHttp.readyState == 0){
        base_url="ajax.php?mode=update&id=" + id + "&table=" + table + "&class=no_class";
        url_str=base_url + "&value=" + newVal;
                  
		//process the request
		xmlHttp.open("GET", url_str, true);
		
		//define method to handle server responses
		xmlHttp.onreadystatechange = update_value_action;
		
		//make the server request
		xmlHttp.send(null);
	}
	else{
		//if busy, try again in 1 second
		setTimeout("update_value('" + table + "', '" + keyCol + "', '" + keyVal + "', '" + column + "', '" + newVal + "')",1000);
	}
}



//executed automatically when a message is received from the server
function update_value_action(){
	//move forward only if transaction has completed...
	if(xmlHttp.readyState == 4){
		//status of 200 indicates successful completion
		if(xmlHttp.status == 200){
			//extract the xml sent from the server
			xmlResponse = xmlHttp.responseXML;
			
			//get the document element of the XML structure
			xmlRoot = xmlResponse.documentElement;
			
			//get the elements
			id_array = xmlRoot.getElementsByTagName('target');
			msg_array = xmlRoot.getElementsByTagName('message');
			class_array = xmlRoot.getElementsByTagName('class');
            
            id_value = id_array.item(0).firstChild.data;
            msg_value = msg_array.item(0).firstChild.data;
            class_value = class_array.item(0).firstChild.data;
            
			//update the client display
            if(msg_value!='Success'){
    			alert(msg_value);
			}
		}
		else{
			alert('Problem accessing the server: ' + xmlHttp.statusText);
		}
	}
}






function suggest_nav(id, keyCode){
    var base_id = 's_' + id;
    var selected = 0;
    var itemID;
    
    // if key pressed was UP or DOWN...
    if(keyCode==38 || keyCode==40){
        
        //determine which item (if any) was already selected...
        for(i=1; i<=10; i++){
            itemID = base_id + '_' + i;
            try{
                if(document.getElementById(itemID).className == 'current'){
                    selected = i;
                }
            }
            catch (e){
            
            }
        }
    
       
       if(selected==0){
            choose = 1;
       }
       else{
            if(keyCode==38){
                choose = selected - 1;
            }
            else if(keyCode==40){
                choose = selected + 1;
            }
       }
        
        if(choose <= 0){
            choose = 1;
        }
        if(choose > 10){
            choose = 10;
        }
        unchoose = base_id + '_' + selected;
        choose = base_id + '_' + choose;
        
        try{
            document.getElementById(unchoose).className = 'unselected';
        }
        catch(e){}
        
        try{
            document.getElementById(choose).className = 'current';
            document.getElementById(id).value = decodeURI(document.getElementById(choose).innerHTML);
        }
        catch(e){}
    }
}


function suggest(id,oEvent){    

     // if key pressed was UP, or DOWN...
    var keyCode = oEvent.keyCode;
    if(keyCode==38 || keyCode==40){
        suggest_nav(id, keyCode);
        return;        
    }
    else if(keyCode == 13){
        //Enter key submits form, so do nothing
        return;
    }
    else if(keyCode == 16 || keyCode == 37 || keyCode == 39){
        //Shift key - do nothing
        //Left Arrow - do nothing
        //Right Arrow - do nothing
        return;
    }

	//proceed only if object is not busy...
	if(xmlHttp.readyState == 4 || xmlHttp.readyState == 0){
        var val;
        val=document.getElementById(id).value;
        url_str='ajax.php?mode=suggest&id='+id+'&value='+val;
        //alert('TEST: '+url_str);
		//process the request
		xmlHttp.open("GET", url_str, true);
		xmlHttp.onreadystatechange = suggestion;
		xmlHttp.send(null);
	}
	else{
		//if busy, try again in 1/10 second
		setTimeout("suggest('" + id +"', '" + oEvent + "')",10);
	}
}
function suggestion(){
	//move forward only if transaction has completed...
	if(xmlHttp.readyState == 4){
		//status of 200 indicates successful completion
		if(xmlHttp.status == 200){
			xmlResponse = xmlHttp.responseXML;
			xmlRoot = xmlResponse.documentElement;
			
            id_array = xmlRoot.getElementsByTagName('target');
			code_array = xmlRoot.getElementsByTagName('code');
            
            id_value = id_array.item(0).firstChild.data;
            code_value = code_array.item(0).firstChild.data;

            if(code_value=='255'){
                document.getElementById(id_value).className='hidden';
            }
            else{
                document.getElementById(id_value).innerHTML=decodeURIComponent(code_value);
                document.getElementById(id_value).className='suggestions';
            }
		}
		else{
			alert('Problem accessing the server: ' + xmlHttp.statusText);
		}
	}
}

function hide_suggest(id){
    document.getElementById(id + '_suggest').className='hidden';
}




function deleteRecord(table, keyCol, keyVal, hideID){  

    if(confirm('Are you sure you want to delete this record?')){
        //proceed only if object is not busy...
        if(xmlHttp.readyState == 4 || xmlHttp.readyState == 0){
            url_str='ajax.php?mode=delete_record&table='+table+'&keyCol='+keyCol+'&keyVal='+keyVal+'&hideID='+hideID;
            
            //process the request
            xmlHttp.open("GET", url_str, true);
            xmlHttp.onreadystatechange = hideDeletedRecord;
            xmlHttp.send(null);
        }
        else{
            //if busy, try again in 1/10 second
            setTimeout("deleteRecord('" + table +"', '" + keyCol +"', '" + keyVal +"', '" + hideID +"')",10);
        }
    }
}
function restoreRecord(table, keyCol, keyVal, hideID){  

    if(confirm('Are you sure you want to UNDELETE this record?')){
        //proceed only if object is not busy...
        if(xmlHttp.readyState == 4 || xmlHttp.readyState == 0){
            url_str='ajax.php?mode=restore_record&table='+table+'&keyCol='+keyCol+'&keyVal='+keyVal+'&hideID='+hideID;
            
            //process the request
            xmlHttp.open("GET", url_str, true);
            xmlHttp.onreadystatechange = hideDeletedRecord;
            xmlHttp.send(null);
        }
        else{
            //if busy, try again in 1/10 second
            setTimeout("restoreRecord('" + table +"', '" + keyCol +"', '" + keyVal +"', '" + hideID +"')",10);
        }
    }
}
function hideDeletedRecord(){
	//move forward only if transaction has completed...
	if(xmlHttp.readyState == 4){
		//status of 200 indicates successful completion
		if(xmlHttp.status == 200){
			xmlResponse = xmlHttp.responseXML;
			xmlRoot = xmlResponse.documentElement;
			
            id_array = xmlRoot.getElementsByTagName('target');
			code_array = xmlRoot.getElementsByTagName('code');
            
            id_value = id_array.item(0).firstChild.data;
            code_value = code_array.item(0).firstChild.data;

            if(code_value=='255'){
                document.getElementById(id_value).className='error';
            }
            else if(code_value=='254'){
                alert('You do not have write access to this data!');
            }
            else{
                document.getElementById(id_value).className='hidden';
                try{
			        document.getElementById(id_value+'_2').className='hidden';
                    document.getElementById(id_value+'_3').className='hidden';
                    document.getElementById(id_value+'_4').className='hidden';
                    document.getElementById(id_value+'_5').className='hidden';
                    document.getElementById(id_value+'_6').className='hidden';
		        }
                catch (e){} 
            }
		}
		else{
			alert('Problem accessing the server: ' + xmlHttp.statusText);
		}
	}
}

function validate_login_form(){
    if(document.getElementById('start').value.length == 0){
        document.getElementById('start').className='error';
        alert('You forgot to enter your ODIN name!');
    }
    else{
        if(document.getElementById('pass').value.length == 0){
            document.getElementById('pass').className='error';
            alert('You forgot to enter your password!');
        }
        else{
            document.getElementById('login_form').submit();
        }
    }
}



/**** DRAG AND DROP ****/
function mouseMove(ev){ 
   ev           = ev || window.event; 
   var mousePos = mouseCoords(ev); 
} 
	 
function mouseCoords(ev){ 
   if(ev.pageX || ev.pageY){ 
        return {x:ev.pageX, y:ev.pageY}; 
    } 
    return { 
        x:ev.clientX + document.body.scrollLeft - document.body.clientLeft, 
        y:ev.clientY + document.body.scrollTop  - document.body.clientTop 
    }; 
} 

function makeClickable(object){ 
    object.onmousedown = function(){ 
        dragObject = this; 
    } 
} 

function mouseUp(ev){ 
    dragObject = null; 
} 

function getMouseOffset(target, ev){ 
   ev = ev || window.event; 

    var docPos    = getPosition(target); 
    var mousePos  = mouseCoords(ev); 
    return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y}; 
} 
 
function getPosition(e){ 
    var left = 0; 
    var top  = 0; 
 
    while (e.offsetParent){ 
        left += e.offsetLeft; 
        top  += e.offsetTop; 
        e     = e.offsetParent; 
    } 
 
    left += e.offsetLeft; 
    top  += e.offsetTop; 
 
    return {x:left, y:top}; 
} 
 
function mouseMove(ev){ 
    ev           = ev || window.event; 
    var mousePos = mouseCoords(ev); 
 
    if(dragObject){ 
        dragObject.style.position = 'absolute'; 
        dragObject.style.top      = mousePos.y - mouseOffset.y; 
        dragObject.style.left     = mousePos.x - mouseOffset.x; 
 
        return false; 
    } 
} 
function mouseUp(){ 
    dragObject = null; 
} 
 
function makeDraggable(item){ 
    if(!item) return; 
    item.onmousedown = function(ev){ 
        dragObject  = this; 
        mouseOffset = getMouseOffset(this, ev); 
        return false; 
    } 
} 