var baseelement = document.getElementsByTagName('base')[0];
var uripath = '/';
if (baseelement) {
	uripath = baseelement.href;//.replace(/sandbox\/([^\/]+)\/?/,'');
}

var cf = window.cf || {};
var ccms = window.ccms || {};

cf.loadEvents = [];

// array update / merge function
ccms.extend = ccms.update = function(destination, source) {
	for (var property in source) {
		destination[property] = source[property];
	}
	return destination;
};

ccms.async = ccms.async || {};

function cfStartup() {
	for (var i = 0; i < cf.loadEvents.length; ++i)
		(cf.loadEvents[i])();
	if (typeof setupZoom == 'function') {
		setupZoom();
	}
}

cf.addLoadEvent = function(callback) {
	cf.loadEvents[cf.loadEvents.length] = callback;
}

cf.addLoadEvent(function() {
	var anchors = document.getElementsByTagName('a');
	for (i = 0; i < anchors.length; ++i) {
		anchor = anchors[i];
		if (anchor.rel == 'offsite') {
			anchor.onclick = function(e) {return clickURI(uripath+'go.php?id='+this.id.replace(/cplink\d+_/, '')+'&url='+escape(this.href), 0);};
		}
		else if (anchor.rel == 'offsite-popup') {
			anchor.onclick = function(e) {return clickURI(uripath+'go.php?id='+this.id.replace(/cplink\d+_/, '')+'&url='+escape(this.href), 1);};
		}
		else if (anchor.rel == 'popup') {
			anchor.onclick = function(e) {return clickURI(this.href, 1);};
		}
		else if (anchor.rel == 'helpfile') {
			anchor.onclick = function(e) {_launchHelp(this.href); return false;};
		}
		else if (anchor.rel == 'external') {
			anchor.onclick = function(e) {window.open(this.href); return false;};
			if (anchor.title == '') {
				anchor.title = 'External Link: ' + anchor.href;
			}
		}
	}
	
	var d = new Date();
	var humanoid = document.getElementById('humanoid');
	if (humanoid) {
		humanoid.value = d.getTime();
	}
	var humanoids = document.getElementsByTagName('input');
	for (var i = 0; i < humanoids.length; i++) {
		if (humanoids[i].name == 'humanoid') {
			humanoids[i].value = d.getTime();
		}
	}
	
	initTextAreas();
});

function initTextAreas() {
	var textareas, t, i;
	textareas = document.body.getElementsByTagName('textarea');
	for(i = 0; i < textareas.length; ++i) {
		t = textareas[i];
		if (!cf.dom.hasClass(t, 'RichTextEditable') && cf.dom.hasClass(t, 'SpellChecked')) {
			var b = document.createElement('input');
			b.setAttribute('class', 'button');
			b.setAttribute('type', 'button');
			b.setAttribute('value', 'Check Spelling');
			if (t.nextSibling) t.parentNode.insertBefore(b, t.nextSibling);
			else t.parentNode.appendChild(b);
			b.onclick = openSpellChecker.partial(t);
		}
	}
}

// object inheritance/extension utility function. http://javascript.crockford.com/prototypal.html
cf.object = function(o) {
	function F() {}
	F.prototype = o;
	return new F();
};

// array update / merge function
cf.extend = cf.update = function(destination, source) {
	for (var property in source) {
		destination[property] = source[property];
	}
	return destination;
};

cf.arrayOf = function(iterable) {
	var results = [];
	if (!iterable) {return results;}
	if (iterable.toArray) {
		return iterable.toArray();
	}
	else {
		for (var i = 0; i < iterable.length; i++) {
			results[results.length] = iterable[i];
		}
		return results;
	}
};

