﻿/*
@Name:          RotateObject
@Version:	    1.02.006 BETA
@Date: 		    20090622T15:15 CEST
@Updated: 		20100713T19:13 CEST
@Author:        Lilo von Hanffstengel (GwenDragon)
@Copyright:     (c)2009-2010 Lilo von Hanffstengel (GwenDragon); All rights reserved
@Licence:       Free private use but please preserve these headers
@Licence:       Commercial use only with permission of the author
@Source:        http://www.gwendragon.de/tools/javascript/rotateobj/index.html
@Documentation: http://www.gwendragon.de/tools/javascript/rotateobj/index.html (german!)
@Description:   Animation of a sequence of pictures
*/

/*****************************************************************************
 * Bewegt ein Objekt bestehend aus einer Anzahl von Bildsequenzen
 * in Abhängigkeit der Mausrichtung bzw. gesteuert durch Button-Controls,
 * automatische Bewegung bei Mouseover möglich
 * 
 * (c)2009-2010 Lilo von Hanffstengel aka GwenDragon
 * All rights by Lilo von Hanffstengel
 * 
 * Lizenz: freie private Verwendung, bitte Copyrightvermerk drin lassen
 *         Kommerzielle Verwendung nur nach Rücksprache und mit Erlaubnis der 
 *         Autorin!
 *
 ****************************************************************************/

/*****************************************************************
 ****** dont change below unless you know what you do! ***********
 *****************************************************************/
 
/** RotateObject (ObjName, AnzPic, PicDir, RotateFaster, Kontrollflag)
  @Parameter: 
    ObjName: Zeichenkette
        Name des Objekts als  (gleich wie id des Bildes)
    AnzPic: Zahl   
        Anzahl der Bilder: mindestens 24
    PicDir: Zeichenkette
        Verzeichnis der Bilder: relative zur HTML-Seite oder als absolute URL
    RotateFaster: Zahl
        Rotatationsgeschwindigkeit: 0.5 bis 20
    Kontrollflag: Zahl
      1 = Automatische Dauerrotation bei MouseOver
      2 = Kontrolle der Rotationsrichtung über Links für Tastatur 
          bei Mausdrag
	  4 = Einmalig rotieren, dann Dragmodus
	  gleichzeitige Verwendung von 1 und 4 schließt sich aus; es wird dann auf
	  Dragmodus geschaltet
**/
 
