// cross-browser event handling for IE5+, NS6+ and Mozilla 
// By Scott Andrew

function addEvent(elm, evType, fn, useCapture){
	if (elm.addEventListener){ 
		elm.addEventListener(evType, fn, useCapture); 
		return true; 
	}
	else if (elm.attachEvent){ 
		var r = elm.attachEvent('on' + evType, fn); 
		return r; 
	} 
	else{
		elm['on' + evType] = fn;
	}
}

function getElement(evt){

	if (window.event && window.event.srcElement){
		return window.event.srcElement;
		}
	if (evt && evt.target){
		return evt.target;
		}
	if (!el){
	 return;
	}
}

// Deals with the details of creating a 
// XMLHttpRequest object for different 
// browsers.
function createXmlHttpRequest()
{
	var http_request;
	
	if(window.XMLHttpRequest) // For Mozilla, Safari,....
	{
		http_request = new XMLHttpRequest();
	}
	else // IE
	{
		try
		{
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(e)
		{
			http_request = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	
	if(!http_request)
	{
		// Oh no!
		alert("failed to create HTTP request");
	}
	
	return http_request;
}

function getStyleValue(div, styleAttribute){
   // get the top value of the menu and convert to an int
   
   var string;
   switch(styleAttribute){
   
      case 'top':
         string = div.style.top;
         break;
      case 'left':
         string = div.style.left;
         break;
      case 'height':
         string = div.style.height;
         break;
      case 'width':
         string = div.style.width;
         break;
   }
   
   //window.alert('string: '+ string);
   
   var value = parseInt(string.replace(/px/,''));
   return value;
}


// This function will return the value of an attribute when given a specific element and the required attribute
function getAttributeValue(element, attribute_name){

  for(var x =0; x <element.attributes.length; x++){
  
      //window.alert('curretn attribute:' + element.attributes[x].nodeName.toLowerCase())
   
      if(element.attributes[x].nodeName.toLowerCase()==attribute_name){
         return element.attributes[x].nodeValue;
      }
        
   }

}

function findPageLocation(div)
{
   var rv = new Object();
   
   rv.top = div.offsetTop;
   rv.left = div.offsetLeft;
   var src = div.offsetParent;
   while(src)
   {
      rv.top += src.offsetTop;
      rv.left += src.offsetLeft;
      src = src.offsetParent;
   }
   return rv;
}


//eg (body, div, "images")
function getElementsByClassName(oElm, strTagName, oClassNames)
{
	
    var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    var arrRegExpClassNames = new Array();
    if(typeof oClassNames == "object"){
        for(var i=0; i<oClassNames.length; i++){
            arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames[i].replace(/\-/g, "\\-") + "(\\s|$)"));
        }
    }
    else{
        arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames.replace(/\-/g, "\\-") + "(\\s|$)"));
    }
    var oElement;
    var bMatchesAll;
    for(var j=0; j<arrElements.length; j++){
        oElement = arrElements[j];
        bMatchesAll = true;
        for(var k=0; k<arrRegExpClassNames.length; k++){
            if(!arrRegExpClassNames[k].test(oElement.className)){
                bMatchesAll = false;
                break;                      
            }
        }
        if(bMatchesAll){
            arrReturnElements.push(oElement);
        }
    }
    return (arrReturnElements)
}

function mouseActuallyIn(element, event)
{
   var pl = findPageLocation(element);
   event.offsetX = event.pageX - pl.left;
   event.offsetY = event.pageY - pl.top;
   
   // because when the mouse actually move outside, it still gives
   // co-ordinates that are inside, due to the frequency of event sampling
   var tolerance = 4;

   var x = event.offsetX;
   var y = event.offsetY;
   
   console.log(x);
   console.log(y);
   
   var width = getStyleValue(element, 'width')-tolerance;
   var height = getStyleValue(element, 'height')-tolerance;
   
   console.log(width);
   console.log(height);
   
   if((x>=tolerance&&x<=width)&&(y>=tolerance&&y<=height))
   {
      console.log('still inside');
      return true;
   }
   else
   {
      console.log('actually outside');
      return false;
   }


}

function compact(array){
	if(array.length==0){
		return array;
	}
	else{
	
		for(var i = 0; i<array.length; i++){
			if(array[i]==null){
				var k = i;
				if(i!=array.length-1){
					for(var j = i+1; j<array.length; j++){
						array[k] = array[j];
						k++;
					}
				}	
			}
		}
	}
	
	var new_array = new Array();
	for(var i = 0; i<array.length-1; i++){
		new_array[i] = array[i];
	}
	
	return new_array;
}