if (typeof YAHOO == 'object' && typeof YAHOO.util.Dom == 'object') {
	cf.dom = YAHOO.Dom;
}
else {
	cf.dom = (function() {
		var reClassNameCache = {};

		var getClassRegEx = function(className) {
			var re = reClassNameCache[className];
			if (!re) {
				re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');
				reClassNameCache[className] = re;
			}
			return re;
		};

		return {
			// hide a node
			hide: function(e) {
				if (typeof e == 'string')
					e = $(e);
				e.style.display = 'none';
			},
			// show a node
			show: function(e, style) {
				if (typeof e == 'string')
					e = $(e);
				if (style) e.style.display = style;
				else e.style.display = '';
			},
	        get: function(el) {
	            if (el && (el.tagName || el.item)) { // HTMLElement, or HTMLCollection
	                return el;
	            }

	            if (typeof el == 'string' || !el) { // HTMLElement or null
	                return document.getElementById(el);
	            }
            
	            if (el.length !== undefined) { // array-like 
	                var c = [];
	                for (var i = 0, len = el.length; i < len; ++i) {
	                    c[c.length] = $(el[i]);
	                }
                
	                return c;
	            }

	            return el; // some other object, just pass it back
	        },
	        getElementsByClassName: function(className, tag, root, apply) {
	            tag = tag || '*';
	            root = (root) ? $(root) : null || document.body; 
	            if (!root) {
	                return [];
	            }

	            var nodes = [],
	                elements = root.getElementsByTagName(tag),
	                re = getClassRegEx(className);

	            for (var i = 0, len = elements.length; i < len; ++i) {
	                if ( re.test(elements[i].className) ) {
	                    nodes[nodes.length] = elements[i];
	                    if (apply) {
	                        apply.call(elements[i], elements[i]);
	                    }
	                }
	            }
            
	            return nodes;
	        },
	        hasClass: function(el, className) {
	            var re = getClassRegEx(className);

	            var f = function(el) {
	                return re.test(el.className);
	            };
            
	            return cf.dom.batch(el, f, cf.dom, true);
	        },
	        addClass: function(el, className) {
	            var f = function(el) {
	                if (this.hasClass(el, className)) {
	                    return false; // already present
	                }


	                el.className = [el.className, className].join(' ').trim();
	                return true;
	            };

	            return cf.dom.batch(el, f, cf.dom, true);
	        },
	        removeClass: function(el, className) {
	            var re = getClassRegEx(className);

	            var f = function(el) {
	                if (!className || !this.hasClass(el, className)) {
	                    return false; // not present
	                }                 


	                var c = el.className;
	                el.className = c.replace(re, ' ');
	                if ( this.hasClass(el, className) ) { // in case of multiple adjacent
	                    this.removeClass(el, className);
	                }

	                el.className = el.className.trim(); // remove any trailing spaces
	                return true;
	            };

	            return cf.dom.batch(el, f, cf.dom, true);
	        },
	        batch: function(el, method, o, override) {
	            el = (el && (el.tagName || el.item)) ? el : $(el); // skip $() when possible

	            if (!el || !method) {
	                return false;
	            } 
	            var scope = (override) ? o : window;
            
	            if (el.tagName || el.length === undefined) { // element or not array-like 
	                return method.call(scope, el, o);
	            } 

	            var collection = [];
            
	            for (var i = 0, len = el.length; i < len; ++i) {
	                collection[collection.length] = method.call(scope, el[i], o);
	            }
            
	            return collection;
	        }
		
		};
	})();
}

$ = cf.dom.get;
cf.getElementsByClassName = cf.dom.getElementsByClassName;

cf.dom.getElementByClassName = function(className, tagName, root, apply) {
	var nodes = cf.dom.getElementsByClassName(className, tagName, root, apply);
	if (nodes.length) return nodes[0];
	return null;
};

cf.event = cf.event || {};

cf.event.killEvent = function(ev) {
    if (ev.stopPropagation) {
        ev.stopPropagation();
    } else {
        ev.cancelBubble = true;
    }
    if (ev.preventDefault) {
        ev.preventDefault();
    } else {
        ev.returnValue = false;
    }
	return false;
};

/* Old
cf.event.attach = function( obj, type, fn ) {
	if (obj.addEventListener) {
		obj.addEventListener( type, fn, false );
		EventCache.add(obj, type, fn);
	}
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
		EventCache.add(obj, type, fn);
	}
	else {
		obj["on"+type] = obj["e"+type+fn];
	}
};
*/

cf.event.attach = function( el, type, fn, o, overrideContext ) {
	var obj = el;
	if (overrideContext) {
		if (overrideContext === true) obj = o;
		else obj = overrideContext;
	}
	var wrappedFn = function(e) {
		return fn.call(obj, e, o);
	};
	if (el.addEventListener) {
		el.addEventListener( type, wrappedFn, false );
		EventCache.add(el, type, wrappedFn);
	}
	else if (el.attachEvent) {
		el["e"+type+wrappedFn] = wrappedFn;
		el[type+wrappedFn] = function() { el["e"+type+wrappedFn]( window.event ); }
		el.attachEvent( "on"+type, el[type+wrappedFn] );
		EventCache.add(el, type, wrappedFn);
	}
	else {
		obj["on"+type] = obj["e"+type+wrappedFn];
	}
};


