/*
 * function array_diff()
 * function hover()
 * function img(img_url, id, title, width, height)
 * function numberFormat(number), nf(number)
 * function p(str, id)
 * function pImg(img_url, id, title, width, height)
 * function print_r(x, max, sep, 1), var_dump(x, max, sep, 1)
 * function publishStory(template_bundle_id, template_data, user_msg, body_general, target_ids)
 * function str_replace(search, replace, subject, count)
 * function strip_tags(str, allowed_tags)
 * function strtok(str, tokens)
 * function t(str)
 * function textHtml(str), codeHtml(str)
 * function timeFormat(t_sec), tF(t_sec)
 * function ucfirst(str)
 * function uuescape(str)
 * function zeroPad(num,count)
 * getRaceImage(race)
 */

function array_diff() {
    // *     example 1: array_diff(['Kevin', 'van', 'Zonneveld'], ['van', 'Zonneveld']);
    // *     returns 1: ['Kevin']
 
    var arr1 = arguments[0], retArr = {};
    var k1 = '', i = 1, k = '', arr = {};
 
    arr1keys:
    for (k1 in arr1) {
        for (i = 1; i < arguments.length; i++) {
            arr = arguments[i];
            for (k in arr) {
                if (arr[k] === arr1[k1]) {
                    // If it reaches here, it was found in at least one array, so try next value
                    continue arr1keys; 
                }
            }
            retArr[k1] = arr1[k1];
        }
    }
 
    return retArr;
};

function dump(variable)
{
	$.prompt(var_dump(variable));
};

function hover()
{
	$('.btn_submit_small, .btn_hitlist_attack, .btn_vam, .btn_wolf, .btn_hum, .btn_med_healer, .btn_med_recruiter, .btn_med_speed, .btn_med_treasure').hover(function(){$(this).addClass('button_hover');}, function(){$(this).removeClass('button_hover');});
	$('.btn_heal, .btn_upgrade, .btn_deposit, .btn_withdraw').hover(function(){$(this).addClass('button_hover');}, function(){$(this).removeClass('button_hover');});
	$('.btn_accept').hover(function(){$(this).addClass('button_hover');}, function(){$(this).removeClass('button_hover');});
	$('.btn_buy').hover(function(){$(this).addClass('button_hover');}, function(){$(this).removeClass('button_hover');});
	$('.btn_sell').hover(function(){$(this).addClass('button_hover');}, function(){$(this).removeClass('button_hover');});
	$('.button').hover(function(){$(this).addClass('button_hover');}, function(){$(this).removeClass('button_hover');});
	$('.top_right_info').hover(function(){$(this).addClass('button_hover');}, function(){$(this).removeClass('button_hover');});
	$('.btn').hover(function(){$(this).addClass('button_hover');}, function(){$(this).removeClass('button_hover');});
	$('.cross,.ok').hover(function(){$(this).addClass('button_hover');}, function(){$(this).removeClass('button_hover');});
	$('.btn_domission, .btn_missionagain').hover(function(){$(this).addClass('button_hover');}, function(){$(this).removeClass('button_hover');});
	$('.btn_attack, .btn_setbounty, .btn_attackagain').hover(function(){$(this).addClass('button_hover');}, function(){$(this).removeClass('button_hover');});
};

function mouseIn(obj, css_class)
{
	if(!css_class)
		css_class = 'button_hover';
	$(obj).addClass(css_class);
}
mIn = mouseIn;

function mouseOut(obj, css_class)
{
	if(!css_class)
		css_class = 'button_hover';
	$(obj).removeClass(css_class);
}
mOut = mouseOut;

function img(img_url, id, title, width, height)
{
	if(!width || width=="")
		width = 75;
	if(!height || height=="")
		height = 75;
	if(!title || title == "")
		title = "profile";
	var str = String();
	str = "<div title=\""+title+"\"><img src=\""+img_url+"\" width=\""+width+"px\" height=\""+height+"px\" /></div>";
	return str;
};

function notify(to, message, callback)
{
	var global_viewerId = to; 
    var firstButton = MyOpenSpace.newNotificationButton(MyOpenSpace.NotificationButton.UrlTypes.CANVAS, "Click here to play Dark Wars!", null);
    var buttons = [firstButton];
    var param = {};
    param[MyOpenSpace.Notification.Field.BODY] = message;
    param[MyOpenSpace.Notification.Field.BUTTONS] = buttons;
    var notification = MyOpenSpace.newNotification(param);
    MyOpenSpace.requestCreateNotification(global_viewerId, notification, function(){if(callback) callback();});
}

function numberFormat(a_number){
    a_number += '';
    var l_numberParts = a_number.split('.');
    var l_beforeDecimal = l_numberParts[0];
    var l_afterDecimal = l_numberParts.length > 1 ? '.' + l_numberParts[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(l_beforeDecimal)) {
        l_beforeDecimal = l_beforeDecimal.replace(rgx, '$1' + ',' + '$2');
    }
    return l_beforeDecimal + l_afterDecimal;
};
nF = numberFormat;

