var isIE = document.all;

function isFunction( a ) {
    return typeof a == 'function';
}

function isObject( a ) {
    return ( a && typeof a == 'object' ) || isFunction( a );
}

function isAlien( a ) {
   return isObject( a ) && typeof a.constructor != 'function';
}

function isArray( a ) {
    return isObject( a ) && a.constructor == Array;
}

function isBoolean( a ) {
    return typeof a == 'boolean';
}

function isEmpty( o ) {
	var i, v;
	if( isObject( o ) ) {
		for( i in o ) {
			v = o[i];
			if( isUndefined( v ) && isFunction( v ) ) {
				return false;
			}
		}
	}
	return true;
}

function isNull( a ) {
    return typeof a == 'object' && !a;
}

function isNumber( a ) {
    return typeof a == 'number' && isFinite( a );
}

function isNumeric( a ) {
	return isNumber( a );
}

function isString( a ) {
    return typeof a == 'string';
}

function isUndefined( a ) {
    return typeof a == 'undefined';
} 

function getElement( objName ) {
	if( isIE ) {
		if( document.all[objName] ) {
			return document.all[objName];
		} else {
			throw "getElement(): No such element: '" + objName + "' (using document.all[])";
		}
	} else if( document.getElementById ) {
		if( document.getElementById( objName ) ) {
			return document.getElementById( objName );
		} else {
			throw "getElement(): No such element: '" + objName + "' (using getElementById())";
		}
	}
	throw "getElement(): Could not get a reference to element ID '" + objName + "'.";
}

function setSize( el, w, h ) {
	try {
		var o = getElement( el );
		o.style.width = w + "px";
		o.style.height = h + "px";
	} catch( e ) {
		alert( e );
	}
}

function getXPos( el ) {
	try {
		var obj = getElement( el );
		var curleft = 0;
		if( obj.offsetParent ) {
			while( obj.offsetParent ) {
				curleft += obj.offsetLeft
				obj = obj.offsetParent;
			}
		} else if( obj.x )
			curleft += obj.x;
		return curleft;
	} catch( e ) {
		alert( e );
	}
}

function getYPos( el ) {
	try {
		var obj = getElement( el );
		var curtop = 0;
		if( obj.offsetParent ) {
			while( obj.offsetParent ) {
				curtop += obj.offsetTop
				obj = obj.offsetParent;
			}
		} else if( obj.y )
			curtop += obj.y;
		return curtop;
	} catch( e ) {
		alert( e );
	}
}

function getSize( el ) {
	try {
		var o = getElement( el );
		return { width : parseInt( o.style.width ), height : parseInt( o.style.height ) };
	} catch( e ) {
		alert( e );
	}
}

function getRect( el ) {
	try {
		var o = getElement( el );
		return {
			x : getXPos( el ), 
			y : getYPos( el ), 
			width : parseInt( o.style.width ), 
			height : parseInt( o.style.height )
		};
	} catch( e ) {
		alert( e );
	}
}

function getCoords( el ) {
	return { x : getXPos( el ), y : getYPos( el ) };
}

function getMouseCoordsByEvent( event ) {
	if( isIE ) {
		return {
			x:window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft,
			y:window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop
		};
	} else {
		return { x:event.clientX + window.scrollX, y:event.clientY + window.scrollY };
	}
}

function moveElement( el, coords ) {
	try {
		var o = getElement( el );
		o.style.top = coords.y + "px";
		o.style.left = coords.x + "px";
	} catch( e ) {
		alert( e );
	}
}

function showElement() {
	try {
		if( arguments.length == 1 )
			getElement( arguments[0] ).style.display = "inline";
		else if( arguments.length == 2 )
			getElement( arguments[0] ).style.display = arguments[1];
	} catch( e ) {
		alert( e );
	}
}

function hideElement( e ) {
	getElement( e ).style.display = "none";
}

function toggleElementVisibility( e ) {
	try {
		if( getElement( e ).style.display == "none" )
			showElement( e );
		else
			hideElement( e );
	} catch( e ) {
		alert( e );
	}
}

function disableElement( objName ) {
	getElement( objName ).disabled = true;
}

function enableElement( objName ) {
	getElement( objName ).disabled = false;
}