var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();

cf.event.attach(window, 'unload', EventCache.flush);

cf.event.getTarget = function(event) {
	var element;
	if (!event) {
		event = window.event;
	}
	if (event.target) {
		if (event.target.nodeType == 3) {
			element = event.target.parentNode;
		}
		else {
			element = event.target;
		}
	}
	else {
		element = event.srcElement;
	}
	return element;
};

// class that calls a function when a condition (another function) becomes true.
cf.Poller = function(condition, callback, timeout) {
	timeout = timeout || 500;
	var interval  = false;

	function test() {
		if (condition()) {
			window.clearInterval(interval);
			interval = false;
			callback();
		}
	}
	
	self.start = function() {
		if (interval === false)
			interval = window.setInterval(test, timeout);
	}
	
	self.cancel = function() {
		if (interval !== false) {
			window.clearInterval(interval);
			interval = false;
		}
	}
	
	self.start();
}

cf.when = function(condition, callback, timeout) {return new cf.Poller(condition, callback, timeout);};


// convert a value to an integer, also returning zero if NaN (like PHP does). This is useful for more
// than just strings, so it's not a method on String prototype.
function intval(value) {
	value = parseInt(value, 10);
	if (isNaN(value)) {
		value = 0;
	}
	return value;
}

/*
 * We add some useful methods to the String object
 */

String.prototype.trim = function(chars) {
	if (typeof chars == 'undefined')
		chars = '\\s';
	return this.ltrim(chars).rtrim(chars);
};
String.prototype.ltrim = function(chars) {
	if (typeof chars == 'undefined')
		chars = '\\s';
	var rx = new RegExp('^[' + chars + ']*(.*?)$');
	return this.replace(rx, '$1');
};
String.prototype.rtrim = function(chars) {
	if (typeof chars == 'undefined')
		chars = '\\s';
	var rx = new RegExp('^(.*?)[' + chars + ']*$');
	return this.replace(rx, '$1');
};

String.prototype.stripTags = function() {
  return this.replace(/<\/?[^>]+>/gi, '');
};

String.prototype.escapeHTML = function() {
  var div = document.createElement('div');
  var text = document.createTextNode(this);
  div.appendChild(text);
  return div.innerHTML;
};

String.prototype.unescapeHTML = function() {
  var div = document.createElement('div');
  div.innerHTML = this.stripTags();
  return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
};

String.prototype.parseJSON = function () {
	return eval('(' + this + ')');
	
	try {
		return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
			this.replace(/"(\\.|[^"\\])*"/g, ''))) &&
			eval('(' + this + ')');
	}
	catch (e) {
		return false;
	}
};

Function.prototype.bind = function() {
	var __method = this;
	var args = cf.arrayOf(arguments);
	var object = args.shift();
	return function() {
		return __method.apply(object, args.concat(cf.arrayOf(arguments)));
	}
}
Function.prototype.partial = function() {
	var __method = this;
	var args = cf.arrayOf(arguments);
	return function() {
		return __method.apply(this, args.concat(cf.arrayOf(arguments)));
	}
}
Function.prototype.rpartial = function() {
	var __method = this;
	var args = cf.arrayOf(arguments);
	return function() {
		return __method.apply(this, cf.arrayOf(arguments).concat(args));
	}
}

Function.prototype.method = function(name,fn) {
	this.prototype[name] = fn;
	return this;
};

if (!Array.prototype.forEach) {
	Array.method('forEach', function(fn, thisObj) {
		var scope = thisObj || window;
		for (var i = 0, j = this.length; i < j; ++i) {
			fn.call(scope, this[i], i, this);
		}
	});
}
Array.prototype.foreach = Array.prototype.forEach;

