var DropIT_ScriptLibrary_Version = 0.1;

/**************************************
/* ARRAY EXTENSIONS
/**************************************/
if (!Array.prototype.push) Array.prototype.push = function() {
    for (var i=0; i<arguments.length; i++) this[this.length] = arguments[i];
    return this.length;
}

Array.prototype.find = function(value, start) {
    start = start || 0;
    for (var i=start; i<this.length; i++)
        if (this[i]==value)
            return i;
    return -1;
}

Array.prototype.has = function(value) {
    return this.find(value)!==-1;
}


/**************************************
/* STRING EXTENSIONS
/**************************************/
String.prototype.trim = function() { 
	return this.replace( /^\s+|\s+$/, "" ); 
}


/**************************************
/* FUNCTIONAL
/**************************************/
function map(list, func) {
    var result = [];
    func = func || function(v) {return v};
    for (var i=0; i < list.length; i++) result.push(func(list[i], i, list));
    return result;
}

function filter(list, func) {
    var result = [];
    func = func || function(v) {return v};
    map(list, function(v) { if (func(v)) result.push(v) } );
    return result;
}


/**************************************
/* DOM
/**************************************/
function getElem(elem, acceptNotFound) {
    if ( isCapableBrowser() ) {
        if ( typeof elem == "string" ) {
            elem = document.getElementById(elem);
            if ( elem === null && isUndefined(acceptNotFound) ) 
				return null;
        } else if ( typeof elem != "object" ) {
            return null;
        }
    } else throw 'cannot get element: unsupported DOM';
    return elem;
}

function GetParentElementByTagName(element, tagName)
{
	var element=element;
	while(element.tagName != tagName)
		element = element.parentNode;
	return element;
}

function getElementsByClass(className, tagName, parentNode) {
    parentNode = !isUndefined(parentNode)? getElem(parentNode) : document;
    if (isUndefined(tagName)) tagName = '*';
    return filter(parentNode.getElementsByTagName(tagName),
        function(elem) { return hasClass(elem, className) });
}

function hasClass(elem, className) {
    return getElem(elem).className.split(' ').has(className);
}


function removeClassName( elem, className ) {
	elem.className = elem.className.replace( className, "" ).trim();
}

function addClassName( elem, className ) {
	removeClassName( elem, className );
	elem.className = ( elem.className + " " + className ).trim();
}

/**************************************
/* DOM EVENTS
/**************************************/
function listen(event, elem, func) {
    elem = getElem(elem);
    if (elem.addEventListener)  // W3C DOM
        elem.addEventListener(event,func,false);
    else if (elem.attachEvent)  // IE DOM
        elem.attachEvent('on'+event, function(){ func(new W3CDOM_Event(elem)) } );
    else throw 'cannot add event listener';
}

function mlisten(event, elem_list, func) {
    map(elem_list, function(elem) { listen(event, elem, func) } );
}

function W3CDOM_Event(currentTarget) {
	this.currentTarget = currentTarget;
    this.target = window.event.srcElement;
    this.preventDefault = function() { window.event.returnValue = false };
    return this;
}


// MISC CLEANING-AFTER-MICROSOFT STUFF
function isUndefined(v) {
    var undef;
    return v===undef;
}

function isCapableBrowser() {
    if (typeof(document.getElementById) == "undefined") {
        if(typeof(document.all) != "undefined") {
            document.getElementById = function(elementId) { return document.all[elementId]; };
            return true;
        }
        return false;
    }
    return true;
}

/**************************************
/* POP-UP FUNCTIONS
/**************************************/
var _POPUP_FEATURES = "";

function raw_popup(url, target, features) {
    // pops up a window containing url optionally named target, optionally having features
    if ( isUndefined(features) ) {
		features = _POPUP_FEATURES;
	}
    if ( isUndefined(target) ) {
		target   = '_blank';
	}
    var theWindow = window.open(url, target, features);
    theWindow.focus();
    return theWindow;
}

function link_popup(src, features) {
    return raw_popup(src.getAttribute('href'), src.getAttribute('target') || '_blank', features);
}

function event_popup(e) {
    link_popup(e.currentTarget);
    e.preventDefault();
}

function event_popup_features(features) {
    return function(e) { link_popup(e.currentTarget, features); e.preventDefault() };
}


function getLinksByTarget(target) {
    return filter(document.getElementsByTagName('a'),
        function(elem) { return hasTarget(elem, target) });
}

function hasTarget(elem, target) {
    return getElem(elem).getAttribute('target') == target;
}

function linksAsPopup(target, features) 
{
	var list = getLinksByTarget(target);
	if ( list != null ) 
		for (var i=0; i < list.length; i++)
			listen('click', list[i], event_popup_features(features));
}