function event_element(event){
    return event.srcElement || event.target;
}
function event_object(event){
    return event || window.event;
}
function eid(string){
    return document.getElementById(string);
}
function mouse_xy(event){
    if (event.pageX || event.pageY) return {x: event.pageX, y: event.pageY};
    return {x: event.clientX + document.body.scrollLeft - document.body.clientLeft, y: event.clientY + document.body.scrollTop - document.body.clientTop};
}
function div_position(div){
    return {x: div.offsetLeft, y: div.offsetTop};
}
function get_link(target){
    if (undefined === target)return false;
    var test = target;
    do{
        if (test.nodeName == 'A')return test;
        if (test.nodeName == 'BODY' || undefined == test.parentNode)return false;
        test = test.parentNode;
    }while(1);
}
function event_stop(event){
    if (event.preventDefault){
        event.preventDefault();
        event.stopPropagation();
    }else {
        event.cancelBuble = true;
        event.returnValue = false;
    }
}
function navover(event){
    event = event_object(event);
    event_stop(event);
    var target = event_element(event);
    var link = get_link(target)
    if (link){
        data.nav_over_page = link.search.substr(1);
        data.nav_over_count = 0;
    }
}
function navout(event){
    event = event_object(event);
    event_stop(event);
    var target = event_element(event);
    var link = get_link(target)
    delete data.nav_over_page;
}
function click(event){
    event = event_object(event);
    event_stop(event);
    var target = event_element(event);
    var link = get_link(target)
    if (link){
        if (link.hostname == data.hostname){
            var page = link.search.substr(1);
            data.get_page(page);
            data.location = window.location.protocol + '//' + window.location.hostname + window.location.pathname + '#' + page;
            window.location.assign(data.location);
        }else window.location.assign(link.href);
    } 
}
function init(){
    // this should check a cookie or something to not loose sessions due to the user hitting "refresh"
    
    //initializing some data properties
    data.location = window.location.href;
	data.hostname = window.location.hostname;
	data.pathname = window.location.pathname;
	data.loading = eid('loading').style;
	data.loading.display = 'block';
	data.loading.visibility = 'hidden';
    //eid('nav').onmouseover = navover;
    //eid('nav').onmouseout = navout;  
      
    data.full_black = eid('full_black');
    var is_intro = data.full_black.innerHTML;
    is_intro = (is_intro == '')? false : true;
  //  if (is_intro){
        data.full_black.innerHTML = '<div id="big_logo_wrapper"><center><img id="big_logo" src="graphics/750.gif" alt="Sound Unlimited Systems" /><div id="dance"><img src="graphics/750_02.gif" alt="Sound Unlimited Systems" /></div></center></div>';
        var big_logo_wrapper = eid('big_logo_wrapper');
        data.step = big_logo_wrapper.offsetTop;
        big_logo_wrapper.style.top = data.step + 'px';
        big_logo_wrapper.style.marginTop = '0px';
        data.step = Math.floor(data.step / 33);
        data.full_black.onclick = function(){data.wait = 0;};
   // }
    
    //big_logo_wrapper.style.position = 'absolute';
    //big_logo_wrapper.style.width = '100%';
    //big_logo_wrapper.style.top = '25%';
    //big_logo_wrapper.onclick = function(){data.wait = 0;};
    ////get the position to put  750_02.gif onto
    //var offsets = div_position(big_logo_wrapper);
    //big_logo_wrapper.style.top = offsets.y + 'px';
    //var dance = eid('dance');
    //dance.style.position = 'absolute';
    //dance.style.top = offsets.y + 116 + 'px';
    //dance.style.left = (eid('footer').offsetWidth - 750) / 2 + 'px';
    //dance.innerHTML = '<img src="graphics/750_02.gif" alt="Dance" />';


   // data.wait = 100;
data.wait = 0;
    data.run_at_framerate(move_things);
    data.run_at_framerate(nav_update);
    
	window.setInterval("data.framerate()", 33);
	
	if (window.location.hash != '' || window.location.search != ''){
		data.location = '';
		check_address_bar();
	}
}
function nav_update(){
  //  if (undefined === data.nav_over_page)return false;
    if (undefined === data.nav_over_page)return true;
    data.nav_over_count++;
    if (data.nav_over_count == 5){
        data.get_page(data.nav_over_page);
        data.location = window.location.protocol + '//' + window.location.hostname + window.location.pathname + '#' + data.nav_over_page;
        window.location.assign(data.location);
        //return false;
        return true;
    }
    return true;
}
function move_things(){
    if (data.wait > 0){
        data.wait--;
        return true;
    }
    eid('dance').innerHTML = '';
    eid('big_logo').width = (eid('big_logo').width > 333)? eid('big_logo').width - 13 : 320;
    var top = eid('big_logo_wrapper').style.top.split('p');
    top = parseInt(top[0]);
    top = (top >= data.step)? top - data.step : 0;
    eid('big_logo_wrapper').style.top = top + 'px';
    if (top == 0 && eid('big_logo').width == 320){
        data.full_black.innerHTML = '';
        data.full_black.style.zIndex = -1;
        document.onclick = click;
        return false;
    }
    return true;
}
function check_address_bar(){
    if (data.location != window.location.href){
        //ther is a hash or it would reload the page
	    data.location = window.location.href;
	    //.... the only case is using the backbutton to get to where you started
	    if(window.location.hash == ''){
	        if(window.location.search == '')data.get_page('home');
	        else data.get_page(window.location.search.substr(1));
	    }else data.get_page(window.location.hash.substr(1));
	}
	return true;
}