ccms.extend(ccms.async, {
	
	// create an XMLHttpRequest object
	getXMLHttpRequest: function () {
	    var self = arguments.callee;
	    if (!self.XMLHttpRequest) {
	        var tryThese = [
	            function () {return new XMLHttpRequest();},
	            function () {return new ActiveXObject('Msxml2.XMLHTTP.6.0');},
	            function () {return new ActiveXObject('Msxml2.XMLHTTP');},
	            function () {return new ActiveXObject('Microsoft.XMLHTTP');},
	            function () {return new ActiveXObject('Msxml2.XMLHTTP.4.0');},
	            function () {throw new Exception("Browser does not support XMLHttpRequest");}
	        ];
	        for (var i = 0; i < tryThese.length; i++) {
	            var func = tryThese[i];
	            try {
	                self.XMLHttpRequest = func;
	                return func();
	            } catch (e) {
	                // pass
	            }
	        }
	    }
	    return self.XMLHttpRequest();
	},
	
	// begin an async HTTP call. args should be a configuration object, e.g:
	// {method:'GET', url:'/fetch/this', onSuccess: successcallback, onFailure: failcallback, parameters:{userid:1234}}
	// method, onFailure, and parameters are optional, they default to GET, console.log, and {}.
	// call .cancel() on the return value to abort the request (doesn't work in all browsers).
	http: function(args) {
		var settings = ccms.extend({method:'GET', async:(args.onSuccess?true:false), onFailure:ccms.async.onHTTPError}, args);
		settings.cancelled = false;
		settings.cancel = function() {settings.cancelled = true;};
		settings.method = settings.method.toUpperCase();
		var http = this.getXMLHttpRequest();
		var postdata = null;
		if (settings.parameters) {

			// If there's a fragment, remove it
			if ((p = settings.url.indexOf('#')) != -1) {
				settings.url = settings.url.substring(0, p);
			}

			if (settings.method == 'POST') {
				postdata = urlencode(settings.parameters);
			}
			else if (settings.method == 'GET' || settings.method == 'HEAD') {
		        settings.url += (settings.url.indexOf('?') > 0 ? '&' : '?') + urlencode(settings.parameters);
			}
		}
		http.open(settings.method, settings.url, settings.async);
		if (postdata) {
			http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		}
		http.send(postdata);
		if (settings.async) {
			http.onreadystatechange = function() {
				if (settings.cancelled) {
					try {
						// unset this to fix a firefox memleak - inside try/catch cos i.e. throws type mismatch...
						http.onreadystatechange = null;
					} catch(e) {;}
					return;
				}
				if (http.readyState == 4){
					if (http.status == 200 || http.status == 304) {
						if (settings.onSuccess) {
							if (settings.parseJSON) settings.onSuccess(http.responseText.parseJSON());
							else settings.onSuccess(http);
						}
					}
					else {
						if (settings.onFailure)
							settings.onFailure(http);
					}
					try {
						http.onreadystatechange = null;
					} catch(e) {;}
				}
			}
		}
		else {
			return http.responseText;
		}
		return settings;
	},

	onHTTPError: function(req) {
		if (typeof console == 'object')
			console.log('HTTP Error: ' + req.status + ' ' + req.statusText + "\n" + req.responseText);
	},
	
	after: function(timeout, callback) {
		return setTimeout(callback, timeout);
	}
});
cf.async = ccms.async;

function clickURI(uri, newwin) {
	if (newwin)
		window.open(uri);
	else
		document.location.href = uri;
	return false;
}

function launchWindow (url, name) {
	var options = 'scrollbars=yes,location=no,toolbar=no,status=yes,resizable=yes,width=600,height=550,left=100,top=100';
	/*
	if (!document.getElementById('window-' + name)) {
		document.body.innerHTML += '<div id="window-' + name + '"></div>';
	}
	if (element = document.getElementById('window-' + name)) {
		element.innerHTML = '<iframe id="test" width="600" height="500" style="border:none; position:fixed; z-index: 1000; top:100px; left:100px;" src="' + url + '"></iframe>';
	}
	*/
	switch (name) {
		case 'metadataedit':
			options = 'scrollbars=yes,location=no,toolbar=no,status=yes,resizable=yes,width=700,height=500,left=100,top=100';
		break;
		case 'choosepage':
			options = 'scrollbars=yes,location=no,toolbar=no,status=yes,resizable=yes,width=400,height=500,left=100,top=100';
		break;
	}
	
	var newWindow = window.open(url,'_' + name,options);
	if (!newWindow.opener)
		newWindow.opener = window;
	return newWindow;
	
	
}

function closeWindow () {
	if (element = window.frameElement.parentNode) {
		element.innerHTML = '';
	}
}

function launchPagePicker(portalid, nodeid, tdid, elementid) {
	var currentId = getPickedPage(tdid);
	launchWindow(uripath + 'edit/choose-page?nodeid='+nodeid+'&tdid='+tdid+'&elementid='+elementid+'&current='+currentId+'#cplink1_'+currentId,'choosepage');
}

