function ajax(XMLURL, functionName, textMode)
{
	var xmlHttp;
	try
	{
		// Firefox, Opera 8.0+, Safari
		xmlHttp = new XMLHttpRequest();
	}
	catch (e)
	{
		// Internet Explorer
		try
		{
			xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e)
			{
				//alert("Your browser does not support AJAX!");
				return false;
			}
		}
	}
	
	xmlHttp.onreadystatechange = function()
	{
		if(xmlHttp.readyState == 4)
		{		
			if(textMode != undefined)
			{
				functionName(xmlHttp.responseText);
			}
			else
			{
				functionName(xmlHttp.responseXML);
			}
		}
	}
	xmlHttp.open("GET", XMLURL, true);
	xmlHttp.send(null);
}

//ucfirst for js
String.prototype.ucFirst = function()
{
	// http://kevin.vanzonneveld.net
	return	this.toLowerCase().replace(/\w+/g, function(s)
			{
				return s.charAt(0).toUpperCase() + s.substr(1);
			})
}

//explode for js
String.prototype.explode = function(delimiter, limit)
{
	//my addition for prototype-approach to work
	var string = this;

    // http://kevin.vanzonneveld.net
 
    var emptyArray = { 0: '' };
    
    // 2nd not required thanks to prototype
    if ( arguments.length == 0
        || typeof arguments[0] == 'undefined' )
    {
        return null;
    }
 
    if ( delimiter === ''
        || delimiter === false
        || delimiter === null )
    {
        return false;
    }
 
    if ( typeof delimiter == 'function'
        || typeof delimiter == 'object')
    {
        return emptyArray;
    }
 
    if ( delimiter === true ) {
        delimiter = '1';
    }
    
    if (!limit) {
        return string.toString().split(delimiter.toString());
    } else {
        // support for limit argument
        var splitted = string.toString().split(delimiter.toString());
        var partA = splitted.splice(0, limit - 1);
        var partB = splitted.join(delimiter.toString());
        partA.push(partB);
        return partA;
    }
}

//substr_count for js
String.prototype.substrCount = function(needle, offset, length)
{
	var haystack = String(this);

    // http://kevin.vanzonneveld.net
    var pos = 0, cnt = 0;
    
    if(isNaN(offset)) offset = 0;
    if(isNaN(length)) length = 0;
    offset--;
 
 	offset = haystack.indexOf(needle, offset+1)
    while(offset > -1 ){
        if(length > 0 && (offset+needle.length) > length){
            return false;
        } else{
            cnt++;
        }
        
        offset = haystack.indexOf(needle, offset+1)
    }
 
    return cnt;
}

//stops default action of events
function stopDefault(e)
{
	if(e && e.preventDefault)
	{
		e.preventDefault();
	}
	else if(window.event && window.event.returnValue)
	{
		window.event.returnValue = false;
	}
}

//debug - print out objects
function traceObject(myObject) 
{
	var str='';
	for(prop in myObject)
	{
		str += prop + ' value :' + myObject[prop] + "<br />\r\n";
	}
	
	return str;
}

//debug - xml to string
function XMLToString(myXML)
{
	return (new XMLSerializer()).serializeToString(myXML);
}



/**************
header - search
**************/

function initSearch(xmlFile)
{
	ajax(xmlFile, addSearchFields); //calls xml
	
	//assign search focus event
	document.getElementById('search_input').onfocus = function() { this.value = '' };
}

function addSearchFields(xml) //sets search fields
{
	var mainSearchTypes = new Array('artists', 'albums', 'articles');
	var mainSearch = new Search(xml, 'search_input', 'js_search_results', mainSearchTypes);
	mainSearch.typeLimit = 4;
}

/******************
catalogue - reviews
******************/

//set up review hide/show
function reviewsInit()
{
	if(document.getElementById("reviews_hidden") != undefined)
	{
		showReviewsButton = document.getElementById("reviews_show");
		hideReviewsButton = document.getElementById("reviews_hide");
		hiddenReviews = document.getElementById("reviews_hidden");
		
		//shows/hides relevant stuff
		showReviewsButton.style.display = "inline";
		hiddenReviews.style.display = "none";
		
		//click events
		hideReviewsButton.onclick = hideReviews;
		showReviewsButton.onclick = showReviews;
	}
}

//show em
function showReviews(e)
{
	hiddenReviews.style.display = "block";
	showReviewsButton.style.display = "none";
	hideReviewsButton.style.display = "inline";
	stopDefault(e);
}

//hide em
function hideReviews(e)
{
	hiddenReviews.style.display = "none";
	hideReviewsButton.style.display = "none";
	showReviewsButton.style.display = "inline";
	stopDefault(e);
}

/***********************
catalogue - track player
***********************/

//set up track links
function playTracksInit()
{
	var tracks = document.getElementById('track_list').getElementsByTagName('li');
	for(var i = 0; i < tracks.length; i++)
	{
		tracks[i].childNodes[0].onclick = playTrack;
	}
}

//play track (request)
function playTrack(e)
{
	//ie compatibility
	var thisObject;
	var parentObject;
	if(e == undefined)
	{
		thisObject = this;
		parentObject = this.parentNode;
	}
	else
	{
		thisObject = e.target;
		parentObject = e.target.parentNode;
	}
	
	//if parent has a class
	if(parentObject.className != undefined)
	{
		//request player
		var trackCode = parentObject.className.substr(6);
		ajax('/audio_player/audio_player.php?preview_id=' + trackCode, displayPlayer, true);
	
		//highlight currently playing track
		var tracks = document.getElementById('track_list').getElementsByTagName('li');
		for(var i = 0; i < tracks.length; i++)
		{
			if(i % 2 == 1)
			{
				tracks[i].childNodes[0].className = 'odd';
			}
			else
			{
				tracks[i].childNodes[0].className = '';
			}
		}
		thisObject.className += ' track_playing';
	}
	
	//stop link redirect
	stopDefault(e); //like preventDefault(); just more cross-browsery
}

//put play on page
function displayPlayer(playerCode)
{
	document.getElementById('track_player').innerHTML = playerCode;
}

//Select All for Embed code
function selectAllInput(target) {
	var targetinput = document.getElementById(target);
	targetinput.focus();
	targetinput.select();	
}