function elementClear( e ) {
	getElement( e ).innerHTML = "";
}

function elementWrite( e, m ) {
	if( arguments.length > 2 && arguments[2] )
		getElement( e ).innerHTML += escape( m );
	else
		getElement( e ).innerHTML += m;
}

function elementWriteln( e, m ) {
	if( arguments.length > 2 && arguments[2] )
		elementWrite( e, m + "\n", arguments[2] );
	else
		elementWrite( e, m + "\n" );
}

function elementWritebr( e, m ) {
	if( arguments.length > 2 && arguments[2] )
		elementWrite( e, m + "<br />\n", arguments[2] );
	else
		elementWrite( e, m + "<br />\n" );
}

function setElementHTML( e, h ) {
	getElement( e ).innerHTML = h;
}

function getElementHTML( e ) {
	return getElement( e ).innerHTML;
}

function isEnabled( name ) {
	return !getElement( name ).disabled;
}

function isDisabled( name ) {
	return getElement( name ).disabled;
}


//
// General text field functions
//
function focusField( name ) {
	getElement( name ).focus();
}

function getFieldValue( name ) {
	return getElement( name ).value;
}

function setFieldValue( name, val ) {
	getElement( name ).value = val;
}

function setCheckbox( name, yn ) {
	if( isEnabled( name ) )
		getElement( name ).checked = ( yn == 'y' || yn == 'Y' );
}

function isChecked( name ) {
	return getElement( name ).checked;
}

function checkboxLabel( name ) {
	if( isEnabled( name ) )
		getElement( name ).checked = !getElement( name ).checked;
	return isEnabled( name );
}

function addOption( sel, txt, val, selected ) {
	getElement( sel ).options[ getElement( sel ).options.length ] = new Option( txt, val );
	getElement( sel ).options[ getElement( sel ).options.length - 1 ].selected = selected;
}

function clearSelect( name ) {
	getElement( name ).options.length = 0;
}

function getSelectedIndex( o ) {
	return getElement( o ).selectedIndex;
}

function getSelectedText( o ) {
	var s = getElement( o ); 
	return s.options[s.selectedIndex].text;
}

function getSelectedValue( o ) {
	var s = getElement( o ); 
	return s.options[s.selectedIndex].value;
}

function selectIndexByValue( o, v ) {
	var s = document.getElementById( o );
	for( var i = 0; i < s.length; i++ ) {
		if( s.options[i].value == v ) {
			s.selectedIndex = i;
			return;
		}
	}
}

function selectIndexByText( o, t ) {
	var s = document.getElementById( o );
	for( var i = 0; i < s.length; i++ ) {
		if( s.options[i].text == t ) {
			s.selectedIndex = i;
			return;
		}
	}
}

function getIndexByValue( o, v ) {
	var s = document.getElementById( o );
	for( var i = 0; i < s.length; i++ ) {
		if( s.options[i].value == v ) {
			return i;
		}
	}
	return -1;
}

function getIndexByText( o, t ) {
	var s = document.getElementById( o );
	for( var i = 0; i < s.length; i++ ) {
		if( s.options[i].text == t ) {
			return i;
		}
	}
	return -1;
}

function setOpacity( e, o ) {
	// example of transparency in either major browser
	// pass in a value (o) from 0 to 100
	if( o >= 0 && o <= 100 ) {
		//getElement( e ).
		if( isIE )
			getElement( e ).style.filter = "alpha( opacity = " + o + " )";
		else
			getElement( e ).style.opacity = o / 100;
	} else {
		throw "Opacity of " + o + " is out of range for the setOpacity() function.";
	}
}

function getOpacity( e ) {
	// example of transparency in either major browser
	// returns a value from 0 to 100
	if( isIE )
		getElement( e ).style.filter = "alpha( opacity = " + o + " )";
	else
		getElement( e ).style.opacity = o / 100;
	return 0;
}


function blankRequest() {
	getElement( "request" ).value = "<request command=\"search\">\n\t<type>image</type>\n\t<metaField name=\"\"></metaField>\n</request>";
}

function assetRequest() {
	getElement( "request" ).value = "<request command=\"href\">\n\t<key version=\"0\">(paste key here)</key>\n</request>";
}