function launchLibraryPicker(portalid, rootnodeid, tdid, etype) {
	newwin = window.open(uripath + 'includes/librarypicker.php?rootnodeid='+rootnodeid+'&n='+rootnodeid+'&p='+portalid+'&elementtype='+etype+'&tdid='+tdid+'#node'+rootnodeid,'catpicker','scrollbars=yes,location=no,toolbar=no,status=yes,resizable=yes,width=350,height=400,left=100,top=100');
	if (!newwin.opener)
		newwin.opener = window;
}

function onPagePicked(tdid, pageid, pagetitle) {
	td = window.opener.document.getElementById(tdid);
	if (tdid == 'infolinx-reference') {
		window.opener.location = window.opener.location + '&add-reference=' + pageid;
	}
	else {
		for (var i = 0; i < td.childNodes.length; ++i) {
			kid = td.childNodes[i];
			if (kid.tagName) {
				if (kid.tagName.toLowerCase() == 'input' && kid.type.toLowerCase() == 'hidden')
					kid.value = pageid;
				else if (kid.tagName.toLowerCase() == 'div')
					kid.innerHTML = pagetitle;
			}
		}
	}
	window.close();
	return false;
}

function removePickedPage(tdid) {
	td = window.document.getElementById(tdid);
	for (var i = 0; i < td.childNodes.length; ++i) {
		kid = td.childNodes[i];
		if (kid.tagName) {
			if (kid.tagName.toLowerCase() == 'input' && kid.type.toLowerCase() == 'hidden')
				kid.value = 0;
			else if (kid.tagName.toLowerCase() == 'div')
				kid.innerHTML = '';
		}
	}
}

function launchPickedPage(tdid) {
	var elementid = getPickedPage(tdid);
	if (elementid > 0)
		window.open(uripath + 'go.php?id='+elementid, 'pickedpageviewer','scrollbars=yes,location=yes,toolbar=yes,status=yes,resizable=yes');
}

function getPickedPage (tdid) {
	if (td = window.document.getElementById(tdid)) {
		for (var i = 0; i < td.childNodes.length; ++i) {
			kid = td.childNodes[i];
			if (kid.tagName && kid.tagName.toLowerCase() == 'input' && kid.type.toLowerCase() == 'hidden') {
				return kid.value;
			}
		}
	}
	return false;
}

function launchCategoryTitleChooser(type, portalid, nodeid, pageid, elementid, eltid, sep) {
	newwin = window.open(uripath + 'includes/categorylistpicker.php?elt='+eltid+'&sep='+escape(sep)+'&text=1&p='+portalid+'&n='+nodeid+'&q='+pageid+'&element='+elementid+'&mdtype='+type,'catpicker','scrollbars=yes,location=no,toolbar=no,status=yes,resizable=yes,width=350,height=400,left=100,top=100');
	if (!newwin.opener)
		newwin.opener = window;
}

function addCategory (listName, value, label) {
	if (list = document.getElementById(listName)) {
		var outputHtml = list.innerHTML;
		outputHtml += '<li id="' + value + '"><a href="#" title="Click to Remove" onclick="removeCategory(\'' + listName + '\',this.parentNode);return false">' + label + '</a></li>';
		list.innerHTML = outputHtml;
	}
	updateCategoryList(listName);
}
function removeCategory (listName, node) {
	node.parentNode.removeChild(node);
	updateCategoryList(listName);
}

function updateCategoryList(listName) {
	var theList = '';
	if (list = document.getElementById(listName)) {
		for (i=0;i<list.childNodes.length;i++) {
			if (list.childNodes[i].id) {
				theList += (theList == '' ? '' : ';') + list.childNodes[i].id;
			}
		}
		if (inputField = document.getElementById(listName + '_list')) {
			inputField.value = theList;
		}
	}
}

function updateCategory (listId, value, label) {
	if (list = window.opener.document.getElementById(listId)) {
		new_element = document.createElement('li');
		new_element.innerHTML = label;
		list.appendChild(new_element);
	}
}

function updateCategories(doc, categories, fieldname) {
	for (var i = 0; i < categories.length; ++i) {
		// Parse it
		category = categories[i];
		listid = category[0];
		listname = category[1];
		itemid = category[2];
		itemname = category[3];
		
		// Add It
		addCategory(fieldname, listid + ':' + itemid, listname + ' - ' + itemname);	
	}
}

