var old_values = new Array();
var _btn_can_submit = true;

Array.prototype.in_array = function(search_term) {
  	var i = this.length;
  	if (i > 0) {
	 	do {
			if (this[i] == search_term) { return true; }
	 	} while (i--);
  	}
  	return false;
}

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) || "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var kdl=0; kdl<data.length; kdl++)	{
			var dataString = data[kdl].string;
			var dataProp = data[kdl].prop;
			this.versionSearchString = data[kdl].versionSearch || data[kdl].identity;
			if (dataString) {
				if (dataString.indexOf(data[kdl].subString) != -1) { return data[kdl].identity; }
			} else if (dataProp) { return data[kdl].identity; }
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) { return; }
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "msie",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

var browser = BrowserDetect.browser;
var browser_version = BrowserDetect.version;
var user_os = BrowserDetect.OS;

//alert("Browser detected as: " + browser + ", version: " + browser_version + " on OS: " + user_os);


function urlencode(str) {
	var valid = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_.!~*'()";					// RFC2396 Mark characters
	var hexchars = "0123456789ABCDEF";
	var newstr = "";

	for (var i=0; i < str.length; i++) {
		var ch = str.charAt(i);
	    	if (ch == " ") {
		    	newstr += "+";
		} else if (valid.indexOf(ch) != -1) {
		    	newstr += ch;
		} else {
		    	var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
			    	newstr += "+";
			} else {
				newstr += "%";
				newstr += hexchars.charAt((charCode >> 4) & 0xF);
				newstr += hexchars.charAt(charCode & 0xF);
			}
		}
	}

	return newstr;
}

function urldecode(str) {
   	var hexchars = "0123456789ABCDEFabcdef";
   	var newstr = "";
   	var i = 0;
   	while (i < str.length) {
       	var ch = str.charAt(i);
	   	if (ch == "+") {
	       	newstr += " ";
		   	i++;
	   	} else if (ch == "%") {
			if (i < (str.length-2) && hexchars.indexOf(str.charAt(i+1)) != -1 && hexchars.indexOf(str.charAt(i+2)) != -1 ) {
				newstr += unescape( str.substr(i,3) );
				i += 3;
			} else {
				newstr += "%[ERROR]";
				i++;
			}
		} else {
		   	newstr += ch;
		   	i++;
		}
	}

   	return newstr;
}

function setSelectElements(selectid,values,details)  {
	//sets the options for the specified select according to the values and details passed in
	//also selects the first option
	var sel = document.getElementById(selectid);
	var vals = values.split('|');
	var dets = details.split('|');

	//resize the select
	sel.length = vals.length;

	//add the new entries
	for (var i=0; i<vals.length; i++)  {
		sel.options[i].value = vals[i];
		sel.options[i].text = dets[i];
	}

	//select the 1st option
	sel.options[0].selected = true;
}

function updateSelection(chkboxid,qtyboxid,qty) {
	var chkbox = document.getElementById(chkboxid);
	var qtybox = document.getElementById(qtyboxid);

	if (!chkbox || !qtybox) {
		return;
	}

	chkbox.checked = true;

	if (isNaN(qtybox.value) || qtybox.value === '' || qtybox.value < 1) {
		qtybox.value = qty;
	}
}

function validateSelection(chkboxid,qtyboxid) {
	var chkbox = document.getElementById(chkboxid);
	var qtybox = document.getElementById(qtyboxid);

	if (!chkbox || !qtybox) {
		return;
	}

	if (isNaN(qtybox.value) || qtybox.value === '' || qtybox.value < 1) {
		qtybox.value = '';
		chkbox.checked = false;
	}
}

function selectRadio(eids) {
	var eid = eids.split('|');
	for (var i=0; i<eid.length; i++) {
		if (document.getElementById(eid[i])) {
			document.getElementById(eid[i]).checked = true;
		}
	}

	return false;
}

/**
 * Submit a form and optionally set form values
 *
 * @var required string fid (the id of the form to submit)
 * @var optional string att (the form values to set)
 *		ex. "name::Blah||destination::/members/index.php" would set the form values for "name" and "destination" to "Blah" and "/members/index.php" respectively.
 */