function p(str, id)
{
	var p_url = config.appUrl+'&appParams=\{"user_id":"'+id+'"\}';
	if(str==null)
		return '<a  class="user_name2" title=\'Deleted User\' target=\'_blank\' href=\''+p_url+'\'>Deleted</a>';
	else
		return '<a  class="user_name2" title=\''+str+'\' target=\'_blank\' href=\''+p_url+'\'>'+str.substr(0, 5)+'</a>';
};

/**
 * generates pagination
 * @param current_page currently selected page
 * @param onClickFunction function to call when pageination is clicked 
 * @param pageEnd last page number(total number of pages)
 * @param num viewable range (window) of page number
 * @return String pagination string
 * @author ajeet shakya
 * @since june 12, 2009
 * @example pagination(5, "nextPage", 25, 10)
 */
function pagination(current_page, onClickFunction, pageEnd, num)
{
	var page = current_page;
	var start = 0;
	if(!num)
		num = 10;
	if(page>3)
		start = parseInt(page)-3;
	if(num>pageEnd)
		num = pageEnd;
	var end = start+num;
	if(end>pageEnd)
	{
		end = pageEnd;
		start = end - num;
	}
	var content = "<ul class=\"pagination\">";
	if(page <= 1)
		content += " <li class=\"previous-off\">&#0171; &nbsp;previous</li>";
	else
		content += " <li><a href=\"javascript:"+onClickFunction+"("+(parseInt(page)-1)+")\" class=\"prevnext\">&#0171; &nbsp;previous</a></li>";

	for(i=start+1; i<=end; i++)
	{
		if(i == page)
			content += " <li class=\"active\">"+i+"</li>";
		else
			content += " <li><a href=\"javascript:"+onClickFunction+"("+i+")\">"+i+"</a></li> ";
		}
	if(page >= pageEnd)
		content += " <li class=\"previous-off\">next&nbsp; &#0187;</li>";
	else
		content += " <li><a href=\"javascript:"+onClickFunction+"("+(parseInt(page)+1)+")\" class=\"prevnext\">next&nbsp; &#0187;</a></li>";
	content += "</ul>";	
	return content;
};

function paginationNew(container, total_items, items_per_page, onClickFunction, current_page)
{
	if(!current_page || current_page == undefined)
		current_page = 0;
	if((current_page+1) > total_items/items_per_page)
		current_page = 0;
	$(""+container).pagination(total_items, {
		items_per_page:items_per_page, 
		callback:onClickFunction,
		num_edge_entries: 3,
		current_page:current_page,
		num_display_entries: 6, 
		ellipse_text: '...'
	});
	if(total_items/items_per_page > 1)
		$(""+container).show();
	else
		$(""+container).hide();
};

function pImg(img_url, id, title, width, height)
{
	if(!width || width=="")
		width = 75;
	if(!height || height=="")
		height = 75;
	if(!title || title == "")
		title = "Deleted User";
	var p_url = config.appUrl+'&appParams=\{"user_id":"'+id+'"\}';
	var str = String();
	str = '<a title=\''+title+'\' target=\'_blank\' href=\''+p_url+'\'><img src=\''+img_url+'\' width=\''+width+'px\' height=\''+height+'px\' /></a>';
	return str;
};

/**
 * Concatenates the values of a variable into an easily readable string
 * @param {Object} x The variable to debug
 * @param {Number} max The maximum number of recursions allowed (keep low, around 5 for HTML elements to prevent errors) [default: 10]
 * @param {String} sep The separator to use between [default: a single space ' ']
 * @param {Number} l The current level deep (amount of recursion). Do not use this parameter: it's for the function's own use
 */
function print_r(x, max, sep, l) {

	l = l || 0;
	max = max || 10;
	sep = sep || ' ';

	if (l > max) {
		return "[WARNING: Too much recursion]\n";
	}

	var
		i,
		r = '',
		t = typeof x,
		tab = '';

	if (x === null) {
		r += "(null)\n";
	} else if (t == 'object') {

		l++;

		for (i = 0; i < l; i++) {
			tab += sep;
		}

		if (x && x.length) {
			t = 'array';
		}

		r += '(' + t + ") :\n";

		for (i in x) {
			try {
				r += tab + '[' + i + '] : ' + print_r(x[i], max, sep, (l + 1));
			} catch(e) {
				return "[ERROR: " + e + "]\n";
			}
		}

	} else {

		if (t == 'string') {
			if (x == '') {
				x = '(empty)';
			}
		}

		r += '(' + t + ') ' + x + "\n";

	}

	return r;

};
var_dump = print_r;