function launchCategoryEditor(type, portalid, nodeid, pageid, elementid) {
	newwin = window.open(uripath + 'edit/choose-category?page='+pageid+'&element='+elementid+'&mdtype='+type,'catpicker','scrollbars=yes,location=no,toolbar=no,status=yes,resizable=yes,width=350,height=450,left=200,top=300');
	newwin.opener = window;
}

function _launchHelp(uri) {
	newwin = window.open(uri,'help','scrollbars=yes,location=no,toolbar=no,status=no,resizable=yes,width=450,height=400,left=100,top=100');
	newwin.opener = window;
}

function launchHelp(title,message) {
	_launchHelp(uripath + 'help.php?title='+title+'&show='+message);
}
function validatePosting () {
	var valid = true;
	var message = "";
	formElement = document.forms['editform'];
	
	if (element = document.editform['property-under-investigation']) {
		if (element[0].checked) {
			return true;
		}
	}
	
	// Check Required Fields
	if (typeof required == 'object') {
		for (i = 0; i < required.length; i++) {
			var item = required[i];
			if (formElement[item[0]]) {
				switch (item[0]) {
					default:
						if (formElement[item[0]].value == '') {
							message += "- " + item[1] + "\n";
							valid = false;
						}
					break;
					
					case 'description':
						if (formElement[item[0]].value == '' && formElement[item[0]].className != 'RichTextEditable') {
							message += "- " + item[1] + "\n";
							valid = false;
						}
					break;
					
					case 'url1':
						if (!((formElement['url1'].value != '') || (formElement['link1'] && formElement['link1'].value > '0'))) {
							message += "- " + item[1] + "\n";
							valid = false;
						}
					break;
					
					case 'file1':
					case 'file2':
					case 'file3':
						var offset = parseInt(item[0].substr(4),10);
						if (!formElement["remove" + offset] && formElement[item[0]].value == '') {
							message += "- " + item[1] + "\n";
							valid = false;
						}
					break;
				}
			}
		}	
	}
	
	// Check Attachment Names
	for (i = 2; i < 4; i++) {
		var name = "file" + i;
		if (((formElement[name] && formElement[name].value != '') || (formElement["remove" + i] && formElement["remove" + i].checked == false)) && formElement["text" + (2 + i)].value == '') {
			message += "- " + formElement["text" + (2 + i)].title + " Name\n";
			valid = false;
		}
	}
	
	if (!valid) {
		alert("The following fields are required:\n" + message);
	}
	return valid;
}
function manualConfirm (message, confirmString) {
	if (prompt(message) == confirmString) {
		return true;
	}
	return false;
}

function launchGeocoder(formId, labelId) {
	if (formId) {
		form1 = document.getElementById(formId);
	}
	else {
		form1 = document.editform;
	}
	var locationForm = form1;
	var windowPath = '';
	if (form1.geocode_e || form1.geocode_n) {
		if (form1.geocode_e != '')
			easting = form1.geocode_e.value;
		else
			easting = 0;
		if (form1.geocode_n != '')
			northing = form1.geocode_n.value;
		else
			northing = 0;
		if (northing > 0 || easting > 0)
			windowPath = '&coords=' + easting + ',' + northing;
	}
	else if (form1['property-latitude'] || form1['property-longitude']) {
		if (form1['property-latitude'].value != '')
			latitude = form1['property-latitude'].value;
		else
			latitude = 0;
		if (form1['property-longitude'].value != '')
			longitude = form1['property-longitude'].value;
		else
			longitude = 0;
		windowPath = '&llcoords=' + latitude + ',' + longitude;
	}
	if (labelId > '' && windowPath == '' && (element = document.getElementById(labelId))) {
		if (element.value > '') {
			windowPath += '&name=' + element.value;
		}
	}
	
	if (form1.postcode && form1.postcode.value > '') {
		windowPath += '&postcode=' + form1.postcode.value;
	}
	newwin = window.open(uripath + 'edit/location?' + windowPath,'gmappicker','scrollbars=yes,location=no,toolbar=no,status=yes,resizable=yes,width=540,height=570,left=100,top=100');
	if (!newwin.opener)
		newwin.opener = window;
}

