/*
 * WILDFIRE - the internet content and commerce management and application development suite
 * Copyright (C) 2005-2006 Nick Donald & Colin Redpath
 *
 * For further information visit:
 * 		http://www.spreadwildfire.net
 *
 * File Name: scripts.js
 *
 *
 * File Authors:
 * 		Nick Donald & Colin Redpath (info@spreadwildfire.net)
 */

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 i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].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: "Explorer",
			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();

//alert(BrowserDetect.browser + ' ' + BrowserDetect.version + ' on ' + BrowserDetect.OS);

var ie=document.all;
var nn6=document.getElementById&&!document.all;

var ie7 = BrowserDetect.browser == "Explorer" && BrowserDetect.version == 7;


/*
	Ajax Handlers
*/

// Load an XML document
function loadXMLDoc(uri, callback) {
	var req = null;
	// Native XMLHttpRequest object
    if (window.XMLHttpRequest)
    {
        req = new XMLHttpRequest();
        if (req){
			try {
				//req.onreadystatechange = callback;
	          	req.onreadystatechange = function(){if(req.readyState == 4) doCallback(req, callback)};
				req.open('GET', uri, true);
				req.send(null);
			} catch(e) {
				alert("Unable to send request for data.\n\n" + e.toString());
				delete req;
				req = null;
			}
        }else{
			alert("Unable to create new XMLHTTPRequest object.");
		}
    }else if (window.ActiveXObject){
       	req = new ActiveXObject('Microsoft.XMLHTTP');

        if (req)
        {
			try {
	          	req.onreadystatechange = function(){if(req.readyState == 4) doCallback(req, callback)};
            	req.open('GET', uri, true);
            	req.send();
			}catch(e){
				alert("Unable to send request for data.\n\n" + e.toString());
				delete req;
				req = null;
			}
        }else{
			alert("Unable to create new Microsoft.XMLHTTP ActiveXObject.");
		}
    }

    if (!req)
    {
		alert('Unable to send request for data. Please try again.')
	}
}

function doCallback(http, callback) {
	if (callback != null) eval(callback+"(http)");
}

//Send Form Data
function postData(uri, data) {
	var http = null;
	if(window.XMLHttpRequest) {
		http = new XMLHttpRequest();
	}else if(window.ActiveXObject){
		http = new ActiveXObject("Microsoft.XMLHTTP");
	}

	http.onreadystatechange = function(){if(http.readyState == 4)handleSave(http);};
	http.open("POST", uri, true);
	http.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	http.send(data);
}

function sendViaAjax(form, method, str) {
	var data = "";
	data += addToPost(data,"aj",method);
	data += addToPost(data,"fn",form.name);
	for (var i=0;i<form.elements.length;i++) {
		if (form.elements[i].name != null) {
			if (form.elements[i].type != "checkbox" || form.elements[i].checked) data += addToPost(data, form.elements[i].name, form.elements[i].value);
		}
	}

	if (str) data += "&"+str;
	if (data != "") postData(form.action, data);
}

function addToPost(postdata, key, value) {
	if (value != null) {
		//value = value.toString().replace(/\+/g,"W__I__L__D__F__I__R__E__A__J__A__X__P__L__U__S");
		return (postdata!=""?"&":"")+key+"="+escape(value).replace(/\+/g,"%2B");
	}else return "";
}

function gebi(id) {
	return document.getElementById(id);
}

function startsWith(str, test) {
	return str.indexOf(test) == 0;
}

function endsWith(str, test) {
	return str.indexOf(test) == str.length - test.length;
}

function contains(str, test) {
	return str.indexOf(test) > -1;
}

function addCSS(ob, css) {
	if (!ob) return;
	var classes = ob.className.split(" ");
	var add = true;
	for (var i=0;i<classes.length;i++) {
		if (classes[i] == css) add = false;
	}

	if (add) {
		if (ob.className == "")
			ob.className += css;
		else
			ob.className += " "+css;
	}
}

