

/*----------------------------------------------------------------------------*/
/* String manipulation */

/**
 * Capitalizes all words and removes spaces between them
 */
String.prototype.contractString = function() {
	return this.capitalizeString().removeSpaces();
};

String.prototype.capitalizeString = function() {
	// adapted from http://www.mediacollege.com/internet/javascript/text/case-capitalize.html
	var outputStr = this.toLowerCase();
	var stringLen = outputStr.length;
	for (i = 0; i < stringLen; i++) {
		if (i == 0) {
			tmpChar = outputStr.substring(0,1).toUpperCase();
			postString = outputStr.substring(1,stringLen);
			outputStr = tmpChar + postString;
		}
		else {
			tmpChar = outputStr.substring(i,i+1);
			if (tmpChar == " " && i < (stringLen-1)) {
				tmpChar = outputStr.substring(i+1,i+2).toUpperCase();
				preString = outputStr.substring(0,i+1);
				postString = outputStr.substring(i+2,stringLen);
				outputStr = preString + tmpChar + postString;
			}
		}
	}
	return outputStr;
};

String.prototype.removeSpaces = function() {
	// from http://www.mediacollege.com/internet/javascript/form/remove-spaces.html
	var string = this;
	var tstring = "";
	string = '' + string;
	splitstring = string.split(" ");
	for(i = 0; i < splitstring.length; i++)
	tstring += splitstring[i];
	return tstring;
};

String.prototype.trim = function() {
	var i, j = this.length;

    for (i = 0; isWhite(this.charAt(i)) && (i < j); i++)
        ;
    if (i == j) return ""; //whole string is white
    for (; isWhite(this.charAt(j-1)); j--)
        ;
    return this.substring(i, j);
}
function isWhite(c) {
    return ((c == '\t') || (c == ' '));
}

String.prototype.reverse = function() {
  for( var oStr = '', x = this.length - 1, oTmp; oTmp = this.charAt(x); x-- ) {
    oStr += oTmp;
  }
  return oStr;
};

/*
 * Source: http://www.regular-expressions.info/javascriptexample.html
 */
function matchRegex(subject, regex) {
  var re = new RegExp(regex);
  var m = re.exec(subject);
  if (m == null) {
  } else {
    return m[0];
  }
}

/*----------------------------------------------------------------------------*/
/* Convenience methods */

function removePx(pxString) {
	return parseInt(pxString.split('p')[0]);
}

/*----------------------------------------------------------------------------*/
/* Extra Array methods */

Array.prototype.contains = function(element) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == element) {
			return true;
		}
	}
	return false;
};

Array.prototype.add = function(element) {
	this.push(element);
};

Array.prototype.remove = function(element) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == element) {
			this.splice(i,1);
			return;
		}
	}
};

/*----------------------------------------------------------------------------*/
/* Date */

/*
 * Note that month is 0 indexed
 */

/**
 * Requires endDate >= startDate
 * Returns Array(dy, dm, dd)
 */
function dateDiff(startDate, endDate) {
	if (endDate < startDate) {return null;}
	
	var d0 = startDate.getDate();
	var m0 =  startDate.getMonth();
	var y0 =  startDate.getFullYear();
	
	var df = endDate.getDate();
	var mf =  endDate.getMonth();
	var yf =  endDate.getFullYear();
	
	var dy = yf - y0;
	
	var dm = mf - m0;
	if (dm < 0) { // startDate has earlier month
		// shift year
		dy -= 1;
		dm += 12;		
	}
	
	var dd = df - d0;
	if (dd < 0) { // startDate has earlier date
		// shift month
		dm -= 1;
		dd += daysInMonth(yf, mf);		
	}
	
	return new Array(dy, dm, dd);
}

function dateDiffStr(startDate, endDate) {
	var diff = dateDiff(startDate, endDate);
	if (!diff) {return null;}
	
	var dy = diff[0];
	var dm = diff[1];
	var dd = diff[2];
	
	var yStr = (dy <= 0) ? '' :
					(dy == 1) ? '1 year '  : dy + ' years ';
	var mStr = (dm <= 0) ? '' :
					(dm == 1) ? '1 month '  : dm + ' months ';
	var dStr = (dd <= 0) ? '' :
					(dd == 1) ? '1 day'  : dd+ ' days';
					
	var s = yStr + mStr + dStr;
	
	if (s == '') { // all 0
		s = '0 days'
	}
	return s;
}

function daysInMonth(iMonth, iYear) {
	return 32 - new Date(iYear, iMonth, 32).getDate();
}

/*----------------------------------------------------------------------------*/

function setOpacity(obj, value) {
	// value between 0 and 10
	obj.style.opacity = value/10;
	obj.style.filter = 'alpha(opacity=' + value*10 + ')';
}