if (typeof(SiteFramework) != 'function'){
	var SiteFramework = function (){};
}

SiteFramework.baseUrl = '';

SiteFramework.prototype.debugMode = true;
SiteFramework.prototype._DEBUG = {};
SiteFramework.prototype.ajaxRequest = {};
SiteFramework.prototype.popupSize = { w : '500', h : '600' };

SiteFramework.prototype.debug = function (data, label){
	if (this.debugMode){
		var d = new Date();
		label = d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds() + '.' + d.getMilliseconds() + ' ' + label;
		this._DEBUG[label] = data;
	}
}

SiteFramework.prototype.findNode = function (element, nodeName){
	var lim    = 0;
	while (element.nodeName != nodeName && element.nodeName != 'BODY' && lim < 1000){
		element = element.parentNode;
		lim++;
	}
	if (element.nodeName == nodeName){
		return element;
	}
	return false;
}

SiteFramework.prototype.getElement = function (element){
	if (typeof(element) == 'string'){
		element = $(element);
	} else if (typeof(element.element) == 'function'){
		element = Event.element(element);
	}
	return element;
}

SiteFramework.prototype.submitForm = function (element, update){
	if (typeof(element) == 'string'){
		element = $(element);
	} else if (typeof(element.element) == 'function'){
		element = Event.element(element);
	}

	var form = this.findNode(element, 'FORM');
	if (form == false){ return false; }

	if (update){
		if (typeof(update) == 'boolean'){
			update = 'page-body';
		}
		this.ajaxRequest(form, $(form).action, 'post', update);
	} else {
		form.submit();
	}
	return false;
}

SiteFramework.prototype.ajaxRequest = function(params, url, method, update){
	var _ajaxId = Math.round(Math.random() * 999999) + 1000000;
	var form = null;
	if (typeof(params) == 'object' && typeof(params.nodeName) == 'string' && params.nodeName == 'FORM'){
		form = params;
		method = $(form).method;
		params = $(form).serialize();
	}
	if (params == undefined || params.length == 0){
		params = '_ajaxId='+_ajaxId;
	} else {
		params += '&_ajaxId='+_ajaxId;
	}

	if (url == undefined || url.length == 0){
		if (form != null){
			url = $(form).action;
		} else {
			url = window.location.href;
		}
	}
	if (method == undefined){
		method = 'get';
	}
	if (update == undefined){
		updated = null;
	}

	var Object = this;

	Object.ajaxRequest[_ajaxId] = {
		'url'    : url,
		'params' : params,
		'method' : method,
		'form'   : form,
		'update' : update
	}

	new Ajax.Request(url, {
		'method'     : method,
		'parameters' : params,
		'evalJS'     : false,
		'onSuccess'  : function(transport){ Object.ajaxResponse(transport); },
		'onFailure'  : function(transport){ alert('AJAX request failed :('); }
	} );
	return false;
}

SiteFramework.prototype.ajaxResponse = function (transport){
//	this.debug(transport, 'ajaxResponse');
	if (transport.getHeader('X-Ajax-Id') != null){
		var requestId = transport.getHeader('X-Ajax-Id');
		if (this.ajaxRequest[requestId] != undefined){
			var request = this.ajaxRequest[requestId];
			delete(this.ajaxRequest[requestId]);
		} else {
			this.debug('Undefined request ID', 'Ajax Error');
			return false;
		}
	} else {
		var request = false;
	}
	if (transport.getHeader('Content-Type') != null){
		var contentType = transport.getHeader('Content-Type').split(';');
		contentType = contentType[0];
		this.debug(contentType, 'Ajax Response Content-type header');
		if (contentType == 'application/javascript'){
			try {
				eval('('+transport.responseText+')');
			} catch (e) {
				this.debug(e, 'Ajax response eval error');
			}
		} else if (contentType == 'text/html'){
			if (request && request.update != null && $(request.update)){
				$(request.update).childElements().each( function (element){ Element.remove(element); } );
				$(request.update).innerHTML = transport.responseText;
				transport.responseText.evalScripts();
				this.afterAjaxUpdate();
			} else {
				this.debug(request, 'Ajax update error');
			}
		}
	}
}

SiteFramework.prototype.afterAjaxUpdate = function (){

}