/*function address_bar_output(){
    // form and display a function that can generate the current page
    var new_hash = 'something';
    data.history.push(data.hash); // should all events be logged this way, or should there be a better mechanism...
    data.hash = new_hash;
    window.location.hash = new_hash;
}*/


///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

function replace_html(element, html){
    data.full_black.style.zIndex = 9;
    element.innerHTML = html;
    data.full_black.style.zIndex = -1;
}


var data = {
status: [],

//////////////////
types: {},
location: '',
current: [],
future: [],
history: [],
concepts: {},
accessed: {},
raw: {},
by_type: {},
div_ids: [],
session_id: 'new',
//private_request_type: {1:  'function() {return new XMLHttpRequest()}', 2: 'function() {return new ActiveXObject("Msxml2.XMLHTTP")}', 3: 'function() {return new ActiveXObject("Microsoft.XMLHTTP")}'},
links: {},
queued_concepts: [],
running: false,
framerate_functions: {0: check_address_bar},
framerate_parameters:{0: ''},
functions : {},

framerate: function(){
    // things that get done (currently) at about 30 times a second
    for (var key in data.framerate_functions){
        if (!(data.framerate_functions[key]())) delete data.framerate_functions[key];
    }
},

run_at_framerate: function(some_function, some_parameter){
// this should also be passed the parameters to send to the function
    var i = 0;
    do{
        if (undefined === data.framerate_functions[i]){
            data.framerate_functions[i] = some_function;
            break;        
        }else i++;
    }while(1);
},

get_page: function(page){
	if (page == 'history'){
		initSlideshow();
		return;
	}
	
    if(undefined !== data.pages[page]){
        //eid('page').innerHTML = data.pages[page];
        replace_html(eid('page'), data.pages[page]);
        return true;
    }
    data.loading.visibility = 'visible';
    var current_link;
    for (var i = 0; ;i++){
        if (undefined === this.links[i]){
            current_link = this.links[i] = cb.cb('XMLHttpRequest()');
            break;        
        }    
    }
    current_link.open("post", "susrequest.php", true);
    current_link.setRequestHeader("FROM", "sus client");
    current_link.setRequestHeader("STATE-LINK", data.session_id);
//    current_link.setRequestHeader("LOG", data.serialize(data.history));
    //current_link.history = data.history;
    //delete data.history;
//    current_link.setRequestHeader("TASK", data.serialize(data.current));
    //current_link.current = data.current;
    current_link.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    current_link.send("page=" + page);
    //current_link.page = page; dosnt work in ie
    data.run_at_framerate(data.readystatechange);
},

readystatechange: function (){
    var processing;
    for (var key in data.links){
        if (data.links[key].readyState == 4){
            processing = data.links[key];
            delete data.links[key];
            break;
        }
     }
     if (undefined != processing){
        data.from_server(processing);
        return false;
     }else return true;
},

from_server: function(processing){
//    data.session_id = processing.getResponseHeader('STATE_LINK');
    new_title = processing.getResponseHeader('TITLE');
    if (undefined !== new_title)document.title = new_title;
    var page_content = processing.responseText;
    //eid('page').innerHTML = page_content;
    replace_html(eid('page'), page_content);
    //var location = processing.getResponseHeader('page');
    if (processing.getResponseHeader('CACHE') == 1) data.pages[processing.getResponseHeader('page')] = page_content;
    data.loading.visibility = 'hidden';
}


}


