/**
 * This file is for enhancements to core JavaScript, unrelated to the CMS and its specific applications
 */

String.prototype.trim = String.prototype.trim || function() {
    return this.replace(/^\s+/,'').replace(/\s+$/,'');
}


Array.prototype.indexOf = Array.prototype.indexOf || function(item, start) {
    for (var i = (start || 0); i < this.length; i++) {
        if (this[i] == item) {
            return i;
        }
    }
    return -1;
}


Array.prototype.push = Array.prototype.push || function() {
    for (var i = 0; i < arguments.length; i++) {
        this[this.length] = arguments[i];
    }
    return this.length;
}


Array.prototype.splice = Array.prototype.splice || function(start, deleteCount) {
    var beg = this.slice(0, start);
    var del = this.slice(start, start + deleteCount);
    var end = this.slice(start + deleteCount);

    var ins = [];
    for (var i = 2; i < arguments.length; i++) {
    	ins[i-2] = arguments[i];
    }
    
    this.length = 0;
    var tmp = this.concat(beg, ins, end);
    for (var i = 0; i < tmp.length; i++) {
    	this[i] = tmp[i];
    }

    return del;
}


Array.prototype.remove = Array.prototype.remove || function(val){
	var i = this.indexOf(val);
	if(i != -1) {
		this.splice(i, 1);
	}
}


/**
 * Provides document.getElementsByTagName function for UAs which don't natively support it
 * Such UAs include IE<=4.  Also provides document.getElementsByTagName('*') for IE<=5.5.
 * NOTE: does not provide getElementsByTagName for nodes other than document
 */
if (!document.getElementsByTagName) {
	if (document.all) { // Create getElementsByTagName for IE 5.x and below
		document.getElementsByTagName = function(nem) {
			return document.all.tags(nem.toUpperCase());
		}
	}
}
/*@cc_on @if (@_jscript_version < 5.6) //Target IE<=5.5
	document._getElementsByTagName = document.getElementsByTagName;
	document.getElementsByTagName = function(nem) {
		return (nem=='*') ? document.all : document._getElementsByTagName(nem);
	}
@end @*/


/**
 * Returns an array of HTMLElements whose className is searchClass, or null for UAs (such as
 * IE<=5.5) which don't support node.getElementsByTagName('name') in the case that node is not
 * null or document, or where 'name' is '*'.
 * If provided, ancestor provides the root from which the search descends.
 * If provided, tag indicates the required nodeName of the HTMLElements returned.
 */
function getElementsByClass(searchClass, /*optional*/ ancestor, /*optional*/ tagName) {
	var classElements = new Array();
	if (ancestor == null) {
		ancestor = document;
	}
	if (tagName == null) {
		tagName = '*';
	}
	var els = ancestor.getElementsByTagName && ancestor.getElementsByTagName(tagName);
	if (!els) {
		return null;
	}
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (var i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}


function getClasses(element) {
    return element.className ? element.className.trim().split(/\s+/) : [];
}


function addClass(element, c) {
	var classes = getClasses(element);
	if (classes.indexOf(c) == -1) {
		classes.push(c);
		element.className = classes.join(' ');
	}
}


function removeClass(element, c) {
	var classes = getClasses(element);
	var idx = classes.indexOf(c);
	if (idx != -1) {
		classes.splice(idx, 1);
		element.className = classes.join(' ');
	}
}


function hasClass(element, c) {
	return getClasses(element).indexOf(c) != -1;
}


function setClass(objectId, newClass) {
   	var object = document.getElementById(objectId);
	if(object) {
		object.className = newClass;
	}	
}
      

/**
 * Basic cross-browser AJAX functionality
 */
var HTTP = {};
HTTP._factories = [ function() { return new XMLHttpRequest(); },
                    function() { return new ActiveXObject('Msxml2.XMLHTTP'); },
                    function() { return new ActiveXObject('Microsoft.XMLHTTP'); }
                  ];
HTTP._factory = null;

/**
 * Returns an XMLHttpRequest object
 */
HTTP.newRequest = function() {
	if (HTTP._factory) {
		return HTTP._factory();
	}
	for (var i=0; i<HTTP._factories.length; ++i) {
		try {
			var factory = HTTP._factories[i];
			var request = factory();
			if (request) {
				HTTP._factory = factory;
				return request;
			}
		} catch(e) {
			continue;
		}
	}
	HTTP._factory = function() {
		throw new Error('XMLHttpRequest not supported');
	}
	HTTP._factory();
}

HTTP.getText = function(url, callback) {
	var request = HTTP.newRequest();
	request.onreadystatechange = function() {
		if (request.readyState == 4 && request.status == 200) {
			callback(request.responseText);
		}
	}
	request.open("GET", url);
	request.send(null);
};

HTTP.getXML = function(url, callback) {
	var request = HTTP.newRequest();
	request.onreadystatechange = function() {
		if (request.readyState == 4 && request.status == 200) {
			callback(request.responseXML);
		}
	}
	request.open("GET", url);
	request.send(null);
};


function setStyleDef(objectId, styleName, newVal) {
	var object = document.getElementById(objectId);
	if(object) {
		object.style[styleName] = newVal;
	}		     	
}	


function condor_getStyle(oElm, strCssRule) {
	var strValue = "";
	if(document.defaultView && document.defaultView.getComputedStyle){
		strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
	}
	else if(oElm.currentStyle){
		strCssRule = strCssRule.replace(/-(w)/g, function (strMatch, p1){
			return p1.toUpperCase();
		});
		strValue = oElm.currentStyle[strCssRule];
	}
	return strValue;
}


function getPageX() {
	var x;
	if (self.pageYOffset) { // all except Explorer
		x = self.pageXOffset;
	} else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
		x = document.documentElement.scrollLeft;
	} else if (document.body) { // all other Explorers
		x = document.body.scrollLeft;
	}
	return x;
}


function getPageY() {
	var y;
	if (self.pageYOffset) { // all except Explorer
		y = self.pageYOffset;
	} else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
		y = document.documentElement.scrollTop;
	} else if (document.body) { // all other Explorers
		y = document.body.scrollTop;
	}
	return y;
}


/**
 * Deprecated; use getX() and getY() instead
 */
function condor_get_absolute_offset(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}


/**
 * Returns the left offset of the element el with respect to the viewport, as currently viewed
 */
function getX(el) {
	var x = 0;
	for (var e = el; e; e = e.offsetParent) {
		x += e.offsetLeft;
	}
	for (e = el.parentNode; e && e != document.body; e = e.parentNode) {
		if (e.scrollLeft) {
			x -= e.scrollLeft;
		}
	}
	return x;
}


/**
 * Returns the top offset of the element el with respect to the viewport, as currently viewed
 */
function getY(el) {
	var y = 0;
	for (var e = el; e; e = e.offsetParent) {
		y += e.offsetTop;
	}
	for (e = el.parentNode; e && e != document.body; e = e.parentNode) {
		if (e.scrollTop) {
			y -= e.scrollTop;
		}
	}
	return y;
}