SiteFramework.prototype.requestPopup = function (element){
	if (typeof(element) == 'string'){
		element = $(element);
	} else if (typeof(element.element) == 'function'){
		element = element.element();
	}

	element = this.findNode(element, 'A');
	if (element == false){ return false; }

	this.openPopup(element.href);

	return false;
}

SiteFramework.prototype.openPopup = function (url){
	myLightWindow.activateWindow( {
		href   : url,
		width  : this.popupSize.w,
		height : this.popupSize.h,
		type   : 'page'
	} );
	return false;
}

SiteFramework.prototype.closePopup = function(){
	myLightWindow.deactivate()
	return false;
}

SiteFramework.prototype.redirect = function(url){
	if (url.length > 0){
		window.location.href = url;
	}
	return false;
}

SiteFramework.prototype.formValidationResult = function(request, result){
	this.debug({ 'request':request, 'result':result});
	if (typeof(request) != 'object'){
		return false;
	}
	this.formValidationErrors(request.form, result.errors);
	delete(this.ajaxRequest[result._ajaxId]);
}

SiteFramework.prototype.formValidationErrors = function (form, errors){
	var fields = $(form).getElements();
	fields.each( function (element){
		$(element.parentNode).removeClassName('error');
		var test = element.parentNode.getElementsBySelector('.error-message');
		var block = element.parentNode.getElementsBySelector('.error-message').first();
		if (typeof(block) == 'object'){
			if (typeof(errors[element.name]) == 'string'){
				element.parentNode.addClassName('error');
				block.innerHTML = errors[element.name];
			} else {
				block.innerHTML = ''
			}
		}
	} );
	return false;
}

SiteFramework.prototype.updateCookie = function (params){
	if (typeof(params) == 'object'){
		this.debug(params, 'UpadteCookie');
		for (var varKey in params.data){
			var varName = params.key+'['+varKey+']';
			this.addCookie(varName, params.data[varKey], params.expDays);
		}
	}
}

SiteFramework.prototype.addCookie = function (name, value, expDays){
	if (expDays){
		var date = new Date();
		date.setTime(date.getTime()+(expDays*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	} else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

SiteFramework.prototype.readCookie = function (key, varKey){
	var nameEQ = key+'['+varKey+']'+'=';
	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 '';
}

SiteFramework.prototype.validateEmail = function (email, checkEmpty){
	if (checkEmpty == true && email.length == 0){
		return false;
	}
	var emailRegExp = new RegExp("^([-!#\$%&'*+./0-9=?A-Z^_`a-z{|}~])+@([-!#\$%&'*+/0-9=?A-Z^_`a-z{|}~]+\\.)+[a-zA-Z]{2,5}\$");
	if (email.length != 0 && emailRegExp.test(email) == false){
		return false;
	}
	return true;
}

SiteFramework.prototype.getPageDimensions = function(){
	var xScroll, yScroll;
	if (window.innerHeight && window.scrollMaxY){
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else {
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}

	var windowWidth, windowHeight;
	if (self.innerHeight){
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight){
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body){
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}

	var pageDimensions = {}
	if(yScroll < windowHeight){
		pageDimensions.height = windowHeight;
	} else {
		pageDimensions.height = yScroll;
	}

	if(xScroll < windowWidth){
		pageDimensions.width = windowWidth;
	} else {
		pageDimensions.width = xScroll;
	}
	return pageDimensions;
}

SiteFramework.prototype.getViewportDimensions = function(){
	var dimensions = {}
	if (Prototype.Browser.IE){
		dimensions.height = document.documentElement.clientHeight;
		dimensions.width = document.documentElement.clientWidth;
	} else {
		dimensions.height = window.innerHeight;
		dimensions.width = document.width || document.body.offsetWidth;
	}
	return dimensions;
}



//	---------------------------------------------------- Font changer
SiteFramework.fontMode = new Array('14px','16px','18px');
SiteFramework.currentFontMode  = 0;

SiteFramework.toggleFontSize = function(){
	var i = this.currentFontMode + 1;
	if (i >= this.fontMode.length){
		i = 0;
	}
	document.body.style.fontSize = this.fontMode[i];
	this.currentFontMode = i;
}

SiteFramework.redirect = function(url){
	this.prototype.redirect(url);
}

SiteFramework.debug = function(variable, label){
	this.prototype.debug(variable, label);
}
