/**
 * Tools for meta-webplayer framework
 * @author m.donay@meta-fusion.com
 */
/**
 * This function has to be the very topmost one. It's JavaSCRIPT, not Java...
 * @param {String} separator: optional
 */
String.prototype.namespace = function(separator){
    var ns = this.split(separator || '.'), p = window, i;
    for (i = 0; i < ns.length; i++) {
        p = p[ns[i]] = p[ns[i]] ||
        {};
    }
};

// register com.metafusion (ns is a dummy)
'com.metafusion.ns'.namespace('.');

/**
 * gets an HTMLObject from an identifier
 * @param {String} id
 * @return {HTMLObject}
 */
function $$(id){
    return document.getElementById(id);
}

/**
 * checks wether the user agent conatins the given parameter
 * @param {String} name
 * @return {Boolean}
 */
function checkBrowserName(name){
    var agent = navigator.userAgent.toLowerCase();
    if (agent.indexOf(name.toLowerCase()) > -1) {
        return true;
    }
    return false;
}

/**
 * checks wether the browser platformt conatins the given parameter
 * @param {String} name
 * @return {Boolean}
 */
function checkPlatform(name){
    var platform = navigator.platform.toLowerCase();
    if (platform.indexOf(name.toLowerCase()) > -1) {
        return true;
    }
    return false;
}


/**
 * use this function communicate errors
 * @param {Object} message
 */
function error(message){
    alert(message);
}

/**
 * use this function communicate infos and debug messages
 * @param {Object} message
 */
function debug(message){
    if ($$('debug') != null) {
        $$('debug').innerHTML += "<br>" + message;
    }
}

/**
 * use this function log stuff
 * @param {Object} message
 */
function log(message){
    if ((typeof $ != "undefined") && $('#log') != null) {
        $('#log').innerHTML = message + '<br>' + $('log').innerHTML;
    }
}

/**
 * loads an external javascript file into the header
 * @param {String} url: location of the javascript file
 */
function loadScript(url){
    var e = document.createElement("script");
    e.src = url;
    e.type = "text/javascript";
    document.getElementsByTagName("head")[0].appendChild(e);
}

function fillHelpLink(){
    jQuery("#helplink").bind("click", function(){
        // it is absolutely not nice to have this hardcoded
        // but I'm tired and it's just for the demo tomorrow
        // TODO: Change this properly
        // still TODO... :-)
        tb_show("Do you require assistance?", "assets/wm_help.html" + "?KeepThis=true&TB_iframe=true&modal=false&width=600&height=500", false);
    });
}

/**
 * @author Gizmo
 * Time conversion functions copied from http://bytes.com/groups/javascript/92815-converting-milliseconds-days-hours-minutes-seconds
 */
function two(x){
    return ((x > 9) ? "" : "0") + x
}

function three(x){
    return ((x > 99) ? "" : "0") + ((x > 9) ? "" : "0") + x
}

/**
 * converts UnixTime to a more human readable string
 * @param {String} ms
 */
function timeString(ms){
    var sec = Math.floor(ms / 1000)
    var t = "";
    ms = ms % 1000;
    //t = three(ms)

    var min = Math.floor(sec / 60);
    sec = sec % 60;
    t = two(sec);

    var hr = Math.floor(min / 60);
    min = min % 60;
    t = two(min) + ":" + t;

    var day = Math.floor(hr / 60);
    hr = hr % 60;
    //t = two(hr) + ":" + t;
    t = hr + ":" + t;
    //t = day + ":" + t;

    return t;
}



/**
 * Calculates the users local time to the given congresstime and the timeOffset
 * @param {Date} sessionBegin_congressTime
 * @param {number} congressTimeOffset
 * @return (string) timestring
 */
