function $(element) {
	if (arguments.length > 1) {
	for (var i = 0, elements = [], length = arguments.length; i < length; i++)
		elements.push($(arguments[i]));
	return elements;
	}
	if (typeof element === "string")
		element = document.getElementById(element);
	return element;
}

Function.prototype.createDelegate = function(obj, args)
{
	var method = this;
	return function() {
		var callArgs = args || arguments;
		return method.apply(obj || window, callArgs);
	};
}

window.FSite2 = new Object();

FSite2._imageMaps = new Object();

FSite2._callRef = function(funRef, objectRef)
{
	return (function()
	{
		funRef(objectRef);
	});
}

FSite2._removeElement = function(el)
{
	el.parentNode.removeChild(el);
}

FSite2._simulateClickOnSpace = function(event)
{
	if (!event) var event = window.event;
	if (event.keyCode == 0x20)
	{
		if (this._image._OnClick)
			this._image._OnClick(event);
		event.returnValue = false;
	}
}

FSite2._simulateClick = function()
{
	if (this._OnClick)
		this._OnClick();
	return false;
}

FSite2._propagateClick = function(event)
{
	if (!event) var event = window.event
	if (this._image._OnClick)
		this._image._OnClick(event);
	event.returnValue = false;
	event.cancelBubble = true;
	return false;
}

FSite2._updateImageState = function(event)
{
	if (this._hiddenInput.disabled)
	{
		this._area.removeAttribute('href');
		this._area.style.cursor = 'default';
	}
	else
	{
		this._area.setAttribute('href', '#');
		this._area.style.cursor = 'pointer';
	}
	var i;
	if (this._hiddenInput.disabled && this._imageDisabledChecked && this._imageDisabledUnchecked)
	{
		if (this._hiddenInput.checked)
			i = this._imageDisabledChecked;
		else
			i = this._imageDisabledUnchecked;
	}
	else
	{
		if (this._hiddenInput.checked)
			i = this._imageChecked;
		else
			i = this._imageUnchecked;
	}
	if (i !== undefined)
	{
		this.src = i.src;
		if (i.height)
			this.style.height = i.height + 'px';
		if (i.width)
			this.style.width = i.width + 'px';
	}
}

FSite2.debugMessage = function(msg)
{
	if (debugElement = document.getElementById('FSite2_debug'))
	{
		debugElement.innerHTML = debugElement.innerHTML + '<p>' + msg + '</p>';
	}
}

FSite2.addImageFocus = function(imageElement, mapName)
{
	var imageMap = document.createElement('map');
	if (FSite2._imageMaps[mapName] != undefined)
	{
		FSite2._imageMaps[mapName]++;
		mapName = mapName + '_' + FSite2._imageMaps[mapName];
	}
	else
		FSite2._imageMaps[mapName] = 1;
	imageMap.name = mapName;
	imageMap.id = mapName;
	var imageArea = document.createElement('area');
	imageArea.shape = 'rect';
	imageArea.coords = '0,0,' + imageElement.width + ',' + imageElement.height;
	imageMap.appendChild(imageArea);
	imageArea._image = imageElement;
//	imageArea.href = '#';
	imageElement.onclick = window.FSite2._simulateClick;
	imageElement._area = imageArea;
	imageElement.parentNode.insertBefore(imageMap, imageElement);
	imageElement.onload = function() {
		this.style.height = this.height + 'px';
		this.style.width = this.width + 'px';
		this._area.coords = '0,0,' + this.width + ',' + this.height;
	};
	imageElement.style.border = 'none';
	imageElement.useMap = '#' + imageMap.name;
	imageArea.onkeydown = window.FSite2._simulateClickOnSpace;
	imageArea.onclick = window.FSite2._propagateClick;
	return imageArea;
}

FSite2.createElement = function(elementName, attribs)
{
	var newElement = document.createElement(elementName);
	FSite2.setObjectAttribs(newElement, attribs);
	return newElement;
}

FSite2.cloneObject = function (o)
{
	if(typeof(o) != 'object') return o;
	if(o == null) return o;
	
	var newO = new Object();
	
	for(var i in o) newO[i] = FSite2.cloneObject(o[i]);
	return newO;
}

