var is_mobile_safari = navigator.userAgent.match(/AppleWebKit\/.*Mobile\//) ? true : false;

function autoSubmit(e)
{
    var form = Event.element(e).form;
    if (form.onsubmit) {
        if (!form.onsubmit()) {
           Event.stop(e);
           return false;
        }
    }
    
    form.submit();
}

function confirmClick(e)
{
	var msg = 'Are you sure?';
    if (!confirm(msg)) {
        Event.stop(e);
        return false;
    }
    
    return true;
}

function addMessage(message)
{
    if ($('message_container')) {
        $('message_container').appendChild(createMessageBlock(message, 'message'));
    }
}

function addErrorMessage(message)
{
    if ($('message_container')) {
        $('message_container').appendChild(createMessageBlock(message, 'error'));
    }
}

function createMessageBlock(message, className)
{
	var messageBlock = document.createElement('div');

	if (typeof className == 'undefined') {
	    className = 'message';
	}
	
	messageBlock.className=className;
	messageBlock.innerHTML=message;
	return messageBlock;
}

var DAAPNav =
{
	active: null,
	initSearchBox: function()
	{
		if (!$('search_form')) {
			return false;
		}
		
		$('search_input').onfocus=function() {
			if (this.value=='search') {
				this.value='';
			}
			
			this.select();
		}
		
		$('search_input').onblur=function() {
			if (this.value=='') {
				this.value='search';
			}
		}

		var re;
		if (re = navigator.userAgent.match(/Safari\/(\d+)/)) {
			if (parseInt(re[1])<500) {
				$$('.search_input').invoke('addClassName', 'search_input_safari2');
			}
		}
	
		$('nav_search').observe('click', function(e) {
			if (DAAPNav.active == 'nav_search') {
				return;
			}

			$('subnav').innerHTML='';
			$('search_form').addClassName('active');
			$('search_input').focus();
			if ($(DAAPNav.active)) {
				$(DAAPNav.active).removeClassName('active');
			}
			$('subnav').innerHTML = '';
			$('nav_search').addClassName('active');
			DAAPNav.active = 'nav_search';
			Event.stop(e);
		});
	},

	init: function()
	{
		DAAPNav.initSearchBox();

		// initialize header rollovers
		$$("#header span").each(function(me) {
			if (!me.hasClassName('active')) {
				me.observe('mouseover', function() { me.addClassName('active')});
				me.observe('mouseout', function() { me.removeClassName('active')});
			}
		});

		$$('#mainnav>li').each( function(me) {
			me.observe('mouseover', function() { me.addClassName('mainnav_over')});
			me.observe('mouseout', function() { me.removeClassName('mainnav_over')});
			if (me.hasClassName('active')) {
				DAAPNav.active = me.id;
			}
			
			$('subnav').select('ul ul').each( function(i) {
				var ternav_li = i.up('li');
				ternav_li.addClassName('ternav');
				ternav_li.ternav = i;
				i.ternav_li = ternav_li;                
			});
		});
	
		$$('#subnav li.ternav').each( function(me) {
			if (me.hasClassName('active')) {
				$$('#subnav>ul>li').invoke('addClassName', 'ternav_off');
				$$('#subnav>div>ul>li').invoke('addClassName', 'ternav_off');
				me.removeClassName('ternav_off');
				me.addClassName('ternav_active');
			}		
		});
	}

}

var DAAP = {    

	BASE_URL: window.location.protocol + '//' + window.location.host,
	MOBILE_SAFARI: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/),
	nav_active: '',
    domReady: [],
    start: new Date(),
    userOK: false,
    MAX_IDLE_LOGIN: 30 * 60,
    log: function(str) {
    	if (window.console && window.console.log) {
    		window.console.log(str);
    	}
    },

	switchIndexList: function(e)
	{
		$$('#index_list li').invoke('removeClassName', 'active');
		var element = Event.element(e);
		while (element.tagName!='LI' && element.tagName != 'BODY') {
			element = element.parentNode;
		}
		if (element.tagName=='LI') {
			element.addClassName('active');
		}
	},

    init: function() {
		DAAPNav.init();

		if ($('index_list')) {
			$$('#index_list>li').invoke('observe', 'mouseover', DAAP.switchIndexList);
			$('index_list').cleanWhitespace();
		}
	
		$$('.autosubmit').invoke('observe','change',autoSubmit);
		$$('.confirm').invoke('observe', 'click', confirmClick);
		$$('input').each(function(me) {
			me.addClassName("input_" + me.type);
		});
	
		$$('a.external').each(function(me) {
			me.target='_blank';
		});
	
	
		$(DAAP.domReady).each(function(f) { f() }); 
	},
    requires: [],
    require: function(src) {
        if (this.requires.indexOf(src)!=-1) {
            return;
        }
        
        this.requires.push(src);
    
    // inserting via DOM fails in Safari 2.0, so brute force approach
        document.write('<script type="text/javascript" src="'+src+'"></script>');
    },
    onDOMReady: function(f) {
        this.domReady.push(f);
    }
}