function congressTimeToUserTime_from_js_dateobject(sessionBegin_congressTime, congressTimeOffset){
    return "This function is not yet fully implemented...";
    var montharray = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");

    var debugoutput = "";

    debugoutput += "sessionBegin_congressTime: " + sessionBegin_congressTime + "\n";
    //alert ("Debug:"+debugoutput);
    var congressTimeOffset_ms = congressTimeOffset * 60 * 60 * 1000;
    debugoutput += "congressTimeOffset: " + congressTimeOffset + "\n";

    var localtime = new Date();
    debugoutput += "Localtime: " + localtime + "\n";
    var localtime_ms = localtime.getTime();
    debugoutput += "localtime_ms: " + localtime_ms + "\n";
    // obtain local UTC offset and convert to msec
    var localOffset_min = localtime.getTimezoneOffset();
    debugoutput += "localOffset_min: " + localOffset_min + "\n";
    var localOffset_ms = localOffset_min * 60 * 1000;

    // obtain UTC time in msec
    var utc_ms = localtime_ms + localOffset_ms;
    debugoutput += "utc_ms: " + utc_ms + "\n";
    var GMT_TIME = new Date(utc_ms);
    debugoutput += "GMT_TIME: " + GMT_TIME + "\n";

    var congressTime_ms = utc_ms + congressTimeOffset_ms;
    debugoutput += "congressTime_ms: " + congressTime_ms + "\n";
    var congressTime = new Date(congressTime_ms);
    debugoutput += "congressTime: " + congressTime + "\n";
    var timedifference_ms = congressTime_ms - localtime_ms;
    debugoutput += "timedifference: " + timedifference_ms / 60000 + "\n";

    var sessionbegin_ms = sessionBegin_congressTime.getTime();
    debugoutput += "sessionbegin_ms: " + sessionbegin_ms / 1000 + "\n";

    var sessionbegin_local_ms = sessionbegin_ms + timedifference_ms;
    //var sessionbegin_local_ms = sessionbegin_ms - timedifference_ms + localOffset_ms;

    var sessionbegin_local = new Date(sessionbegin_local_ms);
    debugoutput += "sessionbegin_local: " + sessionbegin_local + "\n";

    //var rtYear = two (sessionbegin_local.getYear());
    var rtYear = two(sessionbegin_local.getYear() - 100);
    //alert ("rtYear: " + rtYear);
    var rtMonth = montharray[sessionbegin_local.getMonth()];
    //alert ("Day: " + sessionbegin_local.getDate());
    var rtDay = two(sessionbegin_local.getDate());
    //alert (debugoutput);
    var rtHour = two(sessionbegin_local.getHours());
    var rtMinute = two(sessionbegin_local.getMinutes());

    var returnstring = rtDay + " " + rtMonth + " " + rtYear + " - " + rtHour + ":" + rtMinute;
    return returnstring;
}

function congressTimeToUserTime_from_unixTimestamp(sessionBegin_congressTime_sec, congressTimeOffset){
    var montharray = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
    var debugoutput = "";
    debugoutput += "sessionBegin_congressTime_sec: " + sessionBegin_congressTime_sec + "\n";
    debugoutput += "congressTimeOffset: " + congressTimeOffset + "\n";
    //alert ("test");
    //return "test";
    //var mydate = new Date (sessionBegin_congressTime * 1000);
    //alert ("JS Dateobject vor Aufruf der JS Funktion: " + mydate);
    //alert (congressTimeToUserTime_from_js_dateobject (mydate, congressTimeOffset));
    //alert (sessionBegin_congressTime);

    var congressTimeOffset_sec = congressTimeOffset * 60 * 60 * -1;
    debugoutput += "congressTimeOffset_sec: " + congressTimeOffset_sec + "\n";

    var localtime = new Date();
    var localtime_sec = localtime.getTime() / 1000;
    debugoutput += "localtime_sec: " + localtime_sec + "\n";

    var localOffset_min = localtime.getTimezoneOffset();
    debugoutput += "localOffset_min: " + localOffset_min + "\n";
    var localOffset_sec = localOffset_min * 60;

    var utc_sec = localtime_sec + localOffset_sec;
    debugoutput += "utc_sec: " + utc_sec + "\n";

    var timedifference_sec = localOffset_sec - congressTimeOffset_sec;
    debugoutput += "timedifference_sec: " + timedifference_sec + "\n";

    session_start_usertime_sec = sessionBegin_congressTime_sec + timedifference_sec; //- localOffset_sec;
    debugoutput += "session_start_usertime_sec: " + session_start_usertime_sec + "\n";

    var session_start_usertime = new Date(session_start_usertime_sec * 1000);
    debugoutput += "session_start_usertime: " + session_start_usertime + "\n";

    //alert (debugoutput);


    var rtYear = two(session_start_usertime.getYear() - 100);
    //alert ("rtYear: " + rtYear);
    var rtMonth = montharray[session_start_usertime.getMonth()];
    //alert ("Day: " + sessionbegin_local.getDate());
    var rtDay = two(session_start_usertime.getDate());
    //alert (debugoutput);
    var rtHour = two(session_start_usertime.getHours());
    var rtMinute = two(session_start_usertime.getMinutes());

    var returnstring = rtDay + " " + rtMonth + " " + rtYear + " - " + rtHour + ":" + rtMinute;
    return returnstring;
    //return session_start_usertime_sec;
}



/**
 * Returns the clipPosition to the given Sliderposition
 * @param {int} sliderpos in ms
 * @param {int} sliderlength in ms
 * @param {int} clipLength in ms
 * @return (int) clipPosition in ms
 */
function getPlayerTimeFromSliderPos(sliderpos, sliderlength, clipLength){
    var posInMs = clipLength / (sliderlength / sliderpos);
    return posInMs;
}

/**
 * Returns the sliderPosition to a given videoTime/Position
 */
function getSliderPosFromPlayerTime(videoTime, sliderLength, videoLength){
    var msInPos = (videoTime / videoLength) * sliderLength;
    return msInPos;
}

/**
 * sets errorimage for the given Tag
 * @param {strin} imageTag <img> tag of the image
 * @param {string} standard error image, if no errorimage is given
 */
function imageNotFound(imageTag, errorimagePath){
    if (errorimagePath == null) {
        errorimagePath = "assets/warning.jpg";
    }
    imageTag.src = errorimagePath;
    imageTag.onerror = "";
    return true;
}




