var isBrowsMSIE = document.attachEvent != null;
var isBrowsGecko = !document.attachEvent && document.addEventListener;

window.Get_DOM_Node = window.__$ = document.all ? function(n){return document.all[n]} : (document.getElementById ? (function(n){return document.getElementById(n)}) : null);

var servicesPopupObjArray = new Array();

/* Crossbrowser stop event propogation */
function Cancel_EventPropagation(element, event, cancelDefault, cancelPropogation) {

	cancelPropogation = (cancelPropogation === false) ? false : true;
	cancelDefault = (cancelDefault === false) ? false : true;

	if (isBrowsMSIE) {
		if (element) {
			if (element.returnValue) {
				if (cancelDefault) element.returnValue = false;
			}
			if (element.cancelBubble) {
				if (cancelPropogation) element.cancelBubble = true;
			}
		}
		if (cancelDefault) window.event.returnValue = false;
		if (cancelPropogation) window.event.cancelBubble = true;
	}
	else if (isBrowsGecko && event) {
		if (element) {
			if (element.preventDefault) {
				if (cancelDefault) element.preventDefault();
			}
			if (element.stopPropagation) {
				if (cancelPropogation) element.stopPropagation();
			}
		}
		if (cancelDefault) event.preventDefault();
		if (cancelPropogation) event.stopPropagation();
	}
}

function AbsLayerPopup(id, event, action, docLeftPosition, docTopPosition, zIndex, extraCloseEventCallback, stopAutoClose) {

	this.id = id;
	this.alphaBgPopupLayer = 'alphaBg_'+Math.round(Math.random()*1000000);
	this.event = (event) ? event : window.event;
	this.action = action;
	this.topPos = (docTopPosition) ? parseInt(docTopPosition) : 0;
	this.leftPos = (docLeftPosition) ? parseInt(docLeftPosition) : 0;
	this.zIndex = parseInt(zIndex);
	this.callback = extraCloseEventCallback;
	this.stopAutoClose = (stopAutoClose) ? true : false;

	var this_closure = this;

	this.Update_Properties = function(id, event, action, docLeftPosition, docTopPosition, zIndex, extraCloseEventCallback, stopAutoClose) {
		this.id = id;
		this.event = (event) ? event : window.event;
		this.action = action;
		this.topPos = (docTopPosition) ? parseInt(docTopPosition) : 150;
		this.leftPos = (docLeftPosition) ? parseInt(docLeftPosition) : 150;
		this.zIndex = parseInt(zIndex);
		this.callback = extraCloseEventCallback;
		this.stopAutoClose = (stopAutoClose) ? true : false;
		this_closure = this;
	}
	/*
		Should be called after object creation
		Intent: adds opacity layer with lower z-index of existing popup layer to prevent lundertow layer's events
	*/
	this.Create_AlphaBgLayer = function() {
		var ELEMENT_NODE = 1;
		var styleAlphaBg = new Array(
			'position:absolute',
			'background-color: #FFF',
			'filter:alpha(opacity=0)', 'moz-opacity:0', 'opacity:0',
			'display:none', 'visibility:hidden'
		);
		if (Get_DOM_Node(this.id).nodeType == ELEMENT_NODE) {
			var parentNode = Get_DOM_Node(this.id).parentNode;
			if(parentNode != null) {
				var alphaLayer = document.createElement('DIV');
				alphaLayer.id = this.alphaBgPopupLayer;
				alphaLayer.style.cssText = styleAlphaBg.join(';');
				parentNode.appendChild(alphaLayer);
			}
		}
	}
	this.Control_LayerPopup = function () {
		var layer = Get_DOM_Node(this.id); if (!layer) return false;
		Cancel_EventPropagation(null, this.event);
		var element = (this.event.target) ? this.event.target : this.event.srcElement;
		if (element.blur) {element.blur();}	// fix: remove annoying link border

		layer.style.top = this.topPos+'px';
		layer.style.left = this.leftPos+'px';
		layer.style.zIndex = this.zIndex;
		Change_LayerVisibility(this.id);

		// Background layer with lower z-index value to make undertow layers not active
		var alphaLayer = Get_DOM_Node(this.alphaBgPopupLayer);
		if (alphaLayer) {
			alphaLayer.style.left = parseInt(this.leftPos)+'px';
			alphaLayer.style.top = parseInt(this.topPos)+'px';
			alphaLayer.style.width = parseInt(layer.offsetWidth)+'px';
			alphaLayer.style.height = parseInt(layer.offsetHeight)+'px';
			alphaLayer.style.zIndex = parseInt(layer.style.zIndex)-1;
			Change_LayerVisibility(this.alphaBgPopupLayer);
		}
		if (this.stopAutoClose == false) {
			Attach_EventListener(document, this.action, this.Close_AllServicesPopup, false);
		}
		Attach_EventListener(layer, this.action, this.Cancel_Close_AllServicesPopup, false);

	}
	this.Close_AllServicesPopup = function(event) {
		Change_LayerVisibility(this_closure.id, false, true);
		if (Get_DOM_Node(this_closure.alphaBgPopupLayer)) Change_LayerVisibility(this_closure.alphaBgPopupLayer, false, true);
		Detach_EventListener(document, this_closure.action, this_closure.Close_AllServicesPopup, false);
		Detach_EventListener(Get_DOM_Node(this_closure.id), this_closure.action, this_closure.Cancel_Close_AllServicesPopup, false);
		if (typeof(this_closure.callback) == 'function') {this_closure.callback(event);}
	}
	this.Cancel_Close_AllServicesPopup = function(event) {
		event = (event) ? event : window.event;
		var element = (event.target) ? event.target : event.srcElement;
		if (element != Get_DOM_Node(this_closure.id)) {
			Cancel_EventPropagation(document, event, (cancelDefault=false));
		}
	}
}