function remCSS(ob, css) {
	try {
		str = ob.className;
		str = str.replace(css,"");
		str = str.replace(/  /g," ");

		if (ie && (str == "" || str == " ")) {
			ob.removeAttribute("className");
		}else{
			ob.className = str;
		}
	}catch(E){

	}
}

// <select> object methods
function moveOptions(src, dest, sort, max, msg) {
	try {
		if (typeof src  == "string") src  = document.getElementById(src);
		if (typeof dest == "string") dest = document.getElementById(dest);

		if (max && dest.options.length == max)
			return moveOptionsMessage(src, dest, msg);

		var selectedOptions = new Array();

		for(i=0;i<src.options.length;i++) {
			if(src.options[i].selected)
				selectedOptions.push(src.options[i]);
		}

		for (var i=0;i<selectedOptions.length;i++) {
			if (max && dest.options.length == max)
				return moveOptionsMessage(src, dest, msg);

			dest.appendChild(selectedOptions[i]);
		}

		if (sort) sortOptions(dest);

		src.selectedIndex = -1;
		dest.selectedIndex = -1;
	}catch(E){}
}

function moveOptionsMessage(src, dest, msg) {
	src.selectedIndex = -1;
	dest.selectedIndex = -1;
	if (msg) alert(msg);
	return false;
}

function sortOptions(sel){
	var values = new Array();
	for(var i=0;i<sel.options.length;i++){
		var optionArray = new Array(sel.options[i].text, sel.options[i].value);
		values.push(optionArray);
	}

	values = values.sort(alphaSortArray);
	sel.options.length=0;
	for(var i=0;i<values.length;i++){
		var optionArray = values[i];
		sel.options[sel.options.length] = new Option(optionArray[0],optionArray[1]);
	}
}

function alphaSortArray(a,b)
{
	a = a[0];
	b = b[0];
	if (a > b) return 1;
	if (a < b) return -1;
	return 0;
}

//numeric input field operations
function enableNumericInputs() {
	var numericTypes = new Array("Number","Decimal","Currency");
	var allowDecimal = new Array(false, true, true);

	for (var i=0;i<numericTypes.length;i++) {
		//get non negatives
		setNumericInputs(numericTypes[i], allowDecimal[i], false);
		setNumericInputs(numericTypes[i]+"Neg", allowDecimal[i], true);
	}
}

function setNumericInputs(str, allowDecimal, allowNegative) {
	var inp = getElementsByClassName(document, "input", "inp"+str);
	var regExp = new RegExp("[ ]places[0-9]($| )");


	for (var i=0;i<inp.length;i++) {
		var ob = inp[i];
		var decimalPlaces = allowDecimal ? 2 : 0;


		if (nn6 ? regExp.test(ob.className) : match = regExp.exec(ob.className)) {
			if (nn6) match = RegExp.lastMatch;
			var str = nn6 ? match.toString() : match[0];
			decimalPlaces = parseInt(str.substring(7));
		}

		ob.setAttribute("decimalPlaces", decimalPlaces);

		if (ob.attachEvent) {
			ob.attachEvent("onkeydown", function (event) {
				return numericFilter(event.srcElement, event, allowDecimal, allowNegative);
			});
			ob.attachEvent("onkeyup", function (event) {
				return extractNumber(event.srcElement, decimalPlaces, allowNegative);
			});
			ob.attachEvent("onblur", function (event) {
				return extractNumber(event.srcElement, decimalPlaces, allowNegative);
			});
		}else if (ob.addEventListener){
			ob.addEventListener("keypress", function (event){
				if(!numericFilter(this, event, allowDecimal, allowNegative)) event.preventDefault();
			},false);
			ob.addEventListener("keyup", function (event){
				extractNumber(this, decimalPlaces, allowNegative);
			},false);
			ob.addEventListener("blur", function (event){
				extractNumber(this, decimalPlaces, allowNegative);
			},false);
		}
	}
}

