//******************************************************************************
// Copyright (C) 2011 SpeakLike Inc.
// All rights reserved.
//
// http://www.speaklike.com
//
// The program contains proprietary information of SpeakLike Inc.,
// and is licensed subject to restrictions on use and distribution.
//******************************************************************************
var slwidget = {}; 

slwidget.init = function(domain, username) {

	var body = document.getElementsByTagName('body')[0];
	var div = document.createElement('div');
	div.innerHTML = '<div id="slwidget-popup" class="slwidget-popup" onmouseover="slwidget_onMouseoverPopup(event)" onmouseout="slwidget_onMouseoutPopup(event)"><a href="javascript:void(0);" onclick="slwidget_nav();">Translation Feedback</a></div>';
	body.appendChild(div);

	this.companyDomain = domain;
	this.translatorUsername = username;
	this.contextUrl = document.location.href;
	this.popupElem = document.getElementById('slwidget-popup');
	this.currentTranslationElem = null;
	this.popupShowing = false;
	this.overPopup = false;
	this.overText = false;

	if (document.getElementsByClassName == undefined) {
		document.getElementsByClassName = function(className) {
			var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)");
			var allElements = document.getElementsByTagName("*");
			var results = [];
	
			var element;
			for (var i = 0; (element = allElements[i]) != null; i++) {
				var elementClass = element.className;
				if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass))
					results.push(element);
			}
	
			return results;
		}
	}
	
	var translations = document.getElementsByClassName('slwidget-translation');
	var translation;
	for (var i = 0; (translation = translations[i]) != null; i++) {
		translation.onmouseover = slwidget_onMouseoverText;
		translation.onmouseout = slwidget_onMouseoutText;
	}
}

function slwidget_nav() {
	if (slwidget.currentTranslationElem == null) {
		return;
	}

	var md5 = slwidget.currentTranslationElem.id;
	var lang = slwidget.currentTranslationElem.lang;
	var url = 'http://apps.speaklike.com/c/' + slwidget.companyDomain + '/review?cust_rev_md5=' + md5 + '&cust_rev_tl=' + lang + '&dm=compact';

	if (slwidget.translatorUsername) {
		url += '&cust_rev_user=' + encodeURIComponent(slwidget.translatorUsername);
	}

	if (slwidget.contextUrl) {
		url += '&cust_rev_url=' + encodeURIComponent(slwidget.contextUrl);
	}

	var newwindow = window.open(url,'SpeakLike Translation Feedback', 'height=600,width=750,resizable=1,scrollbars=1');
	if (window.focus) {
		newwindow.focus();
	}
}

function slwidget_onMouseoverText(e) {
	if (!e) var e = window.event;

	if (slwidget.currentTranslationElem != null) {
		return;
	}
	var el = e.currentTarget || e.toElement;
	
	if (!slwidget_hasClass(el, 'slwidget-translation')) {
		return;
	}
	
	slwidget_addClass(el, 'slwidget-highlight');
	slwidget.currentTranslationElem = el;
	slwidget.overText = true;

	setTimeout('slwidget_unhighlightTimer()', 200);
	setTimeout('slwidget_showPopupTimer()', 1000);
}

function slwidget_onMouseoutText(e) {
	if (!e) var e = window.event;
	var toElement = e.relatedTarget || e.toElement;
	if ((toElement == slwidget.currentTranslationElem) ||
		(slwidget_isChildOf(toElement, slwidget.currentTranslationElem))) {
		return;
	}
	slwidget.overText = false;
}

function slwidget_onMouseoverPopup() {
	slwidget.overPopup = true;
}

function slwidget_onMouseoutPopup(e) {
	if (!e) var e = window.event
	var toElement = e.relatedTarget || e.toElement;
	if ((toElement == slwidget.popupElem) ||
		(slwidget_isChildOf(toElement, slwidget.popupElem))) {
		return;
	}
	slwidget.overPopup = false;
}

function slwidget_unhighlightTimer() {
	if ((slwidget.overText) || (slwidget.overPopup)) {
		setTimeout('slwidget_unhighlightTimer()', 200);
		return;
	}

	slwidget_removeClass(slwidget.currentTranslationElem, 'slwidget-highlight');
	slwidget.currentTranslationElem = null;

	if (slwidget.popupShowing) {
		slwidget.popupElem.style.display = 'none';
		slwidget.popupShowing = false;
	}
}

function slwidget_showPopupTimer() {
	if ((slwidget.currentTranslationElem == null) || (slwidget.popupShowing)) {
		return;
	}

	var x = slwidget_findPosX(slwidget.currentTranslationElem) + slwidget.currentTranslationElem.offsetWidth + 5;
	var y = slwidget_findPosY(slwidget.currentTranslationElem);
	
	slwidget.popupElem.style.left =  x + "px";
	slwidget.popupElem.style.top = y + "px";
	slwidget.popupElem.style.display = 'block';
	slwidget.popupShowing = true;
}

function slwidget_hasClass(ele, cls) {
	if (!ele || !ele.className) {
		return false;
	}
	return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}

function slwidget_addClass(ele, cls) {
	if (!slwidget_hasClass(ele, cls)) {
		if (!ele.className) {
			ele.className = cls;
		} else {
			ele.className += " " + cls;
		}
	}
}

function slwidget_removeClass(ele, cls) {
	if (slwidget_hasClass(ele, cls)) {
    	var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
		ele.className = ele.className.replace(reg,' ');
	}
}

function slwidget_findPosX(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
		while(1) {
			curleft += obj.offsetLeft;
			if (!obj.offsetParent) {
				break;
			}
			obj = obj.offsetParent;
		}
	} else if (obj.x) {
		curleft += obj.x;
	}
	return curleft;
}

function slwidget_findPosY(obj) {
	var curtop = 0;
	if (obj.offsetParent) {
        while (1) {
			curtop += obj.offsetTop;
			if(!obj.offsetParent)
				break;
			obj = obj.offsetParent;
		}
    } else if (obj.y) {
        curtop += obj.y;
    }
    return curtop;
}

function slwidget_isChildOf(elem, parent) {
	if (!elem || !parent) {
		return false;
	}
	var cur = elem.parentNode;
	while((cur != undefined) && (cur != document.body)) {
		if (cur == parent) {
			return true;
		}
		cur = cur.parentNode;
	}
	return false;
}