function Find_AbsoluteDocObjCoord_X(obj) {
	var coords = Find_AbsoluteDocObjCoords(obj);
	return coords[0];
}
function Find_AbsoluteDocObjCoord_Y(obj) {
	var coords = Find_AbsoluteDocObjCoords(obj);
	return coords[1];
}

function Get_ElementCurrentStyle(element, CssStyleProperty) {
	if (!element) return false;
	if (element.currentStyle) {
		return element.currentStyle[CssToJavascriptStyle(CssStyleProperty)];
	}else if (window.getComputedStyle) {
		var compStyle = window.getComputedStyle(element, '');
		return compStyle.getPropertyValue(CssStyleProperty);
	}else {
		return '';
	}
}

function CssToJavascriptStyle(CssProperty) {
	var stringArray = CssProperty.toLowerCase().split('-');
	if (stringArray.length == 1) {
		return stringArray[0];
	}
	var ret = (CssProperty.indexOf("-") == 0) ? stringArray[0].charAt(0).toUpperCase() + stringArray[0].substring(1) : stringArray[0];
	for (var i = 1; i < stringArray.length; i++) {
		var s = stringArray[i];
		ret += s.charAt(0).toUpperCase() + s.substring(1);
	}
	return ret;
};

function Fire_PopupDocLayer(id, event, action, docLeftPos, docTopPos, zIndex, extraCloseEventCallback, stopAutoClose) {

	var servicesPopup = null;
	zIndex = (zIndex) ? parseInt(zIndex) : parseInt(Get_ElementCurrentStyle(Get_DOM_Node(id), 'z-index'));

	event = (event) ? event : window.event;
	var element = (event.target) ? event.target : event.srcElement;

	var defaultLeftDeviation = 0;
	var defaultTopDeviation = 15;

	var elementCoords_X = (docLeftPos) ? parseInt(docLeftPos) : (Find_AbsoluteDocObjCoord_X(element) + defaultLeftDeviation);
	var elementCoords_Y = (docTopPos) ? parseInt(docTopPos) : (Find_AbsoluteDocObjCoord_Y(element) + defaultTopDeviation);

	for (var i=0; i < servicesPopupObjArray.length; i++) {
		var obj = servicesPopupObjArray[i];
		if (obj.id == id) {
			servicesPopup = obj;
		}
		else if(action == obj.action) {
			obj.Close_AllServicesPopup();
		}
	}
	if (servicesPopup) {
		servicesPopup.Update_Properties(id, event, action, elementCoords_X, elementCoords_Y, zIndex, extraCloseEventCallback, stopAutoClose);
	}
	else {
		servicesPopup = new AbsLayerPopup(id, event, action, elementCoords_X, elementCoords_Y, zIndex, extraCloseEventCallback, stopAutoClose);
		servicesPopup.Create_AlphaBgLayer();
		servicesPopupObjArray[servicesPopupObjArray.length] = servicesPopup;
	}
	servicesPopup.Control_LayerPopup();
	return false;
}

function Check_LayerVisibility(layer) {

	if (typeof(layer) == 'string'){layer = Get_DOM_Node(layer);}
	else if(typeof(layer) != 'object') {return 'undef';}

	if (layer.style.display == '') layer.style.display = Get_ElementCurrentStyle(layer, 'display');

	if (layer.style.display == 'none') {
		return 'hidden';
	}
	else if (layer.style.display == 'block') {
		return 'visible';
	}
	return 'undef';
}