function submitForm(fid,att) {
	var f = document.getElementById(fid);
	
	if (att && att != '') {
		var __a = att.split('||');
		var __b;
		for (var i=0; i<__a.length; ++i) {
			__b = __a[i].split('::');
			
			if (__b.length == 2) {
				var __z = document.getElementById(__b[0]);
				if (__z) __z.value = __b[1];
			}
		}
	}
	
	if (f && ((f.onsubmit && f.onsubmit()) || !f.onsubmit)) f.submit(); 
	
	return false;
}

function displaySection(hide, show) {
	var hidden = hide.split('|');
	var i;
	
	for (i=0; i<hidden.length; i++) {
		if (document.getElementById(hidden[i])) {
			document.getElementById(hidden[i]).style.display = 'none';
		}
	}

	var shown = show.split('|');
	for (i=0; i<shown.length; i++) {
		if (document.getElementById(shown[i])) {
			document.getElementById(shown[i]).style.display = 'block';
		}
	}

	return false;
}

var section_panel_groups = new Array();
function displaySectionLimited(hide, show, group) {
	var g = section_panel_groups[group];
	if (g) displaySection(g[0], g[1]);
	section_panel_groups[group] = new Array(show, hide);
	return displaySection(hide, show);
}

function enableButton(ch,enable,disable) {
	var chbox = document.getElementById(ch);

	if (chbox.checked) {
		displaySection(enable, disable);
	} else {
		displaySection(disable, enable);
	}
}

function getImageDimensions(imgid) {
	var img = document.getElementById(imgid);
	var dim = new Array();

	if (!img) { return false; }

	var tmp = new Image();
	tmp.src = img.src;

	dim[0] = tmp.width;
	dim[1] = tmp.height;

	return dim;
}

function createSlaveIFrame(fid) {
	var ifwin = document.getElementById(fid);

	// Check to see if the element exists
	if (ifwin) { return; }

	// Create the new element
	var newwin = document.createElement('iframe');
	newwin.id = fid;
	newwin.frameborder = 0;
	newwin.marginhight = 0;
	newwin.marginwidth = 0;
	newwin.width = 1;
	newwin.height = 1;
	newwin.style.margin = 0;
	newwin.style.padding = 0;
	newwin.src = '/blank.htm';

	// Append the element to the body
	var mybody = document.getElementsByTagName("body")[0];
	mybody.appendChild(newwin);
}

function firePixel(url) {
	try {
		//alert(url);
	
		var pixel_image = document.createElement('img');
		pixel_image.src = url;
		pixel_image.width = 1;
		pixel_image.height = 1;

		// Append the element to the body
		var mybody = document.getElementsByTagName("body")[0];
		mybody.appendChild(pixel_image);
	} catch (err) {}
}

function resizeImg(imgid,maxw,maxh) {
	var img = document.getElementById(imgid);
	var dim = getImageDimensions(imgid);

	if (maxw === '') {
		maxw = 0;
	}
	if (maxh === '') {
		maxh = 0;
	}

	if (!dim || !img) {
		return false;
	}

	var w = dim[0];
	var h = dim[1];
	var new_w;
	var new_h;

	if (maxw > 0 && maxh > 0 && maxw < w && maxh < h) {
		new_w = maxw;
		new_h = Math.ceil(new_w * h / w);
		if (new_h > maxh) {
			new_h = maxh;
			new_w = Math.ceil(new_h * w / h);
		}
	} else if (maxw > 0 && maxw < w) {
		new_w = maxw;
		new_h = Math.ceil(new_w * h / w);
	} else if (maxh > 0 && maxh < h) {
		new_h = maxh;
		new_w = Math.ceil(new_h * w / h);
	} else {
		new_w = 'auto';
		new_h = 'auto';
	}

	if (new_w == 'auto') {
		img.style.width = new_w;
		img.style.height = new_h;
	} else {
		img.style.width = new_w + "px";
		img.style.height = new_h + "px";
	}

	return true;
}

function replaceImgSrc(dest_id,src_id,maxw,maxh) {
	var img = document.getElementById(dest_id);
	var isrc = document.getElementById(src_id);

	if (!img || !isrc) {
		return false;
	}

	img.style.display = 'none';

	img.src = isrc.value;

	resizeImg(dest_id,maxw,maxh);

	img.style.display = 'block';

	return false;
}

