/**
 * 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 ($('#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";

	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;
	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;
}

/**
 * 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;
}