var cb = {
//this could handle other differences as well (though has room for improvement obviously)
    all: {
        'XMLHttpRequest()': '1',
        'ActiveXObject("Msxml2.XMLHTTP")': '1',
        'ActiveXObject("Microsoft.XMLHTTP")': '1'
    },
    1: function (){
        var result;
        var funct;
        try {
            result = new XMLHttpRequest();
            funct = function(){return new XMLHttpRequest()};
        }
    catch (e) {
        try {
            result = new ActiveXObject("Msxml2.XMLHTTP");
            funct = function(){return new ActiveXObject("Msxml2.XMLHTTP")};
        }
        catch (e) {
            try {
                result = new ActiveXObject("Microsoft.XMLHTTP");
                funct = function(){return new ActiveXObject("Microsoft.XMLHTTP")};
            }
            catch (e) {
                result = false;
                funct = false;
            }
          }
        }
        return [result, funct];
    }, 
    cb: function(type){
        if (typeof(this.all[type]) == 'function') return this.all[type]();
        var stuff = this[this.all[type]]();
        this.all[type] = stuff[1];
        return stuff[0];
    }
}


var swfLoaded = function(string){
	swf = document.swf;
}


var setOpacity = function(element, one2ten){
	if (one2ten == 10) {
		element.style.opacity = "";
		element.style.filter = '';	
	}else {
		element.style.opacity = "." + one2ten;
		element.style.filter = 'alpha(opacity=' + one2ten + '0)';
	}
}