DAAPFormElement = Class.create();
DAAPFormElement.prototype = {
	className: 'DAAPFormElement',
	node: null,
	label: '',
	initialize: function(_opts)
	{
		opts = {
			type: 'text',
			_className: '',
			value: '',
			label: ''
		}

		Object.extend(opts, _opts);
		opts.className = _opts.className ? opts._className + ' ' + _opts.className : opts._className;
		if (_opts['class']) {
			opts.className += ' ' + _opts['class'];
		}
		
		var tagName = 'input';

		var inputOpts = {
			name: opts.name ? opts.name : opts.id ? opts.id : '',
			className: opts.className,
			value: opts.value,
			type: opts.type			
		}

		//bail if the id already exists		
		if ($(opts.id)) {
			return;
		}
		
		//set some properties if they exist
		['id', 'checked', 'selected', 'onclick', 'onfocus', 'onblur', 'onmousedown', 'onmouseup', 'onmouseenter', 'onmouseleave'].each(function(opt) {
			if (opts[opt]) {
				inputOpts[opt] = opts[opt];
			}
		});

		this.node = Builder.node('input', inputOpts);
		this.node.onclick = opts.onclick ? opts.onclick : null;
		if (opts.label) {
			this.label = Builder.node('label', { className: 'label_' + opts.type}, opts.label);
		}
		
		this.node.object = this;
	}
}

DAAPButton = Class.create();
DAAPButton.prototype = {
	node: null,
	className: 'DAAPButton',
	initialize: function(_opts)
	{
		opts = {
			title: 'OK',
			type: 'button',
			_className: ''
		}

		Object.extend(opts, _opts);
		opts.className = _opts.className ? opts._className + ' ' + _opts.className : opts._className;
		if (_opts['class']) {
			opts.className += ' ' + _opts['class'];
		}

		var buttonOpts = {
			name: opts.name ? opts.name : (opts.id ? opts.id : ''),
			className: opts.className,
			value: opts.title,
			type: opts.type
		}

		
		if (opts.id) {
			if ($(opts.id)) {
				alert(opts.id + " Already exists");
				return;
			}
			buttonOpts.id = opts.id;			
		}
		
		
		this.node = Builder.node('input', buttonOpts);
		this.node.onclick = opts.onclick ? opts.onclick : null;

		this.node.object = this;
	}
}

