(function(){

    // Shortcuts to YAHOO
    var Dom = YAHOO.util.Dom, Event = YAHOO.util.Event,Get = YAHOO.util.Get;
    
    // Global in this scope
    var elem, height,portal,scrollTimer,startPos;
    
    // No Bookmark Elem, just return
    if (!Dom.get('pty_bm_here')) {
        return;
    }
    
    elem = Dom.get('pty_bm_here');
    
	var result = false;
	var scripts = document.getElementsByTagName('script');
	
	var thisScriptSrc = /pty_bm\.js(\?.*)?$/;
	for(var i=0;i<scripts.length;i+=1){
		if(thisScriptSrc.test(scripts[i].src) === true){
			result = scripts[i].src.match(thisScriptSrc)[1];
			if(result !== undefined){
				 result = result.replace('?','');				
			}
	
		}
	}
		var obj = {};
	
	if(result){
		result = result.split('&')
		for(var i = 0; i<result.length;i+=1){
			var keyValue = result[i].split('=');
			if(keyValue.length === 2){				
				obj[keyValue[0]] = keyValue[1];
			}
		}
	}

	var cornerBG = (obj.bg)?obj.bg:false;

	
    var skin = 'star';
    
    if (Dom.hasClass(elem, 'add')) {
        skin = 'add';
    } 

    // Array of Bookmark Services
    var services = [{
        'name': 'Browser',
        'img': 'bookmark',
        'url': ''
    }, {
        'name': 'Delicious',
        'img': 'delicious',
        'url': 'http://delicious.com/post',
        'param': {
            'url': 'url',
            'title': 'title'
        }
    }, {
        'name': 'Digg',
        'img': 'digg',
        'url': 'http://digg.com/submit',
        'param': {
            'url': 'url',
            'title': 'title'
        }
    }, {
        'name': 'Live',
        'img': 'live',
        'url': 'https://favorites.live.com/quickadd.aspx',
        'param': {
            'url': 'url',
            'title': 'title',
            'defaults':'top=1&marklet=1&mkt=de-de'
        }
    }, {
        'name': 'Facebook',
        'img': 'facebook',
        'url': 'http://www.new.facebook.com/sharer.php',
        'param': {
            'url': 'u',
            'title': 't'
        }
    }, {
        'name': 'MySpace',
        'img': 'myspace',
        'url': 'http://www.myspace.com/Modules/PostTo/Pages/',
        'param': {
            'url': 'u',
            'title': 't'
        }
    }, {
        'name': 'Mister Wong',
        'url': 'http://www.mister-wong.de/index.php',
        'img': 'misterwong',
        'param': {
            'url': 'bm_url',
            'title': 'bm_description',
            'defaults': 'action=addurl'
        }
    }, {
        'name': 'Technorati',
        'url': 'http://technorati.com/faves',
        'img': 'technorati',
        'param': {
            'url': 'add',
            'title': 'title'
        }
    }, {
        'name': 'StumpleUpon',
        'url': 'http://www.stumbleupon.com/refer.php',
        'img': 'stumbleupon',
        'param': {
            'url': 'url',
            'title': 'title'
        }
    }, {
        'name': 'Newsvine',
        'url': 'http://www.newsvine.com/_wine/save',
        'img': 'newsvine',
        'param': {
            'url': 'u',
            'title': 'h'
        }
    }, {
        'name': 'Magnolia',
        'url': 'http://ma.gnolia.com/bookmarklet/add',
        'img': 'magnolia',
        'param': {
            'url': 'url',
            'title': 'title',
            'defaults': 'action=addurl'
        }
    }, {
        'name': 'Google',
        'url': 'http://www.google.com/bookmarks/mark',
        'img': 'google',
        'param': {
            'url': 'bkmk',
            'title': 'title',
            'defaults': 'op=edit&output=popup'
        }
    }, {
        'name': 'Yahoo MyWeb',
        'url': 'http://myweb2.search.yahoo.com/myresults/bookmarklet',
        'img': 'yahoo_myweb',
        'param': {
            'url': 'u',
            'title': 't'
        }
    }];
    
    // Open Box called by Mouseover Event on div#pty_open
    function open(){
	 var bookmarkPos = Dom.getRegion('pty_bm');	 
     var docScrollTop = Dom.getDocumentScrollTop();
     var moveTo = {};
	 
	 moveTo.from = 0;
	 moveTo.to = -height +13;
	 if((bookmarkPos.top - docScrollTop) < height){
	 	moveTo.to = 0;
       scroll();

	 } 
        var scaleBig = new YAHOO.util.Anim('pty_bm', {

            top:{
				from:moveTo.from,
				to:moveTo.to
			},

			width: {
                from: 109,
                to: 250
            },
            height: {
                from: 13,
                to: height
            }
        }, 1, YAHOO.util.Easing.easeOutStrong);
        
        var fadeIn = new YAHOO.util.Anim('pty_bm_list', {
            opacity: {
                from: 0,
                to: 1
            }
        }, 0.2);
        
        scaleBig.onStart.subscribe(function(){
            Dom.setStyle('pty_bm_open', 'display', 'none');
            Dom.setStyle('pty_bm_open_head', 'display', 'block');
        });
        
        fadeIn.onComplete.subscribe(function(){
            //ugly black borders in IE7 caused by filter:opacity(100)
            if(Dom.getStyle('pty_bm_list','filter')){
                Dom.setStyle('pty_bm_list', 'filter', '');
            }
        });

        scaleBig.onComplete.subscribe(function(){
            Dom.setStyle('pty_bm_close', 'display', 'block');
            Dom.setStyle('pty_bm_list', 'display', 'block');
            fadeIn.animate();
            
        });
        scaleBig.animate();
    }
    
    // Close Box called by Click Event on div#pty_close
    function close(){
        var fadeOut = new YAHOO.util.Anim('pty_bm_list', {
            opacity: {
                from: 1,
                to: 0
            }
        }, 0.2);
        var scaleSmall = new YAHOO.util.Anim('pty_bm', {
            top:{
				from:parseInt(Dom.getStyle('pty_bm','top'),10),
				to:0
			},
            width: {
                from: 250,
                to: 109
            },
            height: {
                from: height,
                to: 13
            },
            duration: 0.3
        }, 1, YAHOO.util.Easing.easeOutStrong);
        
        fadeOut.onStart.subscribe(function(){
            Dom.setStyle('pty_bm_close', 'display', 'none');
        });
        
        scaleSmall.onComplete.subscribe(function(){
            Dom.setStyle('pty_bm_open_head', 'display', 'none');
            Dom.setStyle('pty_bm_open', 'display', 'block');
//BSa: 
            Dom.setStyle('pty_bm_list', 'display', 'none');            
        });
        
        fadeOut.onComplete.subscribe(function(){
            scaleSmall.animate();
        });
        fadeOut.animate();
    }
    function scroll(){
        if(scrollTimer)  {
            window.clearInterval(scrollTimer);            
        }
        var bookmarkPos = Dom.getRegion('pty_bm');

        var docScrollTop = Dom.getDocumentScrollTop();
        var docHeight = Dom.getViewportHeight();

        if (docHeight + docScrollTop >= (bookmarkPos.top + height)) {
            return;
        }
        
        var scrollTo = docScrollTop + 20;
        window.scrollTo(0,scrollTo)
        scrollTimer = window.setInterval(scroll, 10);
    }
    function internalBookmark(){
        var browser;
        if(YAHOO.env.ua.ie > 0){
            browser = " (IE)";
        }
        if(YAHOO.env.ua.gecko > 0){
            browser = " (Firefox)";
        }
        elem.innerHTML += '<img style="width:1px;height:1px;" src="http://addbookmark.eu/add/?portal='+portal+'&bookmark_service=Intern '+browser+'&url='+location.href+'"/>';
        if (window.sidebar) {
            window.sidebar.addPanel(document.title, location.href, '');
        }
        else {
            if (document.all) {
                window.external.AddFavorite(location.href, document.title);
            }
        }
        return false;
    }
    
    (function(){
        
        //Loading CSS by GET causes a wired fx and the box has 70px extra height
        //Get.css("./css/pty_bm.css");
        //if(YAHOO.env.ua.ie !== 0 &&  YAHOO.env.ua.ie < 7){
        //    Get.css("http://addbookmark.eu/css/pty_bm-ie.css");
        //}
        
        // Remove internal Bookmarking for !IE && !!FF
        if (!window.sidebar && !document.all) {
            services.shift();
        }
        
        portal = (elem.className && elem.className !== '')?elem.className.split(' ')[0]:'none';

        var siteTitle = document.title;
        var siteURL = location.href;
        var listHtml = '';
        var itemTpl = '<li class="{pos}"><a href="{href}"><span class="img {img}"></span><span class="name">{name}</span></a>';
        var pos = 'left';
        for (var i = 0; i < services.length; i++) {
            var service = services[i];
            service.pos = pos;
            if (service.param) {
                var param = [];
                param.push(service.param.url + '=' + siteURL);
                param.push(service.param.title + '=' + siteTitle);
                if (service.param.defaults !== undefined) {
                    param.push(service.param.defaults);
                }
                service.href = service.url + '?' + param.join('&');
            }
            else {
                service.href = service.url;
            }
            
            if (service.name !== 'Browser') {
                service.href = 'http://addbookmark.eu/add/?portal='+portal+'&amp;bookmark_service=' + service.name + '&amp;url=' + siteURL + '&amp;redir=' + encodeURIComponent(service.href);
            }
            else{
                service.pos = service.pos + ' internalBookmark';
            }
            
            listHtml += YAHOO.lang.substitute(itemTpl, service);
            
            pos = (pos === 'left') ? 'right' : 'left';
            
        }
        var html = '';
        if(skin === 'star'){
            html += '<div id="pty_bm">';            
        }
        if(skin === 'add'){
            html += '<div id="pty_bm" class="add">';            
        }
        html += '<div id="pty_bm_box">';
        html += '<div class="corner">';
        html += '<div class="tl"></div>';
        html += '<div class="tr"></div>';
        html += '<div class="bl"></div>';
        html += '<div class="br"></div>';
        html += '</div>';
        html += '</div>';
        html += '<div id="pty_bm_open"></div>';
        html += '<div id="pty_bm_open_head" style="display:none;"></div>';
        html += '<div id="pty_bm_close" style="display:none;"></div>';
        html += '<div id="pty_bm_list">';
        html += '<ul>' + listHtml + '</ul>';
        html += '<p class="pty_link"><span></span></p>';
        html += '</div>';
        html += '</div>';
        
        elem.innerHTML = html;
        height = Dom.getRegion('pty_bm_list');
        height = height.bottom - height.top + 20;

        
        if (cornerBG) {
            var corners = Dom.getElementsByClassName('corner')[0].getElementsByTagName('div');
            
            for (var i = 0; i < corners.length; i += 1) {
		        Dom.setStyle(corners[i], 'background-color', cornerBG);
            }
        }
        Dom.setStyle('pty_bm_list', 'display', 'none');
        Dom.setStyle('pty_bm_list', 'left', '0px');
        Dom.setStyle('pty_bm_list', 'width', '250px');
        
        Dom.setStyle('pty_bm_box', 'opacity', 0.9);
        
        
        Event.on('pty_bm_open', 'mouseover', open);
        Event.on('pty_bm_close', 'click', close);
        
        var internal = Dom.getElementsByClassName('internalBookmark');
        if(internal.length >0){
            Event.on(internal[0].getElementsByTagName('a')[0], 'click', internalBookmark,true);
        }
    })();
})();