function RotateObject (nameRO, maxp, folder, fastfact, flag) {
    var thisObject = this;

    if (!RotateObject.Instances) RotateObject.Instances = new Array ();
    this.id = RotateObject.Instances.length;
    RotateObject.Instances[this.id] = this;
	
	var AUTOROTATION = 1;				//binary 0b00000001
	var WITHCONTROLS = 1 << 1; 			//binary 0b00000010
	var ROTATIONATSTART = 1 << 2; 		//binary 0b00000100
    
    var objName = null,
        dragObj = null, 
        posrel = 0, 
        posx = 0, 
        dragx = 0, 
        lastpos = 0, 
        mousesteps = 10;				// drag sensitivity 

	var fastf = 1, 
        rotationRunning = 0,
		rotateOnceAtStart = 0,
        timerId = null;
		
	var picfolder = 'pic',     
        maxpics = 24, 
        picnr = 0, 
        picsAll = null;
        
    if (!nameRO) return null;
    objName = nameRO;
    
    // ===========================

    var getAbsMousePosX = function (ev) {
        return !ev ? window.event.screenX : ev.screenX 
    }
    var getMousePosX = function (ev) {
        return document.all ? window.event.clientX : ev.pageX 
    }
    //
    var addEvent = function (obj, evType, fn){
        if (obj.addEventListener){
            obj.addEventListener(evType, fn, false);
            return true;
        } else if (obj.attachEvent){
            var r = obj.attachEvent('on' + evType, fn);
            return r;
        } else {
            return false;
        }
    }
	var removeEvent = function (obj, evType, fn){
        if (obj.removeEventListener){
            obj.removeEventListener(evType, fn, false);
            return true;
        } else if (obj.detachEvent){
            var r = obj.detachEvent('on' + evType, fn);
            return r;
        } else {
            return false;
        }
    }
    var getEventTarget = function (e){
        return e.target ? e.target : e.srcElement
    }

    var createControlButton = function (cO) {
        var ctrlO = {
            id: null,
            title: 'Klickbutton',
            imgurl: null,
            imgalt: '',
            size: 24
        };

        if(typeof(cO) == 'object') {
            ctrlO.id = cO.id;
            ctrlO.title = cO.title || ctrlO.title;
            ctrlO.imgurl = cO.imgurl || ctrlO.imgurl;
            ctrlO.imgalt = cO.imgalt || ctrlO.imgalt;
            ctrlO.size = cO.size || ctrlO.size;
			return cO;
        } 
        else {
            ctrlO.id = cO;
            var m;
            if (m = ctrlO.id.match(/(left|links)/)) {
                ctrlO.title = m[0];
                ctrlO.imgurl = 'data:image/png;base64,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'; 
                ctrlO.imgalt = "\u00A0<\u00A0";
            }
            if (m = ctrlO.id.match(/(right|rechts)/)) {
                ctrlO.title = m[0];
                ctrlO.imgurl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAK T2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AU kSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXX Pues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgAB eNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAt AGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3 AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dX Lh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+ 5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk 5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd 0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA 4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzA BhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/ph CJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5 h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+ Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhM WE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQ AkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+Io UspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdp r+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZ D5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61Mb U2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY /R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllir SKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79u p+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6Vh lWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1 mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lO k06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7Ry FDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3I veRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+B Z7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/ 0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5p DoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5q PNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIs OpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5 hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQ rAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9 rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1d T1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aX Dm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7 vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3S PVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKa RptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO 32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21 e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfV P1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i /suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8 IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADq YAAAOpgAABdvkl/FRgAAAVxJREFUeNrEk71OwlAYhl/UwfiHoeEGDCurMfEGjDiYmODPIEGamC4Q GJzqbZQBUkAjIUwuegVciITEmE7SQzm2NnkdamsKbAx+y0mefOcZzvueBEksMytYctYAYPw5zSZ3 N7QQOpOv7ubW+kDY0+z2zjyPGUiCpJE/PyMAFtUCSRr0aZA08pdx7k597fcOSP4JALDz1CQAlitl hrOAxyQzApOdx2BZv9cjQbfXjngomQjvimTwBgA0AHCEwHgs0DTrUEsaDvYPoaSTkNKDZVkBv9Eg HKGZDRMAurEUpJQYjUYYDt/w8voM9bYARUnDdd2I9/oPaDVbi2OUnoTr+kilFOROTtFsdGDbNqQU Eb/IX6OoFucE9eBYRSazh2rlDrquI3d8hI93C57PiFdrZZgNs+5MvgexGAGw128TAKu1aiyFGb44 hTDvklpc2IOQz/YgQXKpJib+/TP9DAByAFOrz1aVjgAAAABJRU5ErkJggg==';
                ctrlO.imgalt = "\u00A0>\u00A0";
            }
        }

        var control = document.createElement('button');
             
        // modern browsers
        var bt;
        if (! navigator.userAgent.match(/MSIE\s*[567]/i)) { 
            bt = document.createElement('img');
            bt.alt = ctrlO.imgalt;
            bt.src = ctrlO.imgurl;
        }
        else { // no data url images in older IE!!!
            var t;
            if (ctrlO.id.match(/(left|links)/)) {
                t = "\u00A0<\u00A0";
            }
            else if (ctrlO.id.match(/(right|rechts)/)) {
                t = "\u00A0>\u00A0";
            }
            else {
                t = '?';
            }
            bt = document.createTextNode(t);
        }
        control.appendChild(bt);
        
        control.style.height = ctrlO.size + 1 + 'px';
        control.style.width = ctrlO.size + 1 + 'px';
        control.style.padding = '1px';
        control.style.margin = 0;
        control.id = ctrlO.id;
        control.title = ctrlO.title;
        
        return control;
    }
    
    
    // ===============
	
    this.rotate = function (dir) {
        var e = document.getElementById(objName);
        if (!e) return false;
        
		// Stop nach einer Umdrehung und Umschalten auf Drag-Modus
		if (rotateOnceAtStart && picnr >= maxpics) {
			picnr = 0;
			rotateOnceAtStart = 0;
			stopRotate(e);
			flag &= ~(AUTOROTATION|ROTATIONATSTART);  // reset bits Autorotation + RotationAtStart!
			Init_2(flag);
			return true;
		}
        
		(dir > 0) ? picnr++ : picnr --;
        if (picnr <= 0) picnr = maxpics; // auf letztes Bild schalten
        if (picnr > maxpics) picnr = 1; // wieder bei Bild 1 anfangen
        if (picnr > 0 && picnr <= maxpics) e.src = picsAll[picnr].src;    
        return true;
    }
    
    // ----------
    
    var dragR = function (ev) { 
        thisObject.rotate(-1); 
        return true;
    }
    var dragL = function (ev) { 
        thisObject.rotate(1); 
        return true;
    }

    var dragStart = function (ev) {
        dragObj = getEventTarget(ev);
        if (dragObj != null) {
            objName = dragObj.id || dragObj.name;
            lastpos = posrel - dragObj.offsetWidth/2;
            mousesteps = 0.3/fastf * dragObj.offsetWidth/maxpics;
        }
        if (ev.cancelable) ev.preventDefault();
        return false;
    }

    var dragStop = function (ev) {
      dragObj = null;
      return true;
    } 

    var dragIt = function (ev) {  
        if (ev.cancelable) ev.preventDefault();
        
        if (dragObj) {
            posx = getAbsMousePosX(ev);
            if (posx <= 0 || posx >= screen.width-1) return false;
           
            posrel = getMousePosX(ev) - dragObj.offsetWidth/2; // relative Position zur Objektmitte
            (posrel - lastpos) >= 0 ? dragx++ : dragx--;
            if (dragx > mousesteps) { dragx=0; dragR(); };
            if (dragx < -mousesteps) { dragx=0; dragL(); };

            lastpos = getMousePosX(ev) - dragObj.offsetWidth/2;
        }
        return false;
    } 

    // ------------
    
    var stopRotate = function (ev) {
        rotationRunning = 0;
        window.clearInterval(timerId);
        return true;
    }

    var autoRotate = function (ev) {
        var o = getEventTarget(ev);
        
        if (!rotationRunning) {
            if ((fastf * maxpics) > 1000) fastf = 1000 / maxpics;

            timerId = window.setInterval('RotateObject.Instances[' + thisObject.id +'].rotate(1)', 1000/(fastf*maxpics));
            rotationRunning = 1;
        }
        return true;
    }
	    
    var startStopRotate = function (ev) {
        rotationRunning ? stopRotate(ev) : autoRotate(ev); 
        return true;
    }

    // ------------
    
    var preloadImages = function (pixfold,numpix) {		
		var ldim = new Image();
        ldim.src = pixfold + 'loadingdone.jpg';
				
		var pictureBuffer = new Array(numpix+1);
		for (var i=0; i <= numpix; i++) {
            pictureBuffer[i] = ldim;
        }
		var pixsrc;
        for (var i=0; i <= numpix; i++) {
            if (i == 0) pixsrc = 'loadingdone'; 
            else if (i < 10) pixsrc = '00' + i
            else if (i < 100) pixsrc = '0' + i
            else pixsrc = i;
            pictureBuffer[i] = new Image();
			pictureBuffer[i].src = pixfold + pixsrc + '.jpg';
        }
        return pictureBuffer;
    }
    
    // ---
    var Init = function (maxp, folder, fastfact, flag) {
        posrel = posx = lastpos = dragx = 0;    
        maxpics = maxp || 24; // Maximum 24 Bilder
        fastf = fastfact || 1;
        if (fastf < 0.5) fastf = 0.5;
        if (fastf > 20) fastf = 20;
        
        var e = document.getElementById(objName);
        if (!e) return;
        
        var fl = 0 || flag;
        
        picfolder = folder || ('pic_' + objName); 
        var picnamepre = objName + '_';
        var f = picfolder + '/' + picnamepre;

        picsAll = preloadImages(f,maxpics);

        e.src = f + 'loading' + '.jpg';
        e.alt = 'Animation: ' + objName;
        e.style.cursor = 'wait';
        
        Init_2(flag);

        e = document.getElementById(objName);
        e.src = picsAll[1].src;
    }
	
	var Init_2 = function (flag) {
        var e = document.getElementById(objName);
        if (!e) return null;
        		
		picnr = 0;
		rotationRunning = 0;
        removeEvent(e,'load',autoRotate);
		removeEvent(e,'click',startStopRotate);
        removeEvent(e,'mousedown',dragStart);
		removeEvent(e,'mouseup',dragStop); 
		removeEvent(e,'mouseover',autoRotate);
        removeEvent(e,'mouseout',stopRotate);
		removeEvent(e,'mousemove',dragIt);
		removeEvent(document,'mousemove',dragIt);
		removeEvent(document,'mouseup',dragStop);
		
		var fl = 0 || flag;
        if (fl & AUTOROTATION) { // auto rotation mode 	(bit 0b00000001)
            e.style.cursor = 'wait';   
            addEvent(e,'click',startStopRotate);
            addEvent(e,'mouseover',autoRotate);
            addEvent(e,'load',autoRotate);
            addEvent(e,'mouseout',stopRotate);
			return;
        }
		if (fl & ROTATIONATSTART) { // Rotate once at start	(bit 0b00000100)
			rotateOnceAtStart = 1;
			addEvent(e,'load',autoRotate);
			return;
		}
		if (fl & WITHCONTROLS) { // controls below			(bit 0b00000010)
			addEvent(document,'mousemove',dragIt);
            addEvent(document,'mouseup',dragStop);
			 
			e.style.cursor = 'e-resize';
			addEvent(e,'mousedown',dragStart);
			
			var owncontrols = '';
			var cleft, cright;
			var ns = e;
			while (ns != null) {
				ns = ns.nextSibling; 
				if (ns) {
					var n = ns.id || ns.name;
					if (n && n == e.id + "_rotleft" && !cleft) {
						cleft = ns;
						owncontrols += 'l';
					}
					if (n && n == e.id + "_rotright" && !cright) {
						cright = ns;
						owncontrols += 'r';
					}
				}
			}
			owncontrols = (owncontrols == 'lr' || owncontrols == 'rl');
			
			if (!owncontrols) {
				var d = document.createElement('div');
				d.id = e.id + '_control';
				var leftcontrol = createControlButton(e.id + '_rotleft');
				leftcontrol.style.cursor = 'hand';
				addEvent(leftcontrol,'click', function (ev) {
					dragL(ev);
					if (ev.cancelable) ev.preventDefault();
					return false;
				});
				d.appendChild(leftcontrol);
				
				d.appendChild(document.createTextNode(' '));
				
				var rightcontrol = createControlButton(e.id + '_rotright');
				rightcontrol.style.cursor = leftcontrol.style.cursor;
				addEvent(rightcontrol,'click',function (ev) {
					dragR(ev);
					if (ev.cancelable) ev.preventDefault();
					return false;
				});
				d.appendChild(rightcontrol);
				
				d.style.textAlign = 'center';
				d.style.width = e.offsetWidth + 'px';
							
				e.parentNode.insertBefore(d,e.nextSibling);
				return;
			}
			else {
				cleft.style.cursor = 'hand';
				addEvent(cleft,'click', function (ev) {
					dragL(ev);
					if (ev.cancelable) ev.preventDefault();
					return false;
				});
				cright.style.cursor = cleft.style.cursor;
				addEvent(cright,'click',function (ev) {
					dragR(ev);
					if (ev.cancelable) ev.preventDefault();
					return false;
				});
				return;
			}
		}
		
        // drag mode (is standard)
		e.style.cursor = 'e-resize';
		addEvent(e,'mousemove',dragIt);
		addEvent(e,'mouseup',dragStop); 
		addEvent(e,'mousedown',dragStart);
    }
    
    Init (maxp, folder, fastfact, flag);
}
