/* Nike Core JS library 
 *
 * 23/01/08 , v 0.2
 *
*/


/*
$()

The dollar function is found in most of the new opensource libraries.
It can be used as a shorthand to getElementById();

var class = $('myElement').className;

*/
function $(sElementId)
{
    var element;

    try
    {
        document.getElementById(sElementId);
    }
    catch(e)
    {
        alert("Error in $(): " + e.description);
    }
    
    return element;
}



/*
ltrim(), rtrim() and trim()

As the JS string object does not natively support trimming, the below three functions are 
used to trim strings.
Trim whitespace to the left, right and both sides respectively.

*/

function ltrim(sStringToTrim)
{
    return sStringToTrim.replace( /^\s*/, "" );
}
function rtrim(sStringToTrim)
{
   return sStringToTrim.replace( /\s*$/, "" );
}
function trim(sStringToTrim)
{
   var temp = sStringToTrim;
   return temp.replace(/^\s+/,'').replace(/\s+$/,'');
}


/*
CssSwitcher()

This function is useful for managing class attributes for elements.
This is the preferred method to manipulating the style attribute and respective properties.

if(CssSwitcher('check',element,'hidden')) //if hidden, show
{
    CssSwitcher('remove',element,'hidden');
}
else { //hide
    CssSwitcher('add',element,'hidden'); 
}

*/
function CssSwitcher(myAction, oObject, class1, class2)
{
    try 
    {

	    switch (myAction) 
	    {
	        case 'swap':
		    oObject.className =! CssSwitcher('check',oObject,class1) ? oObject.className.replace(class2,class1) : oObject.className.replace(class1,class2);
		    break;

		    case 'add':
		    if(!CssSwitcher('check',oObject,class1))
		    {
			    oObject.className += oObject.className ? ' ' + class1 : class1; // get the class name, regardless if it's the control's second class
		    }
		    break;

		    case 'remove':
		    var rep = oObject.className.match(' ' + class1) ? ' ' + class1 : class1;
		    oObject.className = oObject.className.replace(rep,'');
		    break;

		    case 'check':
			    return new RegExp('\\b' + class1 + '\\b').test(oObject.className);
		    break;
	    }
	
	}
	catch(e) 
	{
        alert("Error in CssSwitcher(): " + e.description);
    }
}



/* 
MakeXMLHTTPRequest()

Use this method to make AJAX calls, an example is given below


MakeXMLHTTPRequest("http://www.google.com/",processReqChange);

function processReqChange() 
{
    try
    {
        if (req.readyState == 4) 
        {
            if (req.status == 200) 
            {
                //actions go here
                 alert(req.responseText);
            }
        }
    }
    catch(er)
    {
        alert("Error in processReqChange: " + er.description);
    }   
}
    
*/
var req;
function MakeXMLHTTPRequest(sURL, fCallbackFunction)
{
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) 
    {
        req = new XMLHttpRequest();
        req.onreadystatechange = fCallbackFunction;
        req.open("GET", sURL, true);
        req.send(null);
    // branch for IE/Windows ActiveX version
    } 
    else if (window.ActiveXObject) 
    {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) 
        {
            req.onreadystatechange = fCallbackFunction;
            req.open("GET", sURL, true);
            req.send();
        }
    }
}





/* JS Querystring parser */

function Querystring(qs) { // optionally pass a querystring to parse
	this.params = new Object()
	this.get=Querystring_get
	
	if (qs == null)
		qs=location.search.substring(1,location.search.length)

	if (qs.length == 0) return

// Turn <plus> back to <space>
// See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
	qs = qs.replace(/\+/g, ' ')
	var args = qs.split('&') // parse out name/value pairs separated via &
	
// split out each name=value pair
	for (var i=0;i<args.length;i++) {
		var value;
		var pair = args[i].split('=')
		var name = unescape(pair[0])

		if (pair.length == 2)
			value = unescape(pair[1])
		else
			value = name
		
		this.params[name] = value
	}
}

function Querystring_get(key, default_) {
	// This silly looking line changes UNDEFINED to NULL
	if (default_ == null) default_ = null;
	
	var value=this.params[key]
	if (value==null) value=default_;
	
	return value
}


function addNewEvent(obj, evType, fn){
if (obj.addEventListener){
   obj.addEventListener(evType, fn, false);
   return true;
 } else if (obj.attachEvent){
   var r = obj.attachEvent("on"+evType, fn);
   return r;
 } else {
   return false;
 }
}

// Detect IE Version
var IEVersion=0;
if (navigator.appVersion.indexOf("MSIE")!=-1){
    IEVersion=parseFloat(navigator.appVersion.split("MSIE")[1])
}

// Change rollover state
function rollOverChange() { 
   obj = event.srcElement;
   btnClass = obj.className
   state = btnClass.indexOf('_hover');
   if (state < 0) {
        btnClass = btnClass.substr(btnClass.indexOf(' '),50);
        CssSwitcher('add',obj,btnClass + '_hover')       
   } else {
        btnClass = btnClass.substr(btnClass.lastIndexOf(' ')+1,50);
        CssSwitcher('remove',obj,btnClass);       
   }
}

// Add rollover functionality to IE input buttons (all input elements with a style class of 'btn')
function addRollOvers() {
if ((IEVersion > 5) && (IEVersion < 7)) {
    var arrInputs = document.getElementsByTagName('input');
    for (z=0;z<arrInputs.length;z++) {
     if (arrInputs[z].className.indexOf('btn') != -1) {
      s = arrInputs[z].id;
      addNewEvent(arrInputs[z],'mouseover', rollOverChange );
      addNewEvent(arrInputs[z],'mouseout', rollOverChange );
      }
     }
    }
}