function doImageSwap(img_id,img_src) {
	var im = document.getElementById(img_id);
	
	if (im) {
		im.src = img_src;
	}
}


function resetValue(eids,val) {
	var eid = eids.split('|');
	for (var i=0; i<eid.length; i++) {
		if (document.getElementById(eid[i])) {
			if (document.getElementById(eid[i]).value !== '' || document.getElementById(eid[i]).value !== 0) {
				old_values[eid[i]] = document.getElementById(eid[i]).value;
			}
			document.getElementById(eid[i]).value = val;
		}
	}

	return false;
}

function restoreValue(eids) {
	var eid = eids.split('|');
	for (var i=0; i<eid.length; i++) {
		if (document.getElementById(eid[i])) {
			if (old_values[eid[i]]) {
				document.getElementById(eid[i]).value = old_values[eid[i]];
			}
		}
	}

	return false;
}

function setDisabled(enable,disable) {
	var enabled = enable.split('|');
	var i;
	for (i=0; i<enabled.length; i++) {
		if (document.getElementById(enabled[i])) {
			document.getElementById(enabled[i]).disabled = false;
		}
	}

	var disabled = disable.split('|');
	for (i=0; i<disabled.length; i++) {
		if (document.getElementById(disabled[i])) {
			document.getElementById(disabled[i]).disabled = true;
		}
	}

	return false;
}

function setDisableClass(disableclass,enable,disable) {
	var enabled = enable.split('|');
	var i;
	for (i=0; i<enabled.length; i++) {
		if (document.getElementById(enabled[i])) {
			document.getElementById(enabled[i]).className = document.getElementById(enabled[i]).className.replace(disableclass,' ');
		}
	}

	var disabled = disable.split('|');
	for (i=0; i<disabled.length; i++) {
		if (document.getElementById(disabled[i])) {
			document.getElementById(disabled[i]).className = document.getElementById(disabled[i]).className.replace(disableclass,' ');
			document.getElementById(disabled[i]).className += ' ' + disableclass + ' ';
		}
	}

	return false;
}

function changeClass(e,s,r) {
	var elem = e.split('|');
	var search = s.split('|');
	var me;

	for (var i=0; i<elem.length; i++) {
		me = document.getElementById(elem[i]);
		if (me) {
			for (var j=0; j<search.length; j++) {
				me.className = me.className.replace(" " + search[j] + " "," " + r + " ");
			}
		}
	}

	return false;
}

function updateTabs(enable,enable_class,disable,disable_class) {
	changeClass(enable,disable_class,enable_class);
	changeClass(disable,enable_class,disable_class);

	return false;
}

function updateMultiTabs(enable,enable_class,half_on,half_on_class,half_off,half_off_class,disable,disable_class,remove_class) {
	changeClass(enable,disable_class + "|" + half_on_class + "|" + half_off_class + "|" + remove_class,enable_class);
	changeClass(half_on,disable_class + "|" + enable_class + "|" + half_off_class + "|" + remove_class,half_on_class);
	changeClass(half_off,disable_class + "|" + enable_class + "|" + half_on_class + "|" + remove_class,half_off_class);
	changeClass(disable,enable_class + "|" + half_on_class + "|" + half_off_class + "|" + remove_class,disable_class);

	return false;
}

function doCheckboxes(e,ref_prefixes) {
	var ref_prefix = ref_prefixes.split('|');
	var prefix;
	var i=0;
	var maxi=0;
	var field;

	for (var j=0; j<ref_prefix.length; j++) {
		prefix = ref_prefix[j].split('::');

		if (prefix.length > 1) {
			for (var k=1; k<=maxi; k++) {
				i=1;
				field = document.getElementById(prefix[0]+k+prefix[1]+i);

				while (field !== null) {
					field.checked = e.checked;
					i++;
					field = document.getElementById(prefix[0]+k+prefix[1]+i);
				}
			}
		} else {
			i=1;
			field = document.getElementById(prefix[0]+i);

			while (field !== null) {
				field.checked = e.checked;
				i++;
				field = document.getElementById(prefix[0]+i);
			}

			if (i>maxi) { maxi = i; }
		}
	}

	return false;
}