DAAPDialogBox = Class.create();
DAAPDialogBox.prototype = {
	buttons: [],
	title: '',
	form: false,
	id: '',
	className: 'DAAPDialogBox',
	upload_started: false,
	initialize: function(_opts)
	{
		opts = {
			id: 'dialogBox',
			_className: 'dialogBox',
			title: 'DAAP',
			width: 250,
			height: 150,
			hide: false,
			action: '',
			method: 'GET',
			enctype: '',
			upload: false
		}
		
		
		Object.extend(opts, _opts);
		opts.className = _opts.className ? opts._className + ' ' + _opts.className : opts._className;
		if (_opts['class']) {
			opts.className += ' ' + _opts['class'];
		}
		
		var divOpts = {
			id: opts.id,
			className: opts.className
		}
		
		if ($(opts.id)) {
			return;
		}
		
		this.id = opts.id;
		

		this.title = opts.title;		
		this.node = Builder.node('div', divOpts);
		this.node.object = this;
		
		this.node.style.width = opts.width+'px';
		this.node.style.height = opts.height+'px';

		/* center it */
		
		var width = this.node.getDimensions().width;
		var screenX = document.viewport.getWidth();
		var left = opts.left ?  opts.left : Math.floor( (screenX / 2) - (width/2));
		this.node.style.left = left + 'px';
		
		if (opts.upload) {
			opts.method = 'POST';
			opts.enctype = 'multipart/form-data';
			this.uploadStatus='';
		}
		
		
		this.titleBox = Builder.node('div', { className: 'dialog_title' }, opts.title);
		this._add(this.titleBox);
		this.form = Builder.node('form', { id: opts.id + '_form', action: opts.action, method: opts.method, enctype: opts.enctype, className: 'dialog_form' });
		this.form.object = this;
		this._add(this.form);
		this.contentBox = Builder.node('div', { className: 'dialog_content' });
		this.form.appendChild(this.contentBox);
		this.buttonBox = Builder.node('div', { className: 'dialog_buttons' });
		this.form.appendChild(this.buttonBox);
		
		document.body.appendChild(this.node);
		if (opts.hide) {
			this.hide();
		}

		if (opts.upload) {
			var iframe_name = this.id + '_uploadFrame';

			var iframe = Builder.node('iframe', { 
				id: iframe_name,
				name: iframe_name,
				className: 'dialog_uploadTarget',
				object: this
				}
			);
			
			this.add(iframe);
			this.form.observe("submit", this.progressStart);
			
			if(window.frames[iframe_name].name != iframe_name) { 
				/* *** IMPORTANT: This is a BUG FIX for Internet Explorer *** */ 
				self.frames[iframe_name].name = iframe_name;
			}
			this.form.target=iframe_name;
			iframe.onload = this.uploadFinished;
			iframe.onreadystatechange = this.checkFinished;
			iframe.form = this.form;
		}

		if (opts.onfinished) {
			this.onfinished = opts.onfinished;
		}

		if (opts.onsubmit) {
			this.onsubmit = opts.onsubmit;
		}
		
		this.dialogBox = this;
		
	},
	progressStart: function(e) {
		var f = Event.element(e);
		var t = f.object;
		t.upload_started= true;
		t.uploadStatus = 'Uploading...';
		if (t.onsubmit) {
			t.onsubmit(t);
		}
	},
	uploadFinished: function() {
		
		var t = this.object;
		if (!t.upload_started) {
			return;
		}
		var frame = window.frames[this.form.target];
		if (!frame.document || !frame.document.body) {
			return;
		}
		
		t.req = {
			responseText: frame.document.body.textContent,
			responseXML: frame.document.body
		};
		
		t.uploadStatus = 'Done Uploading...';
		
		if (t.onfinished) {
			t.onfinished(t);
		}
		
//		$(t.id + '_uploadFrame').remove();
	},
	checkFinished: function() {
	},
	close: function() {
		var d = this.dialogBox;
		d.node.remove();
		d.node = null;
		d.buttons = [];
	},
	hide: function() {
		var d = this.dialogBox;
		d.node.hide();
	},
	show: function() {
		var d = this.dialogBox;
		d.node.show();
	},
	addFormElement: function(el) {
		if (el.className=='DAAPFormElement') {
			el.dialogBox = this;
			el.node.dialogBox = this;
			el.node.addClassName('dialog_formelement');
			if (el.label) {
				el.label.addClassName('dialog_label');
				this.add(el.label);
			}
			this.add(el.node);
			return el;
		}

	},
	addButton: function(button) {
		if (button.className=='DAAPButton') {
			button.dialogBox = this;
			button.node.dialogBox = this;
			button.node.addClassName('dialogButton');
			this.buttons.push(button);
			this.buttonBox.appendChild(button.node);
			return button;
		}
	},
	_add: function(el) {
		el.object = this;
		el.node = this.node;
		this.node.appendChild(el);
		return el;
	},
	add: function(el) {
		el.object = this;
		el.node = this.node;
		this.contentBox.appendChild(el);
		return el;
	}
}

