/* -------------------------------------------------------------------------- */
/*                                 Utility                                    */
/* -------------------------------------------------------------------------- */

String.prototype.queryString = _queryString;
function _queryString() {
    return _buildQueryString(this, _queryString.arguments);
}

String.prototype.parseQueryString = _parseQueryString;
function _parseQueryString() {
    return JSV_parseQueryString(this);
}

String.prototype.getAttribute = _getAttribute;
function _getAttribute(attribute, caseSensitive) {
    return JSV_getAttribute(this, attribute, caseSensitive);
}

String.prototype.setAttributeValue = _setAttribute;
function _setAttribute(attribute, caseSensitive) {
    return JSV_setAttribute(this, attribute, value, caseSensitive);
}

String.prototype.addAttribute = _addAttribute;
function _addAttribute(attribute, caseSensitive) {
    return JSV_addAttribute(this, attribute, caseSensitive);
}

String.prototype.deleteAttribute = _deleteAttribute;
function _deleteAttribute(attribute, caseSensitive) {
    return JSV_deleteAttribute(this, attribute, caseSensitive);
}

var qsArray = new Array();
var CGIQUERYSTRING = window.location.search;

function _buildQueryString() {
	var returnString = _buildQueryString.arguments[0];
	if (_buildQueryString.arguments.length == 2) {
		if (typeof _buildQueryString.arguments[1] == "object") {
			arrayArgumentLength = _buildQueryString.arguments[1].length;
			if (arrayArgumentLength%2 != 0) arrayArgumentLength--;
			if (arrayArgumentLength > 1) {
				var argumentObject = _buildQueryString.arguments[1];
				for (i=0; i<arrayArgumentLength; i=i+2) {
					returnString = JSV_queryString(returnString,argumentObject[i],argumentObject[i+1]);
				}
			}
		}
	}
	return returnString;
}

function JSV_queryString() {
	var returnString = JSV_queryString.arguments[0];
	var argumentLength = JSV_queryString.arguments.length;
	if (argumentLength%2 != 1) argumentLength--;
	if (argumentLength > 2) {
		var i = 0;
		for (i=1; i<argumentLength; i=i+2) {
			if ( !JSV_isWhitespace(JSV_queryString.arguments[i]) && !JSV_isWhitespace(JSV_queryString.arguments[i+1]) ) {
				returnString = 
					returnString +
					( (returnString.length == 0) ? '?' : '&' ) +
					JSV_queryString.arguments[i] +
					"=" +
					escape(JSV_queryString.arguments[i+1]);
			}
		}
	}
	return returnString;
}

function _queryStringObject(attribute, value) {
	this.attribute = attribute;
	this.value = unescape(value);
}

function JSV_parseQueryString(queryString) {
	queryString = ( (JSV_parseQueryString.arguments[0] == null) ? CGIQUERYSTRING : queryString );
	if ( !JSV_isWhitespace(queryString) ) {
		var i = 0, j = 0;
		var internalArray = JSV_parseString(queryString, "?&=", false);
		if (internalArray.length%2 == 1) internalArray[internalArray.length] = '';
		for (i=0; i<internalArray.length; i=i+2) {
			if (internalArray[i+1].length != 0) {
				qsArray[j++] = new _queryStringObject(internalArray[i], internalArray[i+1]);
			}
		}
	}
}

function JSV_getAttribute(queryString, attribute, caseSensitive) {
	attributeValue = '';
	queryString = ( (JSV_getAttribute.arguments[0] == null) ? CGIQUERYSTRING : queryString );
	if ( !JSV_isWhitespace(queryString) && !JSV_isWhitespace(attribute) ) {
		JSV_parseQueryString(queryString);
		caseSensitive = ( (JSV_getAttribute.arguments[2] == null) ? false : caseSensitive );
		if (qsArray.length != 0) {
			var i = 0;
			var attributeRight = '';
			var attributeLeft = ( caseSensitive ? attribute : attribute.toLowerCase() );
			for (i=0; i<qsArray.length; i++) {
				attributeRight = ( caseSensitive ? qsArray[i].attribute : qsArray[i].attribute.toLowerCase() );
				if (attributeLeft == attributeRight) {
					attributeValue = unescape(qsArray[i].value);
					break;
				}
			}
		}
	}
	return attributeValue;
}