function numericFilter(obj, e, allowDecimal, allowNegative) {
	var key;
	var isCtrl = false;
	var keychar;
	var reg;

	if(window.event) {
		// IE
		key = e.keyCode;
		isCtrl = window.event.ctrlKey

		//IE CR catch
		if(key == 190) key = 46;
		if(key == 110) key = 46;

		// catches for IE keypad
		if (key > 95 && key < 106)
			key -= 48;

	}else if(e.which) {
		key = e.which;
		isCtrl = e.ctrlKey;
	}

	if (isNaN(key)) return true;

	keychar = String.fromCharCode(key);

	// check for backspace or delete, or if Ctrl was pressed
	// colinr - added 46 catch for delete key
	if (key == 8 || key == 46 || isCtrl)
		return true;

	if(window.event && key == 9)
		return true;

	reg = /\d/;
	var isFirstN = allowNegative ? keychar == '-' && obj.value.indexOf('-') == -1 : false;
	var isFirstD = allowDecimal ? keychar == '.' && obj.value.indexOf('.') == -1 : false;

	var isnum = reg.test(keychar);

	return isFirstN || isFirstD || reg.test(keychar);
}

// public domain number functions - http://www.mredkj.com/tutorials/validate2.html
function extractNumber(obj, decimalPlaces, allowNegative)
{
	if (obj.getAttribute("decimalPlaces"))

		decimalPlaces = parseInt(obj.getAttribute("decimalPlaces"));



	var temp = obj.value;

	// avoid changing things if already formatted correctly
	var reg0Str = '[0-9]*';
	if (decimalPlaces > 0) {
		reg0Str += '\\.?[0-9]{0,' + decimalPlaces + '}';
	} else if (decimalPlaces < 0) {
		reg0Str += '\\.?[0-9]*';
	}
	reg0Str = allowNegative ? '^-?' + reg0Str : '^' + reg0Str;
	reg0Str = reg0Str + '$';
	var reg0 = new RegExp(reg0Str);
	if (reg0.test(temp)) return true;

	// first replace all non numbers
	var reg1Str = '[^0-9' + (decimalPlaces != 0 ? '.' : '') + (allowNegative ? '-' : '') + ']';
	var reg1 = new RegExp(reg1Str, 'g');
	temp = temp.replace(reg1, '');

	if (allowNegative) {
		// replace extra negative
		var hasNegative = temp.length > 0 && temp.charAt(0) == '-';
		var reg2 = /-/g;
		temp = temp.replace(reg2, '');
		if (hasNegative) temp = '-' + temp;
	}

	if (decimalPlaces != 0) {
		var reg3 = /\./g;
		var reg3Array = reg3.exec(temp);
		if (reg3Array != null) {
			// keep only first occurrence of .
			//  and the number of places specified by decimalPlaces or the entire string if decimalPlaces < 0
			var reg3Right = temp.substring(reg3Array.index + reg3Array[0].length);
			reg3Right = reg3Right.replace(reg3, '');
			reg3Right = decimalPlaces > 0 ? reg3Right.substring(0, decimalPlaces) : reg3Right;
			temp = temp.substring(0,reg3Array.index) + '.' + reg3Right;
		}
	}

	obj.value = temp;

}

/*
    Written by Jonathan Snook, http://www.snook.ca/jonathan
    Add-ons by Robert Nyman, http://www.robertnyman.com
*/
function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }
    }
    return (arrReturnElements)
}

/*
	COOKIE Handling courtesy of http://www.quirksmode.org/js/cookies.html

*/

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

function openWindow(uri, name, width, height, center, left, top, toolbar, resizable, scrollbars, menubar) {

	if (center) {
		left = (screen.width) ? (screen.width-width)/2 : 0;
		top  = (screen.height) ? (screen.height-height)/2 : 0;
	}

	var params = "width="+width+",height="+height;

	if (left) params += ",left="+left;
	if (top)  params += ",top="+top;

	params += ",menubar="+(menubar ? 1 : 0);
	params += ",toolbar="+(toolbar ? 1 : 0);
	params += ",resizable="+(resizable ? 'yes' : 'no');
	params += ",scrollbars="+(scrollbars ? 'yes' : 'no');

	mywin = window.open(uri,name,params);
	mywin.focus();
}