FSite2.setObjectAttribs = function(newElement, attribs)
{
	if (typeof attribs != 'object')
		return;
	for (attrib in attribs)
		if (attribs[attrib] != null)
		{
			if ((typeof attribs[attrib] == 'object') && (typeof newElement[attrib] == 'object'))
				FSite2.setObjectAttribs(newElement[attrib], attribs[attrib]);
			else
				newElement[attrib] = attribs[attrib];
		}
}

FSite2.setElementClass = function(element, className)
{
	FSite2.unsetElementClass(element, className);
	element.className += (element.className?' ':'') + className;
}

FSite2.unsetElementClass = function(element, className)
{
	element.className = element.className.replace(new RegExp('\\s*\\b' + className + '\\b', 'gi'), '');
}

FSite2.hasElementClass = function(element, className)
{
	return RegExp('\\b' + className + '\\b', 'gi').test(element.className);
}

FSite2.recursiveReplace = function(element, pattern, replacement)
{
	for (var i = 0; i < element.childNodes.length; i++)
	{
		if (element.childNodes[i].nodeType == 3)
			element.childNodes[i].nodeValue = element.childNodes[i].nodeValue.replace(pattern, replacement);
		else if (element.childNodes[i].nodeType == 1)
			FSite2.recursiveReplace(element.childNodes[i], pattern, replacement);
	}
}

FSite2.showElement = function(element)
{
	element.style.display = 'block';
	element.style.visibility = 'visible';
	if (element.onShow && (typeof element.onShow == 'function'))
		element.onShow();
}

FSite2.hideElement = function(element)
{
	if (element.onHide && (typeof element.onHide == 'function'))
		element.onHide();
	element.style.visibility = 'hidden';
	element.style.display = 'none';
//	element.style.display = 'block';
}

FSite2.toggleElement = function(element)
{
	if (element.style.display == 'none')
		FSite2.showElement(element);
	else
		FSite2.hideElement(element);
}

FSite2.getElementsByClassName = function(className, node1, node2, node3, node4)
{
	if (!node1) node1=document;
	var i, a, d;
	var db = node1.getElementsByTagName('*');
	for (i = 0, a = [], d; d = db[i++]; )
		if (FSite2.hasElementClass(d, className)) a.push(d);
	if (node2)
	{
		db = node2.getElementsByTagName('*');
		for (i = 0; d = db[i++]; )
			if (FSite2.hasElementClass(d, className)) a.push(d);
	}
	if (node3)
	{
		db = node3.getElementsByTagName('*');
		for (i = 0; d = db[i++]; )
			if (FSite2.hasElementClass(d, className)) a.push(d);
	}
	if (node4)
	{
		db = node4.getElementsByTagName('*');
		for (i = 0;d = db[i++]; )
			if (FSite2.hasElementClass(d, className)) a.push(d);
	}
	return a;
}

FSite2.redirectByForm = function(url,formid,onsubmit)
{
	var form = document.createElement('form');
	
	if( $('formid') && $('formid').tagName == 'FORM' )
	{
			form = $('formid');
	}
	else
	{
			form = document.createElement('form');
			form.method = 'get';
			document.body.appendChild(form);
	}
	if(typeof onsubmit == 'function')
		form.onsubmit = onsubmit;
	form.action = url;
	form.submit();
	if( typeof form.onsubmit == 'function' )
		form.onsubmit();
}