function publishStory(template_bundle_id, template_data, user_msg, body_general, target_ids)
{
	//$.prompt(var_dump(template_data));
	if(user_msg == undefined)
		user_msg = '';
	if(body_general == undefined)
		body_general = '';
	var	heading = ""+template_data.message+"";
	var msg = heading.toString();
	var len = msg.length;
	var divider = Math.floor(len/2);
	var m1 = msg.substring(0, divider);
	var m2 = msg.substring(divider);
	var m3 = " in <a href=\""+config.appUrl+"\">Darkwars</a>";
	if(template_data.link)
		var link = template_data.link;
	if(template_data.action_text)
		var action_text = template_data.action_text;
	var detail = "<a href=\""+link+"\">"+action_text+"</a>";
	var params = {};
	params[opensocial.Activity.Field.TITLE_ID] = template_bundle_id;
	params[opensocial.Activity.Field.TEMPLATE_PARAMS] = {"m1": m1, "m2": m2, "m3": m3, "detail": detail};
	
	var mediaItemArray = [];
	if(template_data.images)
	{
		var img_arr = template_data.images;
		for(i in img_arr)
		{
			mediaItemArray.push(opensocial.newMediaItem("", img_arr[i]['src']));
		}
	}
	if(target_ids)
	{
		for(i in target_ids)
			mediaItemArray.push(opensocial.newMediaItem("", "http://api.myspace.com/v1/users/"+target_ids[i]));
	}
	params[opensocial.Activity.Field.MEDIA_ITEMS] = mediaItemArray;
	var activity = opensocial.newActivity(params);
	opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH, function(){});
};

function str_replace(search, replace, subject, count) {
    // Replaces all occurrences of search in haystack with replace  
    // 
    // version: 905.3122
    // discuss at: http://phpjs.org/functions/str_replace
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Gabriel Paderni
    // +   improved by: Philip Peterson
    // +   improved by: Simon Willison (http://simonwillison.net)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   bugfixed by: Anton Ongson
    // +      input by: Onno Marsman
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    tweaked by: Onno Marsman
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   input by: Oleg Eremeev
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Oleg Eremeev
    // %          note 1: The count parameter must be passed as a string in order
    // %          note 1:  to find a global variable in which the result will be given
    // *     example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
    // *     returns 1: 'Kevin.van.Zonneveld'
    // *     example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars');
    // *     returns 2: 'hemmo, mars'
    var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0,
            f = [].concat(search),
            r = [].concat(replace),
            s = subject,
            ra = r instanceof Array, sa = s instanceof Array;
    s = [].concat(s);
    if (count) {
        this.window[count] = 0;
    }

    for (i=0, sl=s.length; i < sl; i++) {
        if (s[i] === '') {
            continue;
        }
        for (j=0, fl=f.length; j < fl; j++) {
            temp = s[i]+'';
            repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
            s[i] = (temp).split(f[j]).join(repl);
            if (count && s[i] !== temp) {
                this.window[count] += (temp.length-s[i].length)/f[j].length;}
        }
    }
    return sa ? s : s[0];
}

/*
 * example 1: strip_tags('<p>Kevin</p> <br /><b>van</b> <i>Zonneveld</i>', '<i><b>');
 * returns 1: 'Kevin <b>van</b> <i>Zonneveld</i>'
 * example 2: strip_tags('<p>Kevin <img src="someimage.png" onmouseover="someFunction()">van <i>Zonneveld</i></p>', '<p>');
 * returns 2: '<p>Kevin van Zonneveld</p>'
 * example 3: strip_tags("<a href='http://kevin.vanzonneveld.net'>Kevin van Zonneveld</a>", "<a>");
 * returns 3: '<a href='http://kevin.vanzonneveld.net'>Kevin van Zonneveld</a>'
 * example 4: strip_tags('1 < 5 5 > 1');
 * returns 4: '1 < 5 5 > 1'
 */
function strip_tags(str, allowed_tags) 
{	
    var key = '', allowed = false;
    var matches = [];
    var allowed_array = [];
    var allowed_tag = '';
    var i = 0;
    var k = '';
    var html = '';
 
    var replacer = function(search, replace, str) 
    {
        return str.split(search).join(replace);
    };
 
    // Build allowes tags associative array
    if (allowed_tags) 
    {
        allowed_array = allowed_tags.match(/([a-zA-Z]+)/gi);
    }
  
    str += '';
 
    // Match tags
    matches = str.match(/(<\/?[\S][^>]*>)/gi);
 
    // Go through all HTML tags
    for (key in matches) {
        if (isNaN(key)) {
            // IE7 Hack
            continue;
        }
 
        // Save HTML tag
        html = matches[key].toString();
 
        // Is tag not in allowed list? Remove from str!
        allowed = false;
 
        // Go through all allowed tags
        for (k in allowed_array) {
            // Init
            allowed_tag = allowed_array[k];
            i = -1;
 
            if (i != 0) { i = html.toLowerCase().indexOf('<'+allowed_tag+'>');}
            if (i != 0) { i = html.toLowerCase().indexOf('<'+allowed_tag+' ');}
            if (i != 0) { i = html.toLowerCase().indexOf('</'+allowed_tag)   ;}
 
            // Determine
            if (i == 0) {
                allowed = true;
                break;
            }
        }
 
        if (!allowed) {
            str = replacer(html, "", str); // Custom replace. No regexing
        }
    }
 
    return str;
};

