
//
// Conversation Data functions
//

function convertXmlNode(xmlNode)
{
	if (! xmlNode || ! xmlNode.childNodes)
		return null
		
	var outp = new Array()
	
	for (var j=0; j<xmlNode.childNodes.length; j++) {
		var lmnt = xmlNode.childNodes.item(j)
		if (lmnt.nodeName)
		{
			outp[lmnt.nodeName] = ""
			if (lmnt.firstChild)
				outp[lmnt.nodeName] = lmnt.firstChild.nodeValue
		}
	}

	return outp
}



//
// Cookie manipulation
//
function getExpiryDate(dayCount)
{
	var today = new Date()
	var milliCount = Date.parse(today)
	today.setTime(milliCount + dayCount*24*60*60*1000)
	return today.toUTCString()
}
function getCookie(cName, def) 
{	
	var cString = "" + document.cookie
	if (! cName || ! cString)
		return def
	var i1 = cString.indexOf(cName)
 	if (i1 < 0) return def
	
 	var i2=cString.indexOf(';',i1)
 	if (i2< i1) i2 = cString.length
	
 	cString = unescape(cString.substring(i1 + cName.length+1, i2))

	return (cString.length > 0) ? cString : def
}
function setCookie(name, value, duration)
{
	var sCookie = name + "=" + escape(value)
	if (duration != null)
		sCookie += "; expires="+getExpiryDate(duration)
	
	sCookie += "; path=/; "//domain=www.mypincushion.com"
	
	document.cookie = sCookie
	
	return (getCookie(name)) ? true : false
}


///
// URL manipulation
///

function getUrlParam(url, paramName, dflt)
{
	var regx = new RegExp("[?&]"+paramName+"=([^&#]+)")
	
	var m = regx.exec(url)
	
	if (m && m.length > 1)
		return m[1]
		
	return dflt
}

function getUrlParamInt(url, paramName, dflt)
{
	try {
		var nid = parseInt(getUrlParam(url, paramName, dflt))
		return nid
	} catch (ex) {}

	return dflt
}
//
// XML helpers
//
function CommentList(serverResponseXml)
{
	this.isValid = false

	this.comments = new Array()
	
	elements = serverResponseXml.getElementsByTagName("CommentSummary")	
	if (elements && elements.length > 0)
	{
		this.isValid = true
		for (var i=0; i<elements.length; i++)
		{
			var reply = convertXmlNode(elements.item(i))
			if (reply)
				this.comments.push(reply)
		}
	}
	
	this.isMonitored = false
	elements = serverResponseXml.getElementsByTagName("DomainMonitored")	
	if (elements && elements.length > 0)
	{
		if (elements.item(0).firstChild)
			this.isMonitored = (elements.item(0).firstChild.nodeValue == "true")
	}		
}


function Conversation(serverResponseXml)
{
	this.isValid = false
	
	// get the conversation root node
	var elements = serverResponseXml.getElementsByTagName("RootComment")
	
	if (! elements || elements.length < 1) {
		return
	}
	
	this.rootComment = convertXmlNode(elements.item(0))
	
	this.replies = new Array()
	
	elements = serverResponseXml.getElementsByTagName("CommentReply")	
	if (elements && elements.length > 0)
	{
		for (var i=0; i<elements.length; i++)
		{
			var reply = convertXmlNode(elements.item(i))
			if (reply)
				this.replies.push(reply)
		}
	}
}


//
// error box UI functions
//

function showError(message)
{
	var msgp = $('pc_error')
	if (msgp) {
		msgp.innerHTML = message
		setVisibility(msgp, true)
	}
}

function hideError()
{
	var msgp = $('pc_error')
	if (msgp) {
		msgp.innerHtml = ""
		setVisibility(msgp, false)
	}
}






//
// Browser info tricks
//
function getWindowWidth() 
{
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement
			&& ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return myWidth
}

function getWindowHeight() 
{
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement
			&& ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return myHeight
}