FSite2.extendForm = function(formElement, params)
{
	var inputArray;
	var i;
	var images;
	if (FSite2.extendImage && params.imagesClass)
	{
		if (!params.imagesInterval)
			params.imagesInterval=1000;
		if (!params.imagesSep)
			params.imagesSep='|';
		imgs=formElement.getElementsByTagName('img');
		for (i=0;i<imgs.length;i++)
		{
			if ((RegExp('\\b' + params.imagesClass + '\\b', 'gi').test(imgs[i].className)) && (imgs[i].alt))
			{
				FSite2.extendImage(imgs[i], params);
			}
		}
	}
	if (FSite2.extendCheckbox || FSite2.extendRadio || FSite2.extendCalendar || FSite2.extendAutocomplete || FSite2.fakeExtendElement)
	{
		inputArray = formElement.getElementsByTagName('input');
		for (i = 0; i < inputArray.length; i++)
		{
			if (FSite2.extendCalendar && params.calendarClass && RegExp('\\b' + params.calendarClass + '\\b', 'gi').test(inputArray[i].className))
				FSite2.extendCalendar(inputArray[i], params);
			if (FSite2.extendCheckbox && (inputArray[i].type == 'checkbox') && params.checkboxChecked && params.checkboxUnchecked)
				FSite2.extendCheckbox(inputArray[i], params.checkboxChecked, params.checkboxUnchecked,
					params.disabledCheckboxChecked, params.disabledCheckboxUnchecked);
			if (FSite2.extendRadio && (inputArray[i].type == 'radio') && params.radioChecked && params.radioUnchecked)
				FSite2.extendRadio(inputArray[i], params.radioChecked, params.radioUnchecked,
					params.disabledRadioChecked, params.disabledRadioUnchecked);
			if (FSite2.extendAutocomplete && (inputArray[i].type == 'text') && params.autoCompleteClass && RegExp('\\b' + params.autoCompleteClass + '\\b', 'gi').test(inputArray[i].className) && params.autoCompleteUrl)
				FSite2.extendAutocomplete(inputArray[i], params);//params.autoCompleteHelperClass, params.autoCompleteUrl, (params.autoCompleteMinChar)?(params.autoCompleteMinChar):0,(params.autoCompleteInterval)?params.autoCompleteInterval:500);
			if (FSite2.fakeExtendElement && (inputArray[i].type == 'text'))
				FSite2.fakeExtendElement(inputArray[i], params);
		}
	}
	if (FSite2.fakeExtendElement || FSite2.extendFCKeditor)
	{
		inputArray = formElement.getElementsByTagName('textarea');
		for (i = 0; i < inputArray.length; i++)
		{
			if (FSite2.fakeExtendElement)
				FSite2.fakeExtendElement(inputArray[i], params);
			if (FSite2.extendFCKeditor && inputArray[i].name && params.FCKclass)
				FSite2.extendFCKeditor(inputArray[i], params);
		}
	}
	if (FSite2.extendSelect || FSite2.extendCalendar)
	{
		inputArray = formElement.getElementsByTagName('select');
		for (i = 0; i < inputArray.length; i++)
		{
			if (FSite2.extendCalendar && params.calendarClass && RegExp('\\b' + params.calendarClass + '\\b', 'gi').test(inputArray[i].className))
				FSite2.extendCalendar(inputArray[i], params);
			if (FSite2.extendMultiCheck && params.multiCheckClass && RegExp('\\b' + params.multiCheckClass + '\\b', 'gi').test(inputArray[i].className))
				FSite2.extendMultiCheck(inputArray[i], params);
			else if (FSite2.extendSelect && (inputArray[i].className || params.selectClass))
			{
				if (params.selectImagesClass)
					images = RegExp('\\b' + params.selectImagesClass + '\\b', 'gi').test(inputArray[i].className);
				else
					images = false;
				var dropClass = inputArray[i].className;
				if (params.calendarClass)
					dropClass = dropClass.replace(new RegExp('\\s*\\b' + params.calendarClass + '\\b\\s*', 'gi'), '');
				FSite2.extendSelect(inputArray[i], params.selectClass ? params.selectClass : dropClass, images, params.selectDisabledClass);
			}
		}
		if (FSite2.extendCalendar)
		{
			for (cal in FSite2.calendars)
				if (FSite2.calendars[cal].oninit)
					FSite2.calendars[cal].oninit();
		}
	}
	if ((FSite2.extendHelper && params.helperClass) || (FSite2.getAjaxAnchorTarget && params.ajaxTargetClass) || (FSite2.SlideShow && params.slideShowClass))
	{
		var ajaxAnchor;
		
		if (FSite2.getAjaxAnchorTarget && formElement.id && FSite2.hasElementClass(formElement, params.ajaxTargetClass))
		{
			ajaxAnchor = FSite2.getAjaxAnchorTarget(params, formElement.id);
			ajaxAnchor.extendContent();
		}
		var bd = formElement.getElementsByTagName('*');
		
		for (var i = 0, a = [], d; d = bd[i++];)
		{
			if (FSite2.extendHelper && FSite2.hasElementClass(d, params.helperClass))
			{
				if (d._helper) continue;
				FSite2.extendHelper(d, params);
			}
			if (FSite2.getAjaxAnchorTarget && d.id && FSite2.hasElementClass(d, params.ajaxTargetClass))
			{
				ajaxAnchor = FSite2.getAjaxAnchorTarget(params, d.id);
				ajaxAnchor.extendContent();
			}
			if (FSite2.SlideShow && params.slideShowClass && FSite2.hasElementClass(d, params.slideShowClass))
				new FSite2.SlideShow(d, params);
		}
	}
	if (FSite2.extendGalleries && params.galleryClass)
		FSite2.extendGalleries(formElement, params);
	if (FSite2.extendAnchors && (params.layerAnchorClass || params.ajaxAnchorClass || params.hashAnchorClass))
		FSite2.extendAnchors(formElement, params);
	if (FSite2.processHashParams && params.processHash)
		FSite2.processHashParams();
}