var initSlideshow = function(){
	/// must make the thing to pause/stop the show
	
	if (swf.load == undefined){
		replace_html(eid('page'), 'to view the slideshow<br><a href="http://get.adobe.com/flashplayer/">get Flash Player</a>');
		return;
	}
	swf.load();
	
	var slideShowDiv = document.createElement('div');
	var style = slideShowDiv.style;
	style.position = 'absolute';
	style.width = '100%';
	style.height = '100%';
	style.left = '0px';
	style.top = '0px';
	style.overflow = 'hidden';
	style.backgroundColor = 'black';
	
	document.body.appendChild(slideShowDiv);
	
	var slideShowWidth = slideShowDiv.offsetWidth;
	var slideShowHeight = slideShowDiv.offsetHeigth;
	if (slideShowHeight == undefined) {
		slideShowHeight = window.innerHeight || slideShowDiv.parentNode.offsetHeight;
	}
	
	var images = {
		root: location.protocol + '//' + location.hostname + location.pathname + 'slideshow/',
		loaded: [],
		next: 0,
		loadNext: function(){
			if (images.next++ < 56){//61) {
				var img = document.createElement('img');
				images.loaded.push(img);
				img.onload = images.loadNext; //onload before src
				img.src = images.root + images.next + '.jpg';
				img.onmousedown = startImgDrag;
				
				slideShowDiv.appendChild(img);
				setOpacity(img, 0);
			}else{
				startShow();
			}
		},
		showNext: function(){
			var img = images.pending.shift();
			if (undefined != img){
				current = img;
				img.style.position = 'absolute';
				
				if (dir.x < 0){
					dir = {x: 1}
				}else{
					dir = {x: -1}
				}
				dir.y = Math.floor(Math.random() * 3) - 1;
				//	

				img.style.top = ((slideShowHeight - img.offsetHeight) / 2) - (100 * dir.y) + 'px';
				img.style.left = ((slideShowWidth - img.offsetWidth) / 2) - (100 * dir.x) + 'px';
				img.style.border = 'solid black 3px';
				slideShowDiv.appendChild(img);
				
				setOpacity(img, 3);
				opacity = 3;

				window.setTimeout(images.showNext, 5000);
			}else{
				stopShow();
			}
		}
	}	
	
	var mouseXY = function (event){
	    if (event.pageX || event.pageY) return {x: event.pageX, y: event.pageY};
		return {x: event.clientX + document.body.scrollLeft - document.body.clientLeft, y: event.clientY + document.body.scrollTop - document.body.clientTop};
	}
	var stopEvent = function (event){
		if (event.preventDefault){
			event.preventDefault();
			event.stopPropagation();
		}else {
			event.cancelBuble = true;
			event.returnValue = false;
		}
	}
	
	var startImgDrag = function(event){
		mouseButtonDown = true;
		if (undefined == event) event = window.event;
		var target = (undefined == event.target)? event.srcElement : event.target;
		stopEvent(event);
		
		var previousXY = mouseXY(event);
		var previousDelta = undefined;
		setOpacity(target, 10);
		slideShowDiv.appendChild(target);
		current = target;
		opacity = 10;
		
				
		document.onmousemove = function(event){
			if (undefined == event) event = window.event;
			stopEvent(event);
			var currentXY = mouseXY(event);
			var delta = {};
			delta.x = currentXY.x - previousXY.x;
			delta.y = currentXY.y - previousXY.y;
			previousXY = currentXY;
			previousDelta = delta;
			moveBy(target, delta);
			
		}
		document.onmouseup = function(){
			document.onmousemove = '';
			dir = previousDelta;
			mouseButtonDown = false;
		}		
	}
	
	var moveBy = function(element, deltaXY){
		element.style.top = element.offsetTop + deltaXY.y + 'px';
		element.style.left = element.offsetLeft + deltaXY.x + 'px';		
	}
	
	var mouseButtonDown = false;
	
	var current = undefined;
	var opacity = undefined;
	
	var dir = {x: -1, y: -1};
	
	var action = function(){
		if (undefined != current && !mouseButtonDown) {
			if (opacity != 10){
				opacity++;
				setOpacity(current, opacity);
			}
			moveBy(current, dir);
		}
	}
	
	var actionInterval = undefined;
	
	var started = undefined;
	var startShow = function(){
		if (undefined == started) {
			started = true;
			
			window.setTimeout(function(){
				swf.playIt()
			}, 1000);
			
			images.pending = images.loaded;
			images.showNext();
			actionInterval = window.setInterval(action, 10);
		}
	}
	var stopShow = function(){
		var fadeLevel = 10;
		var fadeShow = function(){
			fadeLevel--;
			if (fadeLevel == 0){
				window.clearInterval(actionInterval);
				slideShowDiv.parentNode.removeChild(slideShowDiv);
				swf.stopIt();
			}else{
				setOpacity(slideShowDiv, fadeLevel);
				window.setTimeout(fadeShow, 30);
			}
		}
		fadeShow();
	}

	
	images.loadNext();
	
	//just run it in 5 seconds
	window.setTimeout(startShow, 5000);
}