function setDisplay(target, value)
{
var CSS_INVISIBLE = 'displaynone';
var CSS_VISIBLE = 'displayinherit';

  if (target == null) return;
  value = value==null?true:value;
   if (value)
  {
    if ($('#'+target).hasClass(CSS_INVISIBLE))
    {
        $('#'+target).removeClass(CSS_INVISIBLE);
    }
    $('#'+target).addClass(CSS_VISIBLE);
  } else
  {
    if ($('#'+target).hasClass(CSS_VISIBLE))
    {
        $('#'+target).removeClass(CSS_VISIBLE);
    }
    $('#'+target).addClass(CSS_INVISIBLE);
  }
}


function setVisible(target, value)
{
	var CSS_INVISIBLE = 'visibilityhidden';
	var CSS_VISIBLE = 'visibilityinherit';

	if (target == null) return;
	value = value==null?true:value;
	if (value)
	{
		if ($('#'+target).hasClass(CSS_INVISIBLE))
	    {
	        $('#'+target).removeClass(CSS_INVISIBLE);
	    }
		$('#'+target).show();
	} else
	{
		if ($('#'+target).hasClass(CSS_VISIBLE))
	    {
	        $('#'+target).removeClass(CSS_VISIBLE);
	    }
		$('#'+target).hide();
	}

	/*
var CSS_INVISIBLE = 'visibilityhidden';
var CSS_VISIBLE = 'visibilityinherit';

  if (target == null) return;
  value = value==null?true:value;
   if (value)
  {
    if ($('#'+target).hasClass(CSS_INVISIBLE))
    {
        $('#'+target).removeClass(CSS_INVISIBLE);
    }
    $('#'+target).addClass(CSS_VISIBLE);
  } else
  {
    if ($('#'+target).hasClass(CSS_VISIBLE))
    {
        $('#'+target).removeClass(CSS_VISIBLE);
    }
    $('#'+target).addClass(CSS_INVISIBLE);
  }
  */
}

//function setVisible(tag, visible){
//    if ($$(tag) != null) {
//        if ((typeof visible) == (typeof true)) {
//            $$(tag).style.visibility = visible ? 'visible' : 'hidden';
//        }
//    }
//    else
//        if (tag != null) {
//            if ((typeof visible) == (typeof true)) {
//                tag.style.visibility = visible ? 'visible' : 'hidden';
//            }
//        }
//}
/**
 * Inserts the CongressTime and the users local time into the page
 * @param {string} congresstimeDivID id of the DIV where the congress timestring should be inserted (without the #)
 * @param {string} localtimeDivID id of the DIV where the local timestring should be inserted (without the #)
 * @param {int} congressTimeZoneOffset timezone offzet of the congress (e.g. 1 for GMT +1)
 * @param {string} acuracy set it to "sec" if you want to have displayed in format hh:mm:ss or to "min" (or anything else) if you prefer hh:mm
 */
function insertCongressTimes (congressData, congresstimeDivID, localtimeDivID, congressTimeZoneOffset, acuracy) {
    var localtime = new Date();
	var localtimeHour = two(localtime.getHours());
	var localtimeMinute = two(localtime.getMinutes());
	var localtimeSecond = two(localtime.getSeconds());

    var localtime_sec = localtime.getTime() / 1000;
    var localOffset_min = localtime.getTimezoneOffset() *-1;
    var localOffset_hour = Math.round (localOffset_min / 60);


	var timedifference = congressTimeZoneOffset - localOffset_hour;
	var congresstimestamp = (localtime_sec + timedifference * 60 * 60) * 1000;

	var congresstime = new Date (congresstimestamp);
    var congressHour = two(congresstime.getHours());
	var congressMinute = two(congresstime.getMinutes());
	var congressSecond = two(congresstime.getSeconds());

	if (acuracy == "sec") {
		var congressTimestring = congressHour + ":" + congressMinute + ":" + congressSecond + " " + congressData.timezonename;
		var localTimestring = localtimeHour + ":" + localtimeMinute + ":" + localtimeSecond;
	} else {
		var congressTimestring = congressHour + ":" + congressMinute + " " + congressData.timezonename;
		var localTimestring = localtimeHour + ":" + localtimeMinute;
	}

	$("#"+congresstimeDivID).html (congressTimestring);
	$("#"+localtimeDivID).html (localTimestring);
}

/**
 * limits a text to a given length, cutting at blanks (wordwise) and adding '...'
 * @param {Object} text: text to be limited
 * @param {Object} limit: number of chars allowed
 */
function limitText(text, limit){
			if (limit == null)
			{
				limit = 25;
			}
			var result = "";
			if (text != null)
			{
				if (typeof text != "text")
				{
					text = text.toString();
				}
				var words = text.split(' ');
				var currentLength = 0;
				for(i = 0; i < words.length; i++)
				{
					currentLength += words[i].length;
					if (currentLength <= limit){
						result += words[i] + " ";
					}
					else{
						break;
					}
				}
				if (currentLength > limit)
				{
					result += "...";
				}
			}
			return result;
        }