function updateMasterCheckbox(masterid,e,force) {
	var master = document.getElementById(masterid);

	if (force) {
		if (master) {
			master.checked = e.checked;
		}
	} else {
		if (master && master.checked) {
			master.checked = false;
		}
	}

	return false;
}

function compilePrefixList(prefix) {
	var pre = prefix.split('|');
	var p_list = '';
	for (var i=0; i<pre.length; i++) {
		for (var j=1; document.getElementById(pre[i] + j); j++) {
			if (p_list !==  '') {
				p_list += '|';
			}
			p_list += pre[i] + j;
		}
	}

	return p_list;
}

function displayTableSection(hide, show) {
	var display_var = '';
	var i;

	if (browser == 'msie') {
		display_var = 'block';
	} else {
		display_var = 'table-row-group';
	}

	var hidden = hide.split('|');
	for (i=0; i<hidden.length; i++) {
		if (document.getElementById(hidden[i])) {
			document.getElementById(hidden[i]).style.display = 'none';
		}
	}

	var shown = show.split('|');
	for (i=0; i<shown.length; i++) {
		if (document.getElementById(shown[i])) {
			document.getElementById(shown[i]).style.display = display_var;
		}
	}

	return false;
}

function displayTableSections(hide_prefix, show_prefix) {
	var h_list = compilePrefixList(hide_prefix);
	var s_list = compilePrefixList(show_prefix);

	return displayTableSection(h_list,s_list);
}

function displaySections(hide_prefix, show_prefix) {
	var h_list = compilePrefixList(hide_prefix);
	var s_list = compilePrefixList(show_prefix);

	return displaySection(h_list,s_list);
}

function updateMasterToggle(h,s) {
	if (document.getElementById(s) && document.getElementById(s).style.display == 'none') {
		displaySection(h,s);
	}

	return false;
}

//sets the count of how many characters are left in a text or area input field that has a max limit indicator
//will not let them enter any more characters into the field if the max limit has been reached.
function textCounter(txtFieldId, cntFieldId, maxLimit, errorFieldId) {
	//alert('textid:' + txtFieldId + '&countid:' + cntFieldId + '&errorid:' + errorFieldId);
	var fieldValue = document.getElementById(txtFieldId).value;

	document.getElementById(cntFieldId).innerHTML = maxLimit - fieldValue.length;
	if (fieldValue.length > maxLimit){
		document.getElementById(errorFieldId).innerHTML = 'Warning! ' + (maxLimit) + ' char limit exceeded.';
	}else{
		document.getElementById(errorFieldId).innerHTML = '';
	}
}

// advanced version of textCounter with the ability to add counts from multiple fields together for a combined outcome
function multiTextCounter(txtFieldIds, cntFieldIds, maxLimit, errorFieldIds) {
	var len = 0;
	var pop = 0;
	var toadd;
	var i;

	// get the combined count together
	var tids = txtFieldIds.split('|');
	for (i=0; i<tids.length; i++) {
		toadd = document.getElementById(tids[i]).value.length;
		if (toadd > 0) {
			pop++;
		}
		len += toadd;
		if (pop > 1 && toadd > 0) {
			len++;
		}
	}

	// get the count status
	var diff = maxLimit - len;

	// write out the count status to the appropriate locations
	var cids = cntFieldIds.split('|');
	for (i=0; i<cids.length; i++) {
		document.getElementById(cids[i]).innerHTML = diff;
	}

	// determine the warning
	var warn = (diff < 0) ? 'Warning! ' + (maxLimit) + ' char limit exceeded.' : '';

	// display the error if necessary
	var eids = errorFieldIds.split('|');
	for (i=0; i<eids.length; i++) {
		document.getElementById(eids[i]).innerHTML = warn;
	}
}

function clearField(fid,def) {
	var field = document.getElementById(fid);

	if (field) {
		// only clear the field if the default is there
		if (field.value == def) {
			field.value = '';
		}
	}
}

function disableSubmit(bid) {
    if (_btn_can_submit) {
    	var btn = document.getElementById(bid);

    	if (btn) {
        	btn.disabled = true;
    	}
        _btn_can_submit = false;
    }

    return false;
}