function openImageMapEditor (imageURL,areas) {
	if (imageURL != '') {
		newwin = window.open(uripath + 'includes/imagemap-editor.php?image='+imageURL+'&areas='+areas,'imagemap','scrollbars=yes,location=no,toolbar=no,status=yes,resizable=yes,width=640,height=480,left=100,top=100');
		if (!newwin.opener)
			newwin.opener = window;
	}
	else {
		alert('No Image Selected!');
	}
	return false;
}

function galleryViewer(galleryid, itemid) {
	newwin = window.open(uripath + 'galleryviewer.php?itemid=' + itemid, 'galleryviewer' + galleryid, 'scrollbars=yes, location=no, toolbar=no, status=no, resizable=yes, width=700, height=500, left=50, top=50');
	if (!newwin.opener)
		newwin.opener = window;
}

function launchEcard(galleryid, itemid, nodeid) {
	newwin = window.open(uripath + 'ecard/' + galleryid + '/' + itemid + '?nodeid=' + nodeid, 'ecard' + galleryid, 'scrollbars=yes, location=no, toolbar=no, status=yes, resizable=yes, width=500, height=400, left=50, top=50');
	if (!newwin.opener)
		newwin.opener = window;
}

function cp_LaunchUrl(url) {
	if (url > '') {
		if (!url.match(/^(\w+:\/\/|[.\/]+)\w+/))
			url = 'http://' + url;
		window.open(url);
	}
	else {
		alert('Please enter a valid URL');
	}
}

function openSpellChecker(txt) {
	var speller = new spellChecker(txt);
	speller.openChecker();
}

function showById (idname) {
	document.getElementById(idname).style.display = 'block';
}

function hideById (idname) {
	document.getElementById(idname).style.display = 'none';
}
function toggleVisibility (object) {
	if (object.parentNode.className != 'open') {
		object.parentNode.className = 'open';
	}
	else {
		object.parentNode.className = 'close';
	}
	return false;
}

function toggleTabpanel (id) {
		
	tabButton = document.getElementById('tab-' + id);
	tabPanel = document.getElementById('tab-' + id + '-panel');
	
	buttons = tabButton.parentNode;
	
	var counter=1;
	for (i=0;i<buttons.childNodes.length;i++) {
		tab = buttons.childNodes[i];
		if (typeof(tab.id) != "undefined" && tab.id != '') {
			panel = document.getElementById(tab.id + '-panel');
			if (typeof(panel) != "undefined") {
				tab.className = '';
				panel.className = 'tabpanel tabpanel-' + counter;
				counter++;
			}
		}
	}
	
	tabButton.className = 'selected';
	tabPanel.className = tabPanel.className + ' selected';
	
	return false;
}


/* Questionnaire by Phill Sparks */
function launchQuestionPicker(portalid, rootnodeid, tdid, qfield, pid, eid) {
	newwin = window.open(uripath + 'includes/questionpicker.php?rootnodeid='+rootnodeid+'&n='+rootnodeid+'&p='+portalid+'&parentid='+pid+'&pageid='+eid+'&tdid='+tdid+'&qfield='+qfield+'#node'+rootnodeid,'questionpicker','scrollbars=yes,location=no,toolbar=no,status=yes,resizable=yes,width=350,height=400,left=100,top=100');
	if (!newwin.opener)
		newwin.opener = window;
}
function openAbbr (elementId) {
	document.getElementById('abbr-more-' + elementId).style.display = 'none';
	document.getElementById('abbr-text-' + elementId).style.display = 'inline';
	document.getElementById('abbr-less-' + elementId).style.display = 'inline';
	return false;
}

function closeAbbr (elementId) {
	document.getElementById('abbr-more-' + elementId).style.display = 'inline';
	document.getElementById('abbr-text-' + elementId).style.display = 'none';
	document.getElementById('abbr-less-' + elementId).style.display = 'none';
	return false;
}

function appendText (idName, value) {
	if (document.getElementById(idName)) {
		document.getElementById(idName).value += value;
	}
	return false;
}

//v1.0
//Copyright 2006 Adobe Systems, Inc. All rights reserved.
function AC_AddExtension(src, ext)
{
  if (src.indexOf('?') != -1)
    return src.replace(/\?/, ext+'?'); 
  else
    return src + ext;
}

function AC_Generateobj(objAttrs, params, embedAttrs) 
{ 
  var str = '<object ';
  for (var i in objAttrs)
    str += i + '="' + objAttrs[i] + '" ';
  str += '>';
  for (var i in params)
    str += '<param name="' + i + '" value="' + params[i] + '" /> ';
  str += '<embed ';
  for (var i in embedAttrs)
    str += i + '="' + embedAttrs[i] + '" ';
  str += ' ></embed></object>';

  document.write(str);
}

