String.prototype.endsWith = function(s) {
	if(this.length < s.length)
		return false;
	if(this.length == s.length)
		return this == s;
	var diff = this.length - s.length;
	for(var i = 0; i < s.length; i++) {
		if(this.charAt(diff+i) != s.charAt(i))
			return false
	}
	return true;
}

String.prototype.trim = function(){
    return this.replace(/^\s+|\s+$/g, '');
};

String.prototype.shortenTo = function(len) {
    return this.length <= len ? this : (this.substring(0, len) + '...');
}

String.prototype.shortenUrlTo = function(len) {
    var l = this.split("/");
    var n = l.length;
    if (n < 3)
        return this;
    var s = '';
    if (l[0] != 'http:')
        s = s + l[0] + '//';
    s += l[2];
    for (var i = 3; i < n-2; i++) {
        s += '/' + l[i];
        if (s.length > len - l[n-2].length + l[n-1].length) {
            s += '/...';
            break;
        }
    }
    if (n >= 5) s += '/' + l[n-2];
    if (n >= 4) s += '/' + l[n-1];

    return s.shortenTo(len);
}

String.prototype.toArray = function() {
    var r = '';
    var l = new Array();
    for (var i = 0; i < this.length; i++) {
        var c = this.charAt(i);
        if (c == ',') {
            r = r.trim();
            if (r != '')
                l.push(r);
            r = '';
        } else
            r = r + c;
    }
    r = r.trim();
    if (r != '')
        l.push(r);
    return l;
}

String.prototype.escapeHtml = function() {
    return this
        .replace(/&/g, "&amp;")
        .replace(/"/g, "&quot;")
        .replace(/</g, "&lt;")
        .replace(/>/g, "&gt;");
}

function GetWindowHeight() {
    if (window.innerHeight)
        return window.innerHeight;
    else
        return document.documentElement.clientHeight;
}

function GetWindowWidth() {
    if (window.innerWidth)
        return window.innerWidth;
    else
        return document.documentElement.clientWidth;
}

function GetX(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 GetY(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 GetArgument(key) {
    var l = window.location.search.substring(1).split("&");
    for (var i = 0; i < l.length; i++) {
        var k = l[i].split("=");
        if (k[0] == key)
            return unescape(k[1].replace(/\+/g, " "));
    }
    return null;
}

function GetArgumentQuery(key) {
    return GetArgument(key);
}

function GetArgumentInt(key) {
    return parseInt(GetArgument(key));
}

function GetArgumentSortBy() {
    return GetArgument('sortby') == 'time' ? 'time' : 'rank';
}

function GetArgumentTags() {
    var s = GetArgument('tags');
    if (s.match(/^[A-Z0-9\w.,_\-|]+$/i))
        return s;
    else
        return "";
}

function GetArgumentCategory() {
    var s = GetArgument('category');
    if (s.match(/^[A-Z0-9\w.,_\-|]+$/i))
        return s;
    else
        return "All";
}

function GetArgumentSource() {
    var s = GetArgument('source');
    if (s.match(/^[A-Z0-9\w.,_\-|]+$/i))
        return s;
    else
        return "All";
}

function HasArgument(key) {
    var l = window.location.search.substring(1).split("&");
    for (var i = 0; i < l.length; i++) {
        var k = l[i].split("=");
        if (k[0] == key)
            return true;
    }
    return false;
}

function SetCursorPosition(elemId, pos) {
    var elem = document.getElementById(elemId);
    if (!elem)
        return;
    if (elem.createTextRange) {
        var range = elem.createTextRange();
        range.move('character', pos);
        range.select();
    } else if(elem.selectionStart) {
        elem.focus();
        elem.setSelectionRange(pos, pos);
    } else
        elem.focus();
}

function MapTagToCategory(s) {
    var name = s.charAt(0).toUpperCase() + s.slice(1);
    var e = $('.bar #' + name);
    return e.length > 0 ? name : "";
}

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Internet Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			   string: navigator.userAgent,
			   subString: "iPhone",
			   identity: "iPhone/iPod"
	    },
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

function ShowModal(id, msg) {
    var maskHeight = $(window).height();
    var maskWidth = $(window).width();

    if (msg != null) {
        $(id + " .content p").hide();
        $(id + " " + msg).show();
        $(id + " #modal_download").show();
    }

    $('#modal_boxes #mask')
        .css({'width':maskWidth, 'height':maskHeight, 'left':0, 'top':0})
        .fadeTo(0, 0.3)
        .fadeIn(0, function() {
            var winH = $(window).height();
            var winW = $(window).width();
            $(id).css('top',  winH/2-$(id).height()/2);
            $(id).css('left', winW/2-$(id).width()/2);
            $(id).show();
        });
}

function ImageChange(over) {
    if(over){
    	$('#download_button').attr("src", "gfx/download-button-rollover.gif");
    }
    else{
    	$('#download_button').attr("src", "gfx/download-button.gif");
    }
}

$(document).ready(function() {
    $('a[name=modal]').click(function(e) {
        e.preventDefault();
        var id = $(this).attr('href');
        ShowModal(id);
    });

    $('.window .close').click(function (e) {
        e.preventDefault();
        $('#modal_boxes #mask, .window').hide();
    });

    $('.modal-window .modal-close').click(function (e) {
        e.preventDefault();
        $('#modal_boxes #mask, .modal-window').hide();
    });

    $('.window-video .close-video').click(function (e) {
        e.preventDefault();
        $('#modal_boxes #mask, .window-video').hide();
    });

    $('#modal_boxes #mask').click(function () {
        $('#modal_boxes #mask, .window').hide();
        $('#modal_boxes #mask, .window-video').hide();
        $('#modal_boxes #mask, .modal-window').hide();
    });
});