function openModalWindow(uri, name, width, height, center, left, top, toolbar, resizable, scrollbars, menubar) {
	 if (document.getElementById) {

var err = 0;

		try {
			var winWidth = nn6 ? innerWidth : document.documentElement.clientWidth;
			var winHeight = nn6 ? innerHeight : document.documentElement.clientHeight;

			var mask	= document.createElement("div");
			mask.id		= "windowMask";
			mask.style.width	= winWidth+"px";
			mask.style.height	= winHeight+"px";

			//alert(document.documentElement.clientHeight);

			var iFrame	= document.createElement("iframe");
			iFrame.scrolling = "no";
			iFrame.frameBorder = "no";

			if (ie) iFrame.src = uri;

			iFrame.name = "windowMaskFrm";

			var vScroll = document.documentElement.scrollTop;
err = 1;

			iFrame.style.position = "absolute";
			iFrame.style.display = "block";
			iFrame.style.visibility = "visible";

			iFrame.style.top = ((winHeight - height)/2 + vScroll) + "px";
			iFrame.style.left = (winWidth - width)/2 + "px";

			//alert(iFrame.style.left);

			iFrame.style.width = width+"px";
			iFrame.style.height = height+"px";

			iFrame.style.borderTop = "2px solid #666";
			iFrame.style.borderRight = "2px solid #111";
			iFrame.style.borderBottom = "2px solid #111";
			iFrame.style.borderLeft = "2px solid #666";

err = 2;

			document.body.appendChild(mask);

err = 3;

			var opac = mask.cloneNode(false);
			opac.className = "windowMask";
			opac.style.background = "#000";
			mask.appendChild(opac);
			mask.appendChild(iFrame);

err = 4;
			if (nn6)
				window.frames["windowMaskFrm"].location.href = uri;

err = 5;

		}catch(E){
			alert(E + "(" + err + ")");
		}

	 }else openWindow(uri, name, width, height, center, left, top, toolbar, resizable, scrollbars, menubar);
}

function setDateTime() {
	var d = getElementsByClassName(document, "select", "date_day");
	var m = getElementsByClassName(document, "select", "date_month");
	var y = getElementsByClassName(document, "select", "date_year");
	var H = getElementsByClassName(document, "input", "date_hours");
	var M = getElementsByClassName(document, "input", "date_minutes");

	var date = new Date();
	setDateTimeSelect(d, date.getDate());
	setDateTimeSelect(m, date.getMonth()+1);
	setDateTimeSelect(y, date.getFullYear());
	setDateTimeSelect(H, padZero(date.getHours()));
	setDateTimeSelect(M, padZero(date.getMinutes()));
}

function padZero(v) {
	return v < 10 ? "0"+v : v;
}

function setDateTimeSelect(c, v) {
	for (var i=0;i<c.length;i++) {
		c[i].value = v;
	}
}

function setDays(form) {
	year = parseInt(form.year.options[form.year.selectedIndex].value);
	month = form.month.selectedIndex;
	day = form.day.selectedIndex;
	form.day.options.length = 0;
	var days = new Array(31, ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	for(i = 0; i < days[month]; i++)
	{
		form.day.options.length = form.day.options.length + 1;
		form.day.options[i].value = i + 1;
		form.day.options[i].text = i + 1;
	}
	form.day.selectedIndex = (day < form.day.options.length) ? day : form.day.options.length - 1;
}

function textInputClassHandler(ob, offSwitch, offClass, refill) {

	if (ob.value == offSwitch && !refill) {
		ob.value = "";
		ob.removeAttribute("className");
	}else if (ob.value == "" && refill) {
		ob.value = offSwitch;
		ob.className = offClass;
	}
}