function strtok (str, tokens) {
    // %        note 1: Use tab and newline as tokenizing characters as well
    // *     example 1: $string = "\t\t\t\nThis is\tan example\nstring\n";
    // *     example 1: $tok = strtok($string, " \n\t");
    // *     example 1: $b = '';
    // *     example 1: while($tok !== false) {$b += "Word="+$tok+"\n"; $tok = strtok(" \n\t");}
    // *     example 1: $b
    // *     returns 1: "Word=This\nWord=is\nWord=an\nWord=example\nWord=string\n"
 
    if (tokens === undefined) {
        tokens = str;
        str = strtok.leftOver;
    }
    if (str.length === 0) {
        return false;
    }
    if (tokens.indexOf(str[0]) !== -1) {
        return strtok(str.substr(1), tokens);
    }
    for (var i=0; i < str.length; i++) {
        if (tokens.indexOf(str[i]) !== -1) {
            break;
        }
    }
    strtok.leftOver = str.substr(i+1);
    return str.substring(0, i);
};

function t(str)
{
	return str.substr(0, 5);
};

/**
 * converts html content as text content
 * @param html_content
 * @return string
 * @author ajeet shakya
 * @since june 18, 2009
 */
function textHtml(html_content)
{
	var str = String(html_content);
	str = str.replace(/[<]/g,'&lt;');
	str = str.replace(/[>]/g,'&gt;');
	return str;
}
codeHtml = textHtml;

/**
 * formats seconds to hh:mm:ss format
 * @param t_sec
 * @return string e.g 5:25:55
 * @author ajeet shakya
 * @since june 11, 2009
 */
function timeFormat(t_sec)
{
	t_sec = Number(t_sec);
	var t_hr = Math.floor(t_sec/3600);
	var t_min = Math.floor((t_sec-t_hr*3600)/60);
	t_sec = t_sec-t_hr*3600-t_min*60;
	t_clock = String();
	if(t_hr)
		t_clock += t_hr+":";
	if(t_min)
		t_clock += zeroPad(t_min, 2)+":";
	else
		t_clock += "00:";
	if(t_sec)
		t_clock += zeroPad(t_sec, 2)+"";
	else
		t_clock += "00";
	return t_clock;
};
tF = timeFormat;

function ucfirst( str ) {
 
    str += '';
    var f = str.charAt(0).toUpperCase();
    return f + str.substr(1);
};

function uuescape(str)
{
	return unescape(unescape(str));
};

function zeroPad(num,count)
{
	var numZeropad = num + '';
	while(numZeropad.length < count) 
	{
		numZeropad = "0" + numZeropad;
	}
	return numZeropad;
};
function getRaceImage(race)
{
	switch(race)
	{
		case 1:
				return config.timg['vampire'];
				break;
		case 2:
				return config.timg['human'];
				break;
		case 3:
				return config.timg['warewolf'];
				break;
		
	}	
};

function stringifyRank(race,rank)
{
	switch(race)
	{
		case 2:
		case 'Human':
			switch(rank)
			{
				case 1:
				case '1':
					return 'Crown';
					break;
				case 2:
				case '2':
					return 'Advisors';
					break;
				case 3:
					return 'War Lords';
					break;
				case 4:
				case '4':
					return 'Knights';
					break;
				case 5:
				case '5':
					return 'Squires';
					break;
			}
			break;
		
		case 1:
		case 'Vampire':
			switch(rank)
			{
				case 1:
				case '1':
					return 'Elder';
					break;
				case 2:
				case '2':
					return 'The Council';
					break;
				case 3:
					return 'Nobles';
					break;
				case 4:
				case '4':
					return 'Regents';
					break;
				case 5:
				case '5':
					return 'Death Dealers';
					break;
			}
			break;
		
		case 3:
		case 'Werewolf':
			switch(rank)
			{
				case 1:
				case '1':
					return 'Legend';
					break;
				case 2:
				case '2':
					return 'Elders';
					break;
				case 3:
					return 'Shamans';
					break;
				case 4:
				case '4':
					return 'Alpha Dogs';
					break;
				case 5:
				case '5':
					return 'Cubs';
					break;
			}
			break;
		
		
	}
	
};