var DAAPSpace = 
{
	login_form_visible: false,
	show_login_form: function() {
	
        $('login_form_mobile').style.visibility='visible';
        $('login_form_toggle').src='/images/daap_2008/login_cancel.png';
        /*
        $('login_form_mobile').style.webkitTransform='translateY(0)';    
        */
		DAAPSpace.login_form_visible = true;
        //scrollTo(0,1);
	},

	hide_login_form: function() {
	/*
        $('login_form_mobile').style.webkitTransform='translateY(-80px)';    
        */
        $('login_form_mobile').style.visibility='hidden';
        $('login_form_toggle').src='/images/daap_2008/login_login.png';
		DAAPSpace.login_form_visible = false;
        //scrollTo(0,1);
	},

    toggle_login_form: function() {
        if (DAAPSpace.login_form_visible) {  
            DAAPSpace.hide_login_form();
        } else {
            DAAPSpace.show_login_form();
        }
    },
	getUserStatus: function() 
	{
		new Ajax.Request('/user_status/js?get=status', { onSuccess: DAAPSpace.processUserStatus});
	},
	processUserStatus: function(xhr)
	{
        try {
            var status = eval("(" + xhr.responseText + ")");
            
        } catch (e) { 
        	return; 
        }
        
        if (status.status_type != 'X') {
			$('login_status_user_status').innerHTML = status.status_type;
			$('login_status_user_status').className = 'user_status_' + status.status_type;
			$('login_status_user_status').observe('click', function() { window.location='/user_status' });
		}
        
	},
	alternateMe: function(e)
	{
		var el = Event.element(e);
		
		if (el.getAttribute('module')) {
		   DAAPSpace.alternate(el.getAttribute('module'));
		}
	},
	alternate: function(module, show)
	{
		var dontSetCookie = typeof arguments[2] == 'undefined' ? false : arguments[2];
		var element = $(module);	
		var element_label = $('alternate_' + module);
	
		if (!element) {
			alert('Unable to find element: ' + module);
			return false;
		}
		
		if (typeof show == 'undefined') {
			show = element.hasClassName('alternate_on') ? false : true;
		}
		 
		if (show) {
			if (element.hasClassName('alternate_off')) {
				Effect.BlindDown(element, {duration:.2});
				element.removeClassName('alternate_off');
			}
			element.addClassName('alternate_on');
			if (element_label) {
				element_label.removeClassName('alternate_hidden');
				element_label.removeClassName('alternate_last_hidden');
			}
		} else {
			if (element.hasClassName('alternate_on')) {
				Effect.BlindUp(element, {duration:.2});
				element.removeClassName('alternate_on');
			} else {
				element.hide();
			}
			element.addClassName('alternate_off');
			if (element_label) {
				element_label.addClassName('alternate_hidden');
				if (element_label.hasClassName('alternate_last')) {
					element_label.addClassName('alternate_last_hidden');
				}
			}
		}
		
		if (!dontSetCookie) {
			//set the cookie to expire in 14 days
			var now = new Date();
			setCookie("ds_" + module, show ? 'on' : 'off', new Date(now.getTime() + 1209600000), '/');
		}
	
		return;
	},
	initAlternates:function(start_element)
	{
		$$('.alternate').each(function(me) {
			if ( re = me.id.match(/^alternate_(.*)$/) ) {
				/* setup behaviors for the item */
				me.setAttribute('module',re[1]);
				me.observe('click', DAAPSpace.alternateMe);
				
				var show = true;
	
				if (me.hasClassName('alternate_off')) {
					show = false;
				}
				
				if (getCookie('ds_' + re[1])) {
					show = getCookie('ds_' + re[1])=='on' ? true : false;
				}
	
				DAAPSpace.alternate(re[1], show, true);
			}
		});
	},

	addUploadFile: function(e)
	{
		var li = $('upload_container').down('li').cloneNode(true);
		var button = Builder.node('input', {type: 'button', value: '-', className:'input_button'});
		$(button).observe('click', DAAPSpace.removeUploadFile);
		button.li = li;
		
		li.appendChild(button);
		$('upload_container').appendChild(li);
		return true;
	},
	removeUploadFile: function(e)
	{
		var el = Event.element(e);
		if (el.li) {
			el.li.parentNode.removeChild(el.li);
		}
		return true;
	},
	switchIndexList: function(e)
	{
		$$('#index_list li').invoke('removeClassName', 'active');
		var element = Event.element(e);
		while (element.tagName!='LI' && element.tagName != 'BODY') {
			element = element.parentNode;
		}
		if (element.tagName=='LI') {
			element.addClassName('active');
		}
	},
	showDialogMask: function() 
	{
		if (!$('dialog_mask')) {
			var dialog_mask = document.createElement('div');
			dialog_mask.id = 'dialog_mask';
			dialog_mask.hideMask = DAAPSpace.hideDialogMask;
			document.body.appendChild(dialog_mask);
		}
		$('dialog_mask').style.display='block'
	},
	hideDialogMask: function() 
	{
		$('dialog_mask').style.display='none';
	},
	hideLoginBox:function() {
		$('dialog_mask').hideMask();
	 	$('login_form_header').style.display='none';
	},
	showLoginBox:function(e) 
	{
		DAAPSpace.showDialogMask();
	 	$('login_form_header').style.display='block';
	 	$('login_cancel').observe('click', function(e) { $('login_form_header').hideBox(); Event.stop(e)});
		Event.stop(e);
		return false;
	},
	initTextArea: function(element) 
	{
		var counter = document.createElement('div');
		counter.className = 'counter';
		if (element.readAttribute('maxlength')) {
			var counterClone = counter.cloneNode(true);
			counterClone.innerHTML = '<span>0</span>/'+element.readAttribute('maxlength');
			element.parentNode.insertBefore(counterClone,element.nextSibling);
			element.relatedElement = counterClone.getElementsByTagName('span')[0];
			element.onkeyup = element.onchange = DAAPSpace.checkMaxLength;
			element.onkeyup();
		}
	},	
	checkMaxLength: function() 
	{
		var maxLength = this.readAttribute('maxlength');
		var currentLength = this.value.length;
		if (currentLength > maxLength) {
			this.relatedElement.className = 'toomuch';
			this.value = this.value.substring(0, maxLength);
		} else {
			this.relatedElement.className = '';	
		}
		this.relatedElement.firstChild.nodeValue = this.value.length;
	},	
	init: function()
	{
		
		if ($('upload_container')) {
			var button = Builder.node('input', { type: 'button', value: 'more files', className:'input_button'});
			button.onclick = DAAPSpace.addUploadFile;
			new Insertion.Before('upload_container', button);
		}
		DAAPSpace.initAlternates();

		$$('.user_search_field').each(function(me) { 
			CreateUserSearch(me);
		});

		$$('.room_search_field').each(function(me) { 
			CreateRoomSearch(me);
		});

		if ($('checkall')) {
			$('checkall').onclick= function() { $$('.checkbox_choose').each(function(me) { me.checked=true})};
		}
	
		if ($('uncheckall')) {
			$('uncheckall').onclick= function() { $$('.checkbox_choose').each(function(me) { me.checked=false})};
		}

	    $$('textarea[maxlength]').each(DAAPSpace.initTextArea);
	    
	    if ($('login_status_user_status')) {
	    	DAAPSpace.getUserStatus();
	    }
	
		if (is_mobile_safari) {
			if ($('login_form_toggle')) {
				$('login_form_toggle').observe('click', DAAPSpace.toggle_login_form);
			}
		    scrollTo(0,1);
		}
	}
	
}
DAAP.onDOMReady(DAAPSpace.init);

if (DAAP.BASE_URL=='http://search.uc.edu') {
	DAAP.BASE_URL='http://daap.uc.edu';
}

Event.onDOMReady(DAAP.init);

try { document.execCommand("BackgroundImageCache",false,true); } catch(e) {};

DAAP.require(DAAP.BASE_URL + '/shared/scripts/js_library.js');
DAAP.require(DAAP.BASE_URL + '/shared/scripts/scriptaculous/scriptaculous.js?load=effects,builder');
DAAP.require('/scripts/user_search.js');
DAAP.require('/scripts/room_search.js');