function AC_FL_RunContent(){
  var ret = 
    AC_GetArgs
    (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
     , "application/x-shockwave-flash"
    );
  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

function AC_SW_RunContent(){
  var ret = 
    AC_GetArgs
    (  arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000"
     , null
    );
  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
  var ret = new Object();
  ret.embedAttrs = new Object();
  ret.params = new Object();
  ret.objAttrs = new Object();
  for (var i=0; i < args.length; i=i+2){
    var currArg = args[i].toLowerCase();    

    switch (currArg){	
      case "classid":
        break;
      case "pluginspage":
        ret.embedAttrs[args[i]] = args[i+1];
        break;
      case "src":
      case "movie":	
        //args[i+1] = AC_AddExtension(args[i+1], ext);
        ret.embedAttrs["src"] = args[i+1];
        ret.params[srcParamName] = args[i+1];
        break;
      case "onafterupdate":
      case "onbeforeupdate":
      case "onblur":
      case "oncellchange":
      case "onclick":
      case "ondblClick":
      case "ondrag":
      case "ondragend":
      case "ondragenter":
      case "ondragleave":
      case "ondragover":
      case "ondrop":
      case "onfinish":
      case "onfocus":
      case "onhelp":
      case "onmousedown":
      case "onmouseup":
      case "onmouseover":
      case "onmousemove":
      case "onmouseout":
      case "onkeypress":
      case "onkeydown":
      case "onkeyup":
      case "onload":
      case "onlosecapture":
      case "onpropertychange":
      case "onreadystatechange":
      case "onrowsdelete":
      case "onrowenter":
      case "onrowexit":
      case "onrowsinserted":
      case "onstart":
      case "onscroll":
      case "onbeforeeditfocus":
      case "onactivate":
      case "onbeforedeactivate":
      case "ondeactivate":
      case "type":
      case "codebase":
        ret.objAttrs[args[i]] = args[i+1];
        break;
      case "width":
      case "height":
      case "align":
      case "vspace": 
      case "hspace":
      case "class":
      case "title":
      case "accesskey":
      case "name":
      case "id":
      case "tabindex":
        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
        break;
      default:
        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
    }
  }
  ret.objAttrs["classid"] = classid;
  if (mimeType) ret.embedAttrs["type"] = mimeType;
  return ret;
}
// end adobe
var lastValue = false;
var lastValueIndex = 0;
function autocomplete (evt) {
	var t = evt.target;
    if (evt.keyCode == 9) {
		evt.preventDefault();
		if (t.value > '' && (list = document.getElementById(t.id + '_autocomplete'))) {
			for(i=0; i < list.length;i++) {
				if (lastValue == false || i > lastValueIndex) {
					if (!lastValue)
						lastValue = t.value;
					if (list[i].value.substring(0,(lastValue.length)).toLowerCase() == lastValue.toLowerCase()) {
						lastValueIndex = i;
						t.value = list[i].value;
						break;
					}
				}
			}
		}
	}
	else {
		lastValue = false;
		lastValueIndex = 0;
	}
}

function highlightUrl(elementid, url) {
	if (source = document.getElementById('element-' + elementid)) {
		var image = ' <img src="http://static.cuttlefish.com/icons/silk/16x16/error.png" title="Broken Link" alt="Broken Link" id="link-' + elementid + '" />';
		tags = source.getElementsByTagName('a');
		for (i=0;i<tags.length;i++) {
			if (tags[i].getAttribute('href') == url || tags[i].getAttribute('href') == encodeURI(url)) {
				newNode = document.createElement('img');
				newNode.setAttribute('src', 'http://static.cuttlefish.com/icons/silk/16x16/error.png');
				newNode.setAttribute('alt', 'Broken Link');
				newNode.setAttribute('title', 'Broken Link');
				newNode.setAttribute('id', 'link-' + elementid);
				tags[i].parentNode.insertBefore(newNode, tags[i].nextSibling);
				return false;
			}
		}
		if (position = source.innerHTML.indexOf(url)) {
			position += url.length;
			source.innerHTML = source.innerHTML.substring(0, position) + image + ' ' + source.innerHTML.substring(position);
		}
		window.location.hash = 'link-' + elementid;
	}
	return false;
}