FSite2.updateFormState = function(formElement)
{
	var inputArray, i;
	inputArray = formElement.getElementsByTagName('input');
	for (i = 0; i < inputArray.length; i++)
		if (typeof inputArray[i]._updateState == 'function')
			inputArray[i]._updateState();
	inputArray = formElement.getElementsByTagName('select');
	for (i = 0; i < inputArray.length; i++)
		if (typeof inputArray[i]._updateState == 'function')
			inputArray[i]._updateState();
}

FSite2.loadScript = function(scriptSource)
{
	if (scriptSource.constructor != Array)
		scriptSource = new Array(scriptSource);
	for (var i = 0; i < scriptSource.length; i++)
	{
		var headTags = document.getElementsByTagName('head');
		var scriptTag;
		if (headTags.length > 0)
		{
			scriptTag = document.createElement('script');
			scriptTag.type = 'text/javascript';
			scriptTag.src = scriptSource[i];
			headTags[0].appendChild(scriptTag);
		}
		else
			document.write('<scr' + 'ipt src="' + scriptSource[i] + '" type="text/javascript"></scr' + 'ipt>');
	}
}

FSite2.getScriptTag = function(scriptNameHint)
{
	var scripts = document.getElementsByTagName('script');
	var scriptTag;
	var re;
	var parts;
	if (scriptNameHint && (typeof scriptNameHint == 'string'))
		re = new RegExp('^(.*\/)?' + scriptNameHint.replace('.', '\.') + '$');
	for (var i = scripts.length - 1; i >= 0; i--)
	{
		parts = scripts[i].src.split('?');
		if (re && !re.exec(parts[0]))
			continue;
		scriptTag = scripts[i];
		break;
	}
	return scriptTag;
}

FSite2.getScriptBaseURL = function(scriptNameHint)
{
	var script;
	if ((typeof scriptNameHint == 'object') && (scriptNameHint.tagName == 'SCRIPT'))
		script = scriptNameHint;
	else
		script = FSite2.getScriptTag(scriptNameHint);
	if (script)
	{
		var parts = script.src.split('?');
		var temp = parts[0].split('/');
		temp.pop();
		return temp.join('/') + '/';
	}
}

FSite2.parseScriptParams = function(scriptNameHint)
{
	var script;
	if ((typeof scriptNameHint == 'object') && (scriptNameHint.tagName == 'SCRIPT'))
		script = scriptNameHint;
	else
		script = FSite2.getScriptTag(scriptNameHint);
	var result = new Object();
	if (script)
	{
		var parts = script.src.split('?');
		if (parts[1])
		{
			var params = parts[1].split('&');
			for (var j = 0; j < params.length; j++)
			{
				var value = params[j].split('=');
				if (!result[value[0]])
					result[value[0]] = new Array();
				result[value[0]].push(value[1]);
			}
		}
	}
	return result;
}

FSite2.loadScriptsFromParam = function(paramName, baseURL)
{
	if (!paramName)
		paramName = 'load';
	var script = FSite2.getScriptTag('FSite2.js');
	if (script)
	{
		if (!baseURL)
			baseURL = FSite2.getScriptBaseURL(script);
		var params = FSite2.parseScriptParams(script);
		if (params[paramName])
		{
			var scriptsToLoad = params[paramName][0].split(',');
			for (var k = 0; k < scriptsToLoad.length; k++)
				scriptsToLoad[k] = baseURL + scriptsToLoad[k] + '.js';
			FSite2.loadScript(scriptsToLoad);
		}
	}
}

FSite2.loadScriptsFromParam();