function dump(arr,level) 
{
	var dumped_text = "";
	if(!level) level = 0;
	
	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";
	
	if(arr != null && typeof(arr) == 'object') { //Array/Hashes/Objects
	 for(var item in arr) {
	 	if (! arr.hasOwnProperty(item)) continue
	  var value = arr[item];
	 
	  if(typeof(value) == 'object') { //If it is an array,
	   dumped_text += level_padding + "'" + item + "' ...\n";
	   dumped_text += dump(value,level+1);
	  } else {
	   dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
	  }
	 }
	} else { //Stings/Chars/Numbers etc.
	 dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
} 

//
// parsing URLs
//
function parseUrl(data) {
    var e=/^((http|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+\.[^#?\s]+)(#[\w\-]+)?$/;

	e=/^([^:\s]+):\/+([^:\/\s]+)/
    if (data.match(e)) {
        return  {url: RegExp['$&'],
                protocol: RegExp.$1,
                host:RegExp.$2,
                path:"",//RegExp.$4,
                file:"",//RegExp.$6,
                hash:""//RegExp.$7
				};
    }
    else {
        return  {url:"", protocol:"",host:"",path:"",file:"",hash:""};
    }
}

function monthString(mnum) {
	switch (mnum) {
		case 0: return "Jan"
		case 1: return "Feb"
		case 2: return "Mar"
		case 3: return "Apr"
		case 4: return "May"
		case 5: return "Jun"
		case 6: return "Jul"
		case 7: return "Aug"
		case 8: return "Sep"
		case 9: return "Oct"
		case 10: return "Nov"
		case 11: return "Dec"
	}
	
	return ""
}

function dayString(dnum) {
	switch (dnum) {
		case 0: return "Sun"
		case 1: return "Mon"
		case 2: return "Tue"
		case 3: return "Wed"
		case 4: return "Thu"
		case 5: return "Fri"
		case 6: return "Sat"
	}
	
	return ""
}

function timeString(when) {
	var pod = "am"
	
	var hours = when.getHours()
	if (hours == 0) hours = 12
	if (hours > 12) {
		hours = hours - 12
		pod = "pm"
	}

	var mins = when.getMinutes()
	if (mins < 10) mins = "0" + mins
	
	return ""+hours+":"+mins+""+pod
}

Date.prototype.webFormat = function(format) {
	var out = "----"
	
	var today = new Date()
	var offset = today.getTime() - this.getTime()
	// ancient is defined as more than 6 days in the past
	var ancient = (offset > (1000*60*60*24*6))
	
	switch (format) {
		case 1:
		default:
			if (ancient)
				out = ""+monthString(this.getMonth()) + " " + this.getDate()+""
			else {
				if (today.getDate() == this.getDate())
					out = "Today"
				else
					out = dayString(this.getDay())
			}
			out += ", "+timeString(this)+""
	}
	
	return out
}

Date.prototype.setISO8601 = function (string) {
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

	// HFI is running on Pacific Time -- if the servers move to Zulu, reset offset to 0
    var offset = 60*8;
	
    var date = new Date(d[1], 0, 1);

    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
}

Date.prototype.toISO8601String = function (format, offset) {
    /* accepted values for the format [1-6]:
     1 Year:
       YYYY (eg 1997)
     2 Year and month:
       YYYY-MM (eg 1997-07)
     3 Complete date:
       YYYY-MM-DD (eg 1997-07-16)
     4 Complete date plus hours and minutes:
       YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
     5 Complete date plus hours, minutes and seconds:
       YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
     6 Complete date plus hours, minutes, seconds and a decimal
       fraction of a second
       YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)
    */
    if (!format) { var format = 6; }
    if (!offset) {
        var offset = 'Z';
        var date = this;
    } else {
        var d = offset.match(/([-+])([0-9]{2}):([0-9]{2})/);
        var offsetnum = (Number(d[2]) * 60) + Number(d[3]);
        offsetnum *= ((d[1] == '-') ? -1 : 1);
        var date = new Date(Number(Number(this) + (offsetnum * 60000)));
    }

    var zeropad = function (num) { return ((num < 10) ? '0' : '') + num; }

    var str = "";
    str += date.getUTCFullYear();
    if (format > 1) { str += "-" + zeropad(date.getUTCMonth() + 1); }
    if (format > 2) { str += "-" + zeropad(date.getUTCDate()); }
    if (format > 3) {
        str += "T" + zeropad(date.getUTCHours()) +
               ":" + zeropad(date.getUTCMinutes());
    }
    if (format > 5) {
        var secs = Number(date.getUTCSeconds() + "." +
                   ((date.getUTCMilliseconds() < 100) ? '0' : '') +
                   zeropad(date.getUTCMilliseconds()));
        str += ":" + zeropad(secs);
    } else if (format > 4) { str += ":" + zeropad(date.getUTCSeconds()); }

    if (format > 3) { str += offset; }
    return str;
}



//
// Checkbox manipulation
//

function matchMasterCheckboxByPrefix(masterCheckbox, prefix) {
    checkCheckboxesByPrefix(masterCheckbox.form, prefix, masterCheckbox.checked);
}


function checkCheckboxesByPrefix(theForm, prefix, checked) {
    var i = 0;
    for (i = 0; i < theForm.length; i++) {
        if (theForm[i].type == 'checkbox' && theForm[i].name.indexOf(prefix) == 0){
	        theForm[i].checked = checked;
	    }
    }
}