function Change_LayerVisibility(id, forceOpen, forceClose) {
	var layer = Get_DOM_Node(id); if (!layer) return false;

	if ((Check_LayerVisibility(layer) === 'hidden' && !forceClose) || forceOpen) {
		layer.style.display = 'block';
	}
	else if ((Check_LayerVisibility(layer) === 'visible' && !forceOpen) || forceClose) {
		layer.style.display = 'none';
	}
	return false;
}

function f_scrollLeft() {
	return f_filterResults (
		window.pageXOffset ? window.pageXOffset : 0,
		document.documentElement ? document.documentElement.scrollLeft : 0,
		document.body ? document.body.scrollLeft : 0
	);
}
function f_scrollTop() {
	return f_filterResults (
		window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0
	);
}
function f_filterResults(n_win, n_docel, n_body) {
	var n_result = n_win ? n_win : 0;
	if (n_docel && (!n_result || (n_result > n_docel)))
		n_result = n_docel;
	return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}

function f_clientWidth() {
	return f_filterResults (
		window.innerWidth ? window.innerWidth : 0,
		document.documentElement ? document.documentElement.clientWidth : 0,
		document.body ? document.body.clientWidth : 0
	);
}
function f_clientHeight() {
	return f_filterResults (
		window.innerHeight ? window.innerHeight : 0,
		document.documentElement ? document.documentElement.clientHeight : 0,
		document.body ? document.body.clientHeight : 0
	);
}
function closePopupFormEscape(event) {
	if (event.keyCode==27) {
		closePopupForm(event);
		Detach_EventListener(document, 'keyup', closePopupForm);
	}
	return false;
}

/* Crossbrowser attachEvent | addEventListener */
function Attach_EventListener(element, action, callback, capture) {
	capture = (capture) ? true : false;
	element = (element) ? element : document;
	if (isBrowsMSIE && element.attachEvent) {
			element.attachEvent("on"+action, callback);
	}
	else if (isBrowsGecko && element.addEventListener) {
		element.addEventListener(action, callback, capture);
	}
}

/* Crossbrowser attachEvent | addEventListener */
function Detach_EventListener(element, action, callback, capture) {
	capture = (capture) ? true : false;
	element = (element) ? element : document;
	if (isBrowsMSIE && element.detachEvent) {
		element.detachEvent("on"+action, callback);
	}
	else if (isBrowsGecko && element.removeEventListener) {
		element.removeEventListener(action, callback, capture);
	}
}

function showPopupForm(event) {

	var floatForm = Get_DOM_Node('loginForm'); if (!floatForm) return true;

	var X = f_scrollLeft() + Math.round(f_clientWidth()/2) - 300;
	var Y = f_scrollTop() + Math.round(f_clientHeight()/2) - 100;


	Fire_PopupDocLayer('loginForm', event, 'click', X, Y, 2000, closePopupForm, (stopALoginFormutoClose = true));

	var alphaBg = Get_DOM_Node('formAlpha');
	alphaBg.style.width = document.body.scrollWidth + 10 + 'px';
	alphaBg.style.height = document.body.scrollHeight + 'px';
	Change_LayerVisibility('formAlpha', true, false);

	Attach_EventListener(document, 'keyup', closePopupFormEscape);

	$('popuploginform').login.focus();
	return false;
}
function closePopupForm(event) {
	Change_LayerVisibility('loginForm', false, true);
	Change_LayerVisibility('formAlpha', false, true);
	return false;
}

function showMailagentForm(event) {

	var floatForm = Get_DOM_Node('mailagentForm'); if (!floatForm) return true;

	var X = f_scrollLeft() + Math.round(f_clientWidth()/2) - 600;
	var Y = f_scrollTop() + Math.round(f_clientHeight()/2) - 300;


	Fire_PopupDocLayer('mailagentForm', event, 'click', X, Y, 2000, closeMailAgentForm, (stopALoginFormutoClose = true));

	var alphaBg = Get_DOM_Node('formAlpha');
	alphaBg.style.width = document.body.scrollWidth + 10 + 'px';
	alphaBg.style.height = document.body.scrollHeight + 'px';
	Change_LayerVisibility('formAlpha', true, false);

	Attach_EventListener(document, 'keyup', closeMailAgentFormEscape);

	return false;
}

function closeMailagentForm(event) {
	Change_LayerVisibility('mailagentForm', false, true);
	Change_LayerVisibility('formAlpha', false, true);
	return false;
}

function closeMailAgentFormEscape(event) {
	if (event.keyCode==27) {
		closeMailAgentForm(event);
		Detach_EventListener(document, 'keyup', closeMailAgentForm);
	}
	return false;
}

function closeMailAgentForm(event) {
	Change_LayerVisibility('mailagentForm', false, true);
	Change_LayerVisibility('formAlpha', false, true);
	return false;
}