function testField(fid,val) {
	var f = document.getElementById(fid);

	if (f) {
		if (f.value == val) {
			f.value = '';
			f.style.color = '#000000';
		}
	}
}

function populateField(fid,val) {
	var f = document.getElementById(fid);

	if (f) {
		if (f.value === '') {
			f.value = val;
			f.style.color = '#808284';
		}
	}
}

// switch action in quickbar search form
function quickbar_search_setaction()
{
	var whichone = document.getElementById("quickbar_searchwhat");
	var formname = document.getElementById("top_search_form");
	var searchfield = document.getElementById("searchfield_input");

	whichone = whichone.options[whichone.selectedIndex].value;

	if (whichone == 'knowledgebase') {
		formname.action = "/members/support/transfer.php";
		searchfield.name = "p_search_text";
	} else {
		formname.action = "/members/catalog/search/search.php";
		searchfield.name = "filters[match]";
	}
}

function setSearchFilterParams(){
	if(window.getSearchFilterParams){
		var formname = document.getElementById("top_search_form");
		var whichone = document.getElementById("quickbar_searchwhat");

		if(whichone != 'knowledgebase'){
			formname.action = formname.action + '?' + getSearchFilterParams();
		}
	}

	return true;
}

function isTaxIdNeeded(t,tid,tidb) {
	var td = document.getElementById(tid);
	var tdb = document.getElementById(tidb);
	
	if (td && tdb) {
		switch (t.options[t.selectedIndex].value) {
			case 'AK':
			case 'DE':
			case 'MT':
			case 'NH':
			case 'OR':
			case '':
				tdb.style.display = 'none';
				td.value = '000';
			break;
			default:
				td.value = '';
				tdb.style.display = 'inline';
		}
	}
}

/**
 * Take an array of options and populate a specified select box.
 *
 * @param string dest_id (the id of the destination select element)
 * @param array arr_new_options (a js array of elements to put into the select box.  This value can be one of the following:
 		* a single dimension array, i.e. Array('blah','foo','bar') where the element is both the text and the value
 		* a 2 dimensional array, i.e. 
 			
 			var val = new Array();
 			val[0] = new Array();
 			val[0]['text'] = 'blah';
 			val[0]['value'] = '1';
 			
 			This format will set the appropriate text and value in the option.
 * @param bool replace_options (If true, this will remove the current options and populate it with the new options.  If false, the new options will be added after the current options.)
 * @param bool selected_val (a comma-delimited list of values that should show up as selected)
 * @param bool make_empty (If true, this will create an empty option at the beginning of the list.  This will only occur if the current options are being replaced and the number of new options is not equal to 1.)
 * @return bool (always false)
 */
function buildOptions(dest_id, arr_new_options, replace_options, selected_val, make_empty) {
	var dest = document.getElementById(dest_id);
	
	if (dest) {
		if (replace_options) dest.options.length = 0;
		
		if (arr_new_options) {
			if (dest.options.length == 0 && arr_new_options.length != 1 && !make_empty) {
				dest.options[dest.options.length] = new Option('', '');
			}
			
			var sel = (selected_val) ? selected_val.split(',') : new Array();
			
			for (var j=0; j<arr_new_options.length; ++j) {
				__mylen = dest.options.length;
				if (arr_new_options[j]['text']) {
					dest.options[__mylen] = new Option(arr_new_options[j]['text'], arr_new_options[j]['value']);
					if (sel.in_array(arr_new_options[j]['value'])) {
						dest.options[__mylen].selected = true;
					}
				} else {
					dest.options[__mylen] = new Option(arr_new_options[j], arr_new_options[j]);
					if (sel.in_array(arr_new_options[j])) {
						dest.options[__mylen].selected = true;
					}
				}
			}
		}
		
		if (dest.options.length > 0) return true;
	}
	
	return false;
}

/**
 * Add the specified value to a comma-delimited list in an html element.
 *
 * @param string field_id (the id of the html element where the current list is located.)
 * @param string new_val (the value to add to the list)
 * @return bool (return true if the value was added to the list)
 */
function aggregateValueList(field_id, new_val) {
	var field = document.getElementById(field_id);
	
	if (field && new_val != '') {
		if (field.value != '') field.value += ',';
		field.value += new_val;
		
		return true;
	}
	
	return false;
}