function JSV_setAttribute(queryString, attribute, value, caseSensitive) {
	queryString = ( (JSV_setAttribute.arguments[0] == null) ? CGIQUERYSTRING : queryString );
	if ( !JSV_isWhitespace(queryString) && !JSV_isWhitespace(attribute) && !JSV_isWhitespace(value) ) {
		JSV_parseQueryString(queryString);
		caseSensitive = ( (JSV_setAttribute.arguments[3] == null) ? false : caseSensitive );
		if (qsArray.length != 0) {
			var i = 0;
			var attributeRight = '';
			var attributeLeft = ( caseSensitive ? attribute : attribute.toLowerCase() );
			for (i=0; i<qsArray.length; i++) {
				attributeRight = ( caseSensitive ? qsArray[i].attribute : qsArray[i].attribute.toLowerCase() );
				if (attributeLeft == attributeRight) {
					qsArray[i].value = value;
					break;
				}
			}
			if (i == qsArray.length) {
				queryString = JSV_addAttribute(queryString, attribute, value);
			}
		}
		queryString = JSV_buildQueryString()
	}
	return queryString;
}

function JSV_buildQueryString() {
	var queryString = '';
	if (qsArray.length != 0) {
		var i = 0;
		for (i=0; i<qsArray.length; i++) {
			if (qsArray[i].value.length != 0) {
				queryString =
					JSV_queryString( queryString, qsArray[i].attribute, qsArray[i].value) ;
			}
		}
	}
	return queryString;
}

function JSV_addAttribute(queryString, attribute, value) {
	queryString = ( (JSV_addAttribute.arguments[0] == null) ? CGIQUERYSTRING : queryString );
	if ( !JSV_isWhitespace(attribute) && !JSV_isWhitespace(value) ) {
		queryString = JSV_queryString( queryString, attribute, value );
		qsArray[qsArray.length] = new _queryStringObject(attribute, value);
	}
	return queryString;
}


function JSV_deleteAttribute(queryString, attribute, caseSensitive) {
	queryString = ( (JSV_deleteAttribute.arguments[0] == null) ? CGIQUERYSTRING : queryString );
	if ( !JSV_isWhitespace(queryString) && !JSV_isWhitespace(attribute) ) {
		JSV_parseQueryString(queryString);
		caseSensitive = ( (JSV_deleteAttribute.arguments[2] == null) ? false : caseSensitive );
		if (qsArray.length != 0) {
			var i = 0;
			var attributeRight = '';
			var attributeLeft = ( caseSensitive ? attribute : attribute.toLowerCase() );
			for (i=0; i<qsArray.length; i++) {
				attributeRight = ( caseSensitive ? qsArray[i].attribute : qsArray[i].attribute.toLowerCase() );
				if (attributeLeft == attributeRight) {
					qsArray[i].attribute = '';
					qsArray[i].value = '';
					break;
				}
			}

			if (i < qsArray.length) {
				if (i < qsArray.length-1) {
					var j = 0;
					for (j=i; j<qsArray.length-1; j++) {
						qsArray[j].attribute = qsArray[j+1].attribute;
						qsArray[j].value = qsArray[j+1].value;
					}
				}
				qsArray.length--;
				queryString = JSV_buildQueryString();
			}
		}
	}
	return queryString;
}

var ALERT = 2001;

function JSV_writeQueryArray() {
	var i = 0, qString = '';
	inAlert = ( (JSV_writeQueryArray.arguments[0] == ALERT) ? true : false )
	for (i=0; i<qsArray.length; i++) {
		qString = qString + i + " : " +
			qsArray[i].attribute + " : " +
			qsArray[i].value +
			( inAlert ? "\n" : "<BR>" );
	}

	if (inAlert)
		alert(qString);
	else
		document.write(qString);
}

