	/**
	*
	*	base.source.js
	*
	*	This file is referenced by our DEV environment for development and testing.
	*	Before deploying to production, compile (base.js) using JSMin.
	*
	*/
	
	var isIE = navigator.appName.indexOf( "Microsoft" ) != -1;
	var isSafari = navigator.userAgent.toLowerCase().indexOf( "safari" ) != -1;
	var isAlexa = navigator.userAgent.toLowerCase().indexOf( "alexa" ) != -1;
	
	/**
	*
	*	Performs Advanced Search
	*	@lib YUI
	*	@return void
	*
	*/
	function AdvancedSearch(){
		YAHOO.util.Dom.get('AdvancedSearch').submit();
	}
	
	/**
	*
	*	Performs Search on browse page
	*	@lib YUI
	*	@return void
	*
	*/
	function RefineBrowse(){
		YAHOO.util.Dom.get('RefineBrowse').submit();
	}
	
	/**
	*
	*	Toggles Details Module Based On Selected Item
	*	@lib YUI
	*	@param object object Select DOM Element
	*	@param string name Name Of Toggle Container (Concatinated With 'Details')
	*	@return void
	*
	*/
	function GetDetails( object, name ){
		if ( object.options[ object.selectedIndex ].value == '-1' ){
			YAHOO.util.Dom.get( name + 'Details' ).style.display = 'none';	
		} else {
			YAHOO.util.Dom.get( name + 'Details' ).style.display = 'block';	
		}
	}
	
	
	
	/**
	*
	*	Displays A Character Count, Primarily Used For Textareas
	*	@lib YUI
	*	@param object object Input Field In Question
	*	@param string maxLen Total Number Of Characters Permitted
	*	@param string output DOM Element 
	*	@param boolean html True If Basic HTML Is Permitted
	*	@return void
	*
	*/
	function AdjustCount( object, maxLen, output, html ){
		var current = object.value.length;
		var count = 0;
		var message = "";
		if ( current > maxLen ){
			object.value = object.value.substr( 0, maxLen );
			count = 0;
		} else {
			count = maxLen - current;
		}
		if ( html ){
			message = " (Basic HTML Allowed)";
		} else {
			message = " (No HTML Allowed)";
		}
		YAHOO.util.Dom.get( output ).innerHTML = count + ' characters left. ' + maxLen + ' total.' + message;
	}
	
	/**
	*
	*	Switches An Objects Display Style Between Block/None
	*	@param object e Object To Perform Toggle On
	*	@return void
	*
	*/
	function Display( e ){
		if ( e.style.display == "block" || !e.style.display ){
			e.style.display = "none";
		} else {
			e.style.display = "block";
		}
	}
	
	/**
	*
	*	Dynamically Searches For SKATE Game Users And Returns Formatted HTML
	*	@lib YUI
	*	@param object obj Search Term (username)
	*	@param int user User ID
	*	@return void
	*
	*/
	function FindUsers( obj, user ){
		var term = obj.value;
		if ( user == "" ){
			user = 0;	
		}
		YAHOO.util.Connect.asyncRequest( 'GET', '/process/games.php?id=' + user + '&action=search&term=' + term, {
			success: function( o ){
				YAHOO.util.Dom.get( 'SearchResults' ).innerHTML = o.responseText;
			}
		});
	}
	
	/**
	*
	*	Retrieves Anchor Tag From URL As ID
	*	@return void
	*
	*/
	function GetID(){
		var totalURL = window.location.href;
		var divider = "#";
		var urlImageNum = totalURL.split( divider );
			
		if ( urlImageNum[1] != "" )
			return parseInt( urlImageNum[1] );
		else
			return 0;
	}
	
	/**
	*
	*	Modifies Object Promotions
	*	@lib YUI
	*	@param int type Object Base Type
	*	@param int id Object Base ID
	*	@return void
	*
	*/
	function Grind( type, id ){
		var params = 'action=add&type=' + type + '&id=' + id;
		YAHOO.util.Connect.asyncRequest( 'POST', '/ajax/Grind/', {
			success: function( o ){
				YAHOO.util.Dom.get( "grinds_" + type + "_" + id ).innerHTML = o.responseText;
				YAHOO.util.Dom.get( "grindit_" + type + "_" + id ).innerHTML = "Grinded!";
			}
		}, params );
	}
	
	/**
	*
	*	Opens Profile Editor To Specific Editor
	*	@lib YUI
	*	@return void
	*
	*/
	function JumpTo(){
		if ( YAHOO.util.Dom.get('JumpTo')){
			var jumpTo = YAHOO.util.Dom.get('JumpTo').options[ YAHOO.util.Dom.get('JumpTo').selectedIndex ].value;
			if ( jumpTo != "-1" ){
				window.location.href = '/profile/' + VIEWER_NAME + '/?edit=' + jumpTo;
			}
		}
	}
	
	/****************************************
	**
	**	Modals
	**
	****************************************/
	
	/**
	*
	*	Renders Modal For Usage
	*	@lib YUI
	*	@return void
	*
	*	@var object modal Modal Overlay
	*	@var object cover Page Cover
	*
	*/
	var modal;
	var cover;
	function EnableModal(){
		
		// Initializes Modal
		// Note: 'iframe' set to 'false' to fix Mozilla text input caret bug.
		modal = new YAHOO.widget.Overlay( "Modal", {
			fixedcenter:true,
			height:"0px",
			iframe:false,
			visible:false,
			width:"0px",
			zIndex:'35001'
		});
		modal.render();
		
		// Initializes Page Cover (Transparent Black Background)
		// Note: IE recognizes 'Body' height as 'auto', forcing us to use 'Viewport Height/Width'
		var docWidth = YAHOO.util.Dom.getViewportWidth();
		var docHeight = YAHOO.util.Dom.getViewportHeight();
		cover = new YAHOO.widget.Overlay( "PageCover", {
			fixedcenter:true,
			height:docHeight+'px',
			iframe:false,
			visible:false, 
			width:docWidth+'px',
			zIndex:'35000'
		});
		cover.render();
		YAHOO.util.Dom.setStyle( 'PageCover', 'opacity', 0.5 );
		
	}
	
	/**
	*
	*	Shows Modal
	*	@lib YUI
	*	@param int width Width Of Modal Overlay
	*	@param int height Height Of Modal Overlay
	*	@return void
	*
	*/
	function CreateModal( width, height ){
    
        // Resets Modal Background To Default
        YAHOO.util.Dom.removeClass('Modal', 'setModalAsTagVideoBackground');
        YAHOO.util.Dom.removeClass('Modal', 'setModalAsTagPhotoBackground');
        YAHOO.util.Dom.addClass('Modal', 'setModalAsStandardBackground');
		
		// Minimizes Page Loading Conflicts
		if ( modal == null ){
			EnableModal();
		}
		
		// Resizes And Sets Modal As Visible
		modal.cfg.setProperty( 'width', width + 'px' ); 
		modal.cfg.setProperty( 'height', height + 'px' ); 
		modal.show();
		
		// Resizes And Sets Modal As Visible
		cover.show();
	}
	
	/**
	*
	*	Hides Modal
	*	@lib YUI
	*	@return void
	*
	*/
	function DestroyModal(){
		
		// Disables Enter KeyCode Listeners (Usage: AJAX Form Submission)
		if ( typeof( listenForEnter ) != 'undefined' ){
			listenForEnter.disable();
		}
		
		// Hides Modal
		modal.hide();
		
		// Hides Page Cover
		cover.hide();
		
		// Removes Modal Contents For Next Usage
		YAHOO.util.Dom.get('Modal').innerHTML = "";
	}
	
	/**
	*
	*	Pops A Modal Alert To The User
	*	@lib YUI
	*	@param int id Status ID Code
	*	@param int width Modal Width (optional)
	*	@param int height Modal Height (optional)
	*	@return void
	*
	*/
	function Alert(id, width, height, content) {
		
		// Default Width/Height
		if (typeof(width) == 'undefined') { width = 225; }
		if (typeof(height) == 'undefined') { height = 100; }
        if (typeof(content) == '') { content = ''; }
		
		// Pauses Flash Player (If Applicable)
		try {
			get_flash_movie().fl_pause(); 
		} catch(e) {}
		
		// Creates Modal (iFrame Protected)
		CreateModal(width, height);
		
		// Gets Alert ID Code
		var params = ((id)?'id='+id:'');
        
        // Resets Modal Backgrounds
        YAHOO.util.Dom.removeClass('Modal', 'setModalAsStandardBackground');
		
		// Minimizes AJAX Calls Since Success Message Rarely Changes
		if (id == '1') {
            YAHOO.util.Dom.addClass('Modal', 'setModalAsStandardBackground');
			var html = '<div class="close"><a href="javascript:DestroyModal();" title="Close">x</a></div>';
				html += '<h1>Success!</h1>';
				html += '<h2>Changes made successfully!</h2>';
				html += '<div class="actions"><a class="grey" href="javascript:DestroyModal();" title="Okay">Okay</a></div>';
			YAHOO.util.Dom.get('Modal').innerHTML = html;
		} else if (id == '54') {
            YAHOO.util.Dom.addClass('Modal', 'setModalAsTagVideoBackground');
            var html = '<div class="close"><a href="javascript:DestroyModal();" title="Close">x</a></div>';
                html += '<h1>Add a Video!</h1>';
                html += '<h2>';
                html += 'To add your video to this page, simply tag<br />it with <b>'+content+'</b>.';
                html += '<br /><br />';
                html += '<b>Note:</b> You can only tag videos you\'ve<br />uploaded and you must be logged in. It<br />may also take several minutes for your<br />video to show.';
                html += '</h2>';
                html += '<div class="tagVideoForm">'+content+'</div>';
                html += '<div class="actions"><a class="grey" href="javascript:DestroyModal();" title="Okay">Okay</a></div>';
            YAHOO.util.Dom.get('Modal').innerHTML = html;
        } else if (id == '55') {
            YAHOO.util.Dom.addClass('Modal', 'setModalAsTagPhotoBackground');
            var html = '<div class="close"><a href="javascript:DestroyModal();" title="Close">x</a></div>';
                html += '<h1>Add a Photo Gallery!</h1>';
                html += '<h2>';
                html += 'To add your photo gallery to this page,<br />tag it with <b>'+content+'</b>.';
                html += '<br /><br />';
                html += '<b>Note:</b> You can only tag photo galleries<br />you\'ve created and you must be logged in.<br />It may also take several minutes for<br />your photo gallery to show.';
                html += '</h2>';
                html += '<div class="tagPhotoForm">'+content+'</div>';
                html += '<div class="actions"><a class="grey" href="javascript:DestroyModal();" title="Okay">Okay</a></div>';
            YAHOO.util.Dom.get('Modal').innerHTML = html;
		} else {
            YAHOO.util.Dom.addClass('Modal', 'setModalAsStandardBackground');
		
			// Asynchronous Communication To Return Custom Alert
			YAHOO.util.Connect.asyncRequest('POST', '/ajax/DisplayAlert/', {
				success: function(o) {
					var html = '<div class="close"><a href="javascript:DestroyModal();" title="Close">x</a></div>';
						html += o.responseText;
						html += '<div class="actions"><a class="grey" href="javascript:DestroyModal();" title="Okay">Okay</a></div>';
					YAHOO.util.Dom.get('Modal').innerHTML = html;
				}
			}, params);
		}
	}
	
	/**
	*
	*	Opens Login Form Via AJAX As Modal
	*	@lib YUI
	*	@param string action Action To Be Taken
	*	@return void
	*	
	*	@var object listenForEnter Event Listener Listening For Keycode 13 (Enter Key)
	*
	*/
	var listenForEnter;
	function Login( action ){
		
		// Pauses Flash Player (If Applicable)
		try {
			get_flash_movie().fl_pause(); 
		} catch( e ){}
		
		// Creates Modal (iFrame Protected)
		CreateModal( 350, 200 );
		
		// Gets All Potentially-Populated Values
		var username = (( YAHOO.util.Dom.get('LoginUsername')) ? YAHOO.util.Dom.get('LoginUsername').value : '' );
		var password = (( YAHOO.util.Dom.get('LoginPassword')) ? MD5(YAHOO.util.Dom.get('LoginPassword').value) : '' );
		var remember = (( YAHOO.util.Dom.get('LoginRemember')) ? YAHOO.util.Dom.get('LoginRemember').checked : '' );
		
		// Sets POST Parameters
		var params = (( username != '' && username != 'undefined' ) ? '&username=' + username : '' );
			params += (( password != '' && password != 'undefined' ) ? '&password=' + password : '' );
			params += (( remember != '' && remember != 'undefined' ) ? '&remember=' + remember : '' );
		
		// Creates Global Login Modal Components
		var html = '<div class="close"><a href="javascript:DestroyModal();" title="Close">x</a></div>';
			html += '<img class="G" src="http://images.grindtv.com/images/1/images/site/icons/login_G.gif" />';
			html += '<img class="GrindTVcom" src="http://images.grindtv.com/images/1/images/site/icons/login_GrindTVcom.gif" />';
		
		// User Attempting To Login
		if ( action == 'login' ){
		
			// Required User Entry Missing
			if ( username.replace( ' ', '' ).length == 0
				|| password.replace( ' ', '' ).length == 0 ){
				
				// Username Required
				if ( username.replace( ' ', '' ).length == 0 ){
					YAHOO.util.Dom.addClass( 'LoginUsername', 'empty' );
				} else {
					YAHOO.util.Dom.removeClass( 'LoginUsername', 'empty' );
				}
				
				// Password Required
				if ( password.replace( ' ', '' ).length == 0 ){
					YAHOO.util.Dom.addClass( 'LoginPassword', 'empty' );
				} else {
					YAHOO.util.Dom.removeClass( 'LoginPassword', 'empty' );
				}
			
			// Begins Logging In User
			} else if ( YAHOO.util.Dom.get( 'LoginStatus' )){
				
				// Removes Missing Field Indicators (If Applicable)
				YAHOO.util.Dom.removeClass( 'LoginUsername', 'empty' );
				YAHOO.util.Dom.removeClass( 'LoginPassword', 'empty' );
				
				// Displays Status To User
				YAHOO.util.Dom.get( 'LoginStatus' ).innerHTML = '<b>Logging in... &nbsp;</b>';
				
				// Asynchronous Communication Attempting To Login User
				YAHOO.util.Connect.asyncRequest( 'POST', '/ajax/LoginUser/', {
					success: function( o ){
						
						// User Login Success
						if ( o.responseText == '1' ){
							window.location.reload();
							return false;
							
						// User Login Failure
						} else {
							
							html += '<div class="loginform">';
							html += '<span class="textfield">' + o.responseText + '</span>';
							html += '</div>';
							
							html += '<div id="LoginStatus" class="actions">';
							html += '<a class="grey" href="javascript:Login();" title="Try Again">Try Again</a>';
							html += '</div>';
										
							html += '<div class="forgotten">';
							html += '<a href="/remind/" title="Forget Login?">Forget Login?</a>';
							html += '</div>';
							
							YAHOO.util.Dom.get('Modal').innerHTML = html;
							
							// Submits Form On 'Enter' Key Press
							var enterPressed = function( e ){
								Login();
							};
							
							// Enables Key Listener On 'Enter'
							if ( typeof( listenForEnter ) != 'undefined' ){
								listenForEnter.disable();
							}
							listenForEnter = new YAHOO.util.KeyListener( document,
								{ keys:13 },
								{ fn:enterPressed }
							);
							listenForEnter.enable();
							
						}
					}
				}, params );
				
			}
		
		// User Requests 'Login' Form
		} else {
			
			html += '<div class="loginform">';
			html += '<span class="textfield">Username: <input id="LoginUsername" type="text" value="" maxlength="100" /></span>';
			html += '<span class="textfield">Password: <input id="LoginPassword" type="password" value="" maxlength="100" /></span>';
			html += '<span class="checkbox"><input id="LoginRemember" type="checkbox" /> Remember Me</span>';
			html += '</div>';
					
			html += '<div id="LoginStatus" class="actions">';
			html += '<a class="grey" href="javascript:Login(\'login\');" title="Login">Login</a>';
			html += '<a class="grey" href="/join/" title="Join GrindTV">Join GrindTV</a>';
			html += '</div>';
					
			html += '<div class="forgotten">';
			html += '<a href="/remind/" title="Forget Login?">Forget Login?</a>';
			html += '</div>';
			
			YAHOO.util.Dom.get('Modal').innerHTML = html;
			YAHOO.util.Dom.get( 'LoginUsername' ).focus();
			
			// Submits Form On 'Enter' Key Press
			var enterPressed = function( e ){
				Login('login');
			};
			
			// Enables Key Listener On 'Enter'
			if ( typeof( listenForEnter ) != 'undefined' ){
				listenForEnter.disable();
			}
			listenForEnter = new YAHOO.util.KeyListener( document,
				{ keys:13 },
				{ fn:enterPressed }
			);
			listenForEnter.enable();
			
		}
	}
	
	/****************************************
	**
	**	Friend Actions
	**
	****************************************/
	
	/**
	*
	*	Adds User Friend Request
	*	@lib YUI
	*	@param int id Friend ID
	*	@return void
	*
	*/
	function AddFriend(id) {
		var params = 'action=Add&id='+id;
		YAHOO.util.Connect.asyncRequest('POST', '/ajax/Friends/', {
			success: function(o) {
				if (o.responseText == "3") {
					if (YAHOO.util.Dom.get('FriendStatus')) {
						YAHOO.util.Dom.get('FriendStatus').innerHTML = '<a class="grey" href="/inbox/#Sent/FriendRequests" style="color:#000000;" title="View My Sent Friend Requests">Request Pending</a>';
					}
				}
				Alert(o.responseText);
			}
		}, params);
	}
	
	/**
	*
	*	Deletes A User's Friend
	*	@lib YUI
	*	@param int id Friend ID
	*	@return void
	*
	*/
	function DeleteFriend(id) {
		var params = 'action=Delete&id='+id;
		YAHOO.util.Connect.asyncRequest('POST', '/ajax/Friends/', {
			success: function(o) {
				if (o.responseText == "1") {
					YAHOO.util.Dom.get('FriendStatus').innerHTML = '<a class="grey" href="javascript:AddFriend(' + id + ');" style="color:#000000;" title="Add To Friends">Add To Friends</a>';
				}
				Alert(o.responseText);
			}
		}, params);
	}
    
    /****************************************
    **
    **  Meta Actions
    **
    ****************************************/
    
    /**
    *
    *    Adds User As A Fan
    *    @lib YUI
    *    @param int type Type ID
    *    @param int id ID
    *    @return void
    *
    */
    function FanOf(type, id) {
        var params = 'fType=FanOf';
            params += '&add=1';
            params += '&type='+type;
            params += '&id='+id;
        if (VIEWER_ID == '') {
            Login();
        } else {
            YAHOO.util.Connect.asyncRequest('POST', '/ajax/Modify/', {
                success: function(o) {
                    if (o.responseText == '53') {
                        if (YAHOO.util.Dom.get('BecomeAFan')) {
                            YAHOO.util.Dom.get('BecomeAFan').firstChild.innerHTML = '<img height="30" width="157" border="0" alt="You\'re a Fan" src="http://images.grindtv.com/images/1/images/base/athletes/fan_button.gif"/>';                        
                        }
                        if (YAHOO.util.Dom.get('TopProfileFanText')) {
                            YAHOO.util.Dom.get('TopProfileFanText').innerHTML = '<span id="TopProfileFanText"><span class="fanText">Already a Fan</span></span>';
                        }
                        if (YAHOO.util.Dom.get('FansModuleFanText')) {
                            YAHOO.util.Dom.get('FansModuleFanText').innerHTML = '';
                        }
                        if (YAHOO.util.Dom.get('Fans') || YAHOO.util.Dom.get('FanPage')) {
                            var num = ((YAHOO.util.Dom.get('Fans'))?'9':'40');
                            YAHOO.util.Connect.asyncRequest('POST', '/ajax/GetFans/', {
                                success: function(o2) {
                                    if (o2.responseText.indexOf('NO_') != 1) {
                                        YAHOO.util.Dom.get('FanBody').innerHTML = o2.responseText;
                                    }
                                }
                            }, params+'&num='+num);
                        }
                    }
                    Alert(o.responseText);
                }
            }, params);
        }
    }
    
    /**
    *
    *    Shows 'Suggest Data' Form
    *    @lib YUI
    *    @param int type Type ID
    *    @param int id ID
    *    @param string field Field Value
    *    @param string input Input Type
    *    @param string label Display Label
    *    @return void
    *
    */
    function ShowSuggestDataForm(type, id, field, input, label) {
        
        // Sets 'Date' Suggestion Form
        var form = '';
        if (input == 'date') {
            var months = new Array(
                'January', 
                'February', 
                'March',
                'April',
                'May',
                'June',
                'July',
                'August',
                'September',
                'October',
                'November',
                'December'
            );
            form += '<h2>';
            form += '<select id="SuggestMonth">';
            form += '<option value=""></option>';
            for (var i=0; i<months.length; i++) {
                form += '<option value="'+(i+1)+'">'+months[i]+'</option>';
            }
            form += '</select>';
            form += '&nbsp;';
            form += '<select id="SuggestDay">';
            form += '<option value=""></option>';
            for (var i=1; i<=31; i++) {
                form += '<option value="'+i+'">'+i+'</option>';
            }
            form += '</select>';
            form += '&nbsp;';
            form += '<select id="SuggestYear">';
            form += '<option value=""></option>';
            for (var i=2008; i>1900; i--) {
                form += '<option value="'+i+'">'+i+'</option>';
            }
            form += '</select>';
            form += '</h2>';
            width = 250;
            height = 125;
        
        // Sets 'Location' Suggestion Form   
        } else if (input == 'location') {
            form += '<h2>';
            form += '<input id="SuggestCity" type="text" value="" maxlength="100" style="width:100px;" />';
            form += '&nbsp;';
            form += '<select id="SuggestState">';
            form += '<option value=""></option>';
            for (var i=0; i<states.length; i++) {
                form += '<option value="'+states[i][0]+'">'+states[i][1]+'</option>';
            }
            form += '</select>';
            form += '&nbsp;';
            form += '<select id="SuggestCountry">';
           for (var i=0; i<countries.length; i++) {
                form += '<option value="'+countries[i][0]+'">'+countries[i][1]+'</option>';
            }
            form += '</select>';
            form += '</h2>';
            width = 415;
            height = 125;
            
        // Sets Default Suggestion Form
        } else {
            form = '<h2><input id="SuggestText" type="text" value="" maxlength="100" style="width:250px;" /></h2>';
            width = 275;
            height = 125;
        }
        
        if (VIEWER_ID == '') {
            Login();
        } else {
            
            // Creates Modal (iFrame Protected)
            CreateModal(width, height);
            
            var html = '<div class="close"><a href="javascript:DestroyModal();" title="Close">x</a></div>';
                html += '<h1>Suggest:</h1>';
                html += '<h2>'+label+'</h2>';
                html += form;
                html += '<div class="actions"><a class="grey" href="javascript:SuggestData('+type+','+id+',\''+field+'\',\''+input+'\');" title="Suggest">Suggest</a></div>';
            YAHOO.util.Dom.get('Modal').innerHTML = html;
        }
    }
    
    /**
    *
    *    Suggests Missing Meta
    *    @lib YUI
    *    @param int type Type ID
    *    @param int id ID
    *    @param string field Field Value
    *    @param string input Input Type
    *    @return void
    *
    */
    function SuggestData(type, id, field, input) {
        if (VIEWER_ID == '') {
            Login();
        } else {
            
            var params = 'type='+type;
                params += '&id='+id;
                params += '&field='+field;
                
            if (input == 'date') {
                var month = YAHOO.util.Dom.get('SuggestMonth').value;
                var day = YAHOO.util.Dom.get('SuggestDay').value;
                var year = YAHOO.util.Dom.get('SuggestYear').value;
                params += '&month='+month;
                params += '&day='+day;
                params += '&year='+year;
            } else if (input == 'location') {
                var city = YAHOO.util.Dom.get('SuggestCity').value;
                var state = YAHOO.util.Dom.get('SuggestState').value;
                var country = YAHOO.util.Dom.get('SuggestCountry').value;
                params += '&city='+city;
                params += '&state='+state;
                params += '&country='+country;
            } else {
                var suggestion = YAHOO.util.Dom.get('SuggestText').value;
                params += '&suggestion='+suggestion;
            }  
            
            YAHOO.util.Connect.asyncRequest('POST', '/ajax/meta.SuggestData.php', {
                success: function(o) {
                    if (o.responseText == 1) {
                        window.location.reload(); 
                    } else {
                        Alert(0);
                    }
                }
            }, params);
        }
    }
	
	/****************************************
	**
	**	Global Tagging
	**
	****************************************/
	
	/**
	*
	*	Tagging Functionality (Action = Get/Search/Add/Delete/Hide)
	*	@lib YUI
	*	@param string action Action To Be Taken (get/search/add/delete/focus/blur/hide)
	*	@param int base Base Type
	*	@param int bid Base ID
	*	@param string word Tag Word To Be Added
	*	@return void
	*
	*	@var int hideTimer Timer Set To Hide Tagging Dropdown After One Second Of Inactivity
	*
	*/
	var hideTimer = 0;
	function Tag( action, base, bid, word ){
		var legalChars = /^[a-zA-Z0-9 \-\'\"\\]+$/;
		var eAddTag = YAHOO.util.Dom.get( "AddTag" );
		var eTags = YAHOO.util.Dom.get( "Tags" );
		var eSuggestions = YAHOO.util.Dom.get( "Suggestions" );
		if ( eAddTag && action == "focus" ){
			if ( eAddTag.value == "" || eAddTag.value == "Type Tag Here" ){
				eAddTag.style.color = "#000000";
				eAddTag.value = "";
			}
		} else if ( eAddTag && action == "blur" ){
			if ( eAddTag.value == "" || eAddTag.value == "Type Tag Here" ){
				eAddTag.style.color = "#999999";
				eAddTag.value = "Type Tag Here";
				Tag( "hide" );
			} else {	
				clearTimeout( hideTimer );
				hideTimer = setTimeout( 'Tag("hide")', 1000 );
			}
		} else if ( action == "hide" ){
			eSuggestions.style.display = "none";
		} else if (( legalChars.test( word ) || action == "get" || action == "hide" ) && word != "Type Tag Here" ){
			var params = 'action=' + action + '&base=' + base + '&bid=' + bid + '&word=' + escape( word );
			YAHOO.util.Connect.asyncRequest( 'POST', '/ajax/Tag/', {
				success: function( o ){
					if ( action == "get" ){
						YAHOO.util.Dom.get( "Tags" ).innerHTML = o.responseText;
						if ( eAddTag ){
							eAddTag.style.color = "#999999";
							eAddTag.value = "Type Tag Here";
							eSuggestions.innerHTML = "";
							eSuggestions.style.display = "none";
						}
					} else if ( action == "search" ){
						if ( o.responseText != "" ){
							eSuggestions.style.display = "block";
							eSuggestions.innerHTML = o.responseText;
						} else {
							eSuggestions.style.display = "none";
						}
					} else if ( action == "add" || action == "delete" ){
						if ( action == "add" && o.responseText == "-1" ){
							eSuggestions.style.display = "block";
							eSuggestions.innerHTML = '<div class="suggestion">Tag already exists!</div>';
						} else if ( action == "add" && o.responseText == "-3" ){
							eSuggestions.style.display = "block";
							eSuggestions.innerHTML = '<div class="suggestion">Censored words prohibited!</div>';
						} else {
							Tag( "get", base, bid, "" );
							eAddTag.value = "";
							eSuggestions.style.display = "none";				
						}
					}
				}
			}, params );
		} else if ( word != "" && word != "Type Tag Here" ){
			eSuggestions.style.display = "block";
			eSuggestions.innerHTML = '<div class="suggestion">Letters/numbers/spaces only!</div>';
		}
	}
	
	/****************************************
	**
	**	Commenting (REWORK REQUIRED)
	**
	****************************************/

function GetComments( type, id, data, page ){
	if ( typeof( page ) == 'undefined' ){
		page = 1;
	}
	var url = '/ajax/Comments/';
	var params = 'base=' + type + '&bid=' + id + '&page=' + page;
	
	if ( type == 8 ){
		var html = '<div id="Comments" class="box">';
			html += '<div class="header">';
			html += '<h1><span>Comments</span></h1>';
			html += '</div>';
			html += '<div class="body">';
			html += '<center>Loading Comments...</center>';
			html += '<div class="lock"></div>';
			html += '</div>';
			html += '<div class="footer" />';
			html += '</div>';
	} else {
		var html = 'Loading Comments...';	
	}
	
	YAHOO.util.Dom.get( "CommentHolder" ).innerHTML = html;
	YAHOO.util.Connect.asyncRequest( 'POST', url, {
		success: function( o ){
			YAHOO.util.Dom.get( "CommentHolder" ).innerHTML = o.responseText;
            ShowUserActions();
		},
		failure: function( o ){
			YAHOO.util.Dom.get( "CommentHolder" ).innerHTML = "Comment Load Error";
		}
	}, params );
}
function Comment( action, base, bid, type, id ){
	var params = 'action=get';
		params += (( base ) ? '&base=' + base : '' );
		params += (( bid ) ? '&bid=' + bid : '' );
		params += (( type ) ? '&type=' + type : '' );
		params += (( id ) ? '&id=' + id : '' );
	try {
		get_flash_movie().fl_pause(); 
	} catch( e ){}
	CreateModal( 400, 150 );
	
	// Builds Add Comment/Reply Modal HTML
	if ( action == 'add' ){ 
		var label = (( type == "7" ) ? "Reply" : "Comment" );
		var html = '<div class="close"><a href="javascript:DestroyModal();" title="Close">x</a></div>';
			html += '<h1>Add ' + label  + '</h1>';
			html += '<input id="Comment_Action" name="action" type="hidden" value="' + action + '" />';
			html += '<input id="Comment_Base" name="base" type="hidden" value="' + base + '" />';
			html += '<input id="Comment_BaseID" name="bid" type="hidden" value="' + bid + '" />';
			html += '<input id="Comment_TypeID" name="type_id" type="hidden" value="' + type + '" />';
			html += '<input id="Comment_AssociationID" name="id" type="hidden" value="' + id + '" />';
			html += '<textarea id="Comment_Description" name="description" onkeyup="AdjustCount( this, 2000, \'Count\', false );"></textarea>';
			html += '<div id="Count">2000 characters left. 2000 total. (No HTML Allowed)</div>';
			html += '<div id="CommentActions" class="actions" style="display:block;"><a class="grey" href="javascript:ModifyComments();" title="Add ' + label + '">Add ' + label + '</a><a class="grey" href="javascript:DestroyModal();" title="Okay">Cancel</a></div>';
			html += '<div id="CommentMessage" class="actions" style="display:none;"><b>Adding ' + label + '... &nbsp;</b></div>';
			
		YAHOO.util.Dom.get('Modal').innerHTML = html;
		YAHOO.util.Dom.get('Comment_Description').focus();
	}
}
function ModifyComments(){
	var base 		= YAHOO.util.Dom.get( 'Comment_Base' ).value;
	var bid 		= YAHOO.util.Dom.get( 'Comment_BaseID' ).value;
	var action 		= YAHOO.util.Dom.get( 'Comment_Action' ).value;
	var type_id 	= YAHOO.util.Dom.get( 'Comment_TypeID' ).value;
	var id 			= YAHOO.util.Dom.get( 'Comment_AssociationID' ).value;
	var description = YAHOO.util.Dom.get( 'Comment_Description' ).value;
	var url = '/ajax/Comments/';
	var params = 'base=' + base 
		+ '&bid=' + bid 
		+ '&action=' + action 
		+ '&type_id=' + type_id 
		+ '&id=' + id 
		+ '&description=' + description;
	Display( YAHOO.util.Dom.get( 'CommentActions' ));
	Display( YAHOO.util.Dom.get( 'CommentMessage' ));
	YAHOO.util.Connect.asyncRequest( 'POST', url, {
		success: function( o ){
			YAHOO.util.Dom.get( 'CommentHolder' ).innerHTML = o.responseText;
			DestroyModal();
			ShowUserActions();
		}
	}, params );
}

	/**
	*
	*	Deletes Comment
	*	@lib YUI
	*	@param int base Item Base Type
	*	@param int bid Item Base ID
	*	@param int id User ID
	*	@return void
	*
	*/
	function DeleteComment(base, bid, id) {
		if (confirm('Are you sure you wish to delete this comment?')) {
			var url = '/ajax/Comments/';
			var params = 'base='+base+'&bid='+bid+'&action=delete&id='+id;
			YAHOO.util.Connect.asyncRequest('POST', url, {
				success: function(o) {
					YAHOO.util.Dom.get('CommentHolder').innerHTML = o.responseText;
                    if (base == 6) {
                        if (YAHOO.util.Dom.get('fType') && YAHOO.util.Dom.get('fType').value == "MyBlog/Comments") {
                            Editor('MyBlog/Comments');
                            GetHTML('BlogComments');
                            Alert(1);
                        }
                    }
					ShowUserActions();
				}
			}, params);
		}
	}
	
	/**
	*
	*	Displays 'Add Comment'/'Login' Modal
	*	@param int type Type ID
	*	@param int id Association ID
	*	@return void
	*
	*/
	function DisplayComment(type, id) {
		if (getCookie('userID')) {
			Comment('add', type, id, type, id);
		} else {
			Login();	
		}
	}
	
	/**
	*
	*	Displays 'Add Reply'/'Login' Modal
	*	@param int type Type ID
	*	@param int id Association ID
	*	@param int comment Comment ID
	*	@return void
	*
	*/
	function DisplayReply(type, id, comment) {
		if (getCookie('userID')) {
			Comment('add', type, id, 7, comment);
		} else {
			Login();	
		}
	}

	/****************************************
	**
	**	Displays User Actions Based On Object Ownership
	**
	****************************************/

	/**
	*
	*	Displays 'North' Position If Ad Available
	*	@return void
	*
	*/
	function ShowNorthAdIfAvailable() {
		if (YAHOO.util.Dom.get('ContainsBANNER')) {
			var re = new RegExp('<!-- SpaceID=[0-9]+ loc=N noad -->'); 
			if (!YAHOO.util.Dom.get('ContainsBANNER').innerHTML.match(re)) {
				YAHOO.util.Dom.get('ContainsBANNER').style.display = 'block';
			}
		}
	}

	/**
	*
	*	Toggles User Actions If Viewer Is Owner
	*	@return void
	*
	*/
	function ShowUserActions() {		
		var userID = getCookie('userID');
		if (userID) {
			var items = YAHOO.util.Dom.getElementsByClassName('ShowActions', 'span');
			for (var i=0; i<items.length; i++) {
				var id = items[i].id;
				var parts = id.split('_');
				if (parts[1] == userID || parts[2] == userID) {
					if (YAHOO.util.Dom.get(id).style.display) {
						YAHOO.util.Dom.get(id).style.display = 'inline';
					} else {
						YAHOO.util.Dom.get(id).style.visibility = 'visible';
					}
				}
			}
            var items = YAHOO.util.Dom.getElementsByClassName('ShowActions', 'div');
            for (var i=0; i<items.length; i++) {
                var id = items[i].id;
                var parts = id.split('_');
                if (parts[1] == userID || parts[2] == userID) {
                    if (YAHOO.util.Dom.get(id).style.display) {
                        YAHOO.util.Dom.get(id).style.display = 'inline';
                    } else {
                        YAHOO.util.Dom.get(id).style.visibility = 'visible';
                    }
                }
            }
		}
	}
	
	/**
	*
	*	Gets User Cookie Information
	*	@param string value Cookie Value (userID, username)
	*	@return string
	*
	*/
	function getCookie(value) {
		if (document.cookie.length > 0) {
			startC = document.cookie.indexOf('uid=');
			if (startC != -1) {
				startC += 4;
				endC = document.cookie.indexOf(';', startC);
				if (endC == -1) {
					endC = document.cookie.length;
				}
				cookie = unescape(document.cookie.substring(startC, endC));
				parts = cookie.split('~', 2);
				if (value == 'userID') {
					return parts[0];
				} else if (value == 'username') {
					return parts[1];
				}
			}
		}
		return null;
	}
	
	/****************************************
	**
	**	Advertising (Yahoo Integration)
	**
	****************************************/
	
	/**
	*
	*	Refreshes Banner Ad Position Every 60 Seconds
	*	@lib YUI
	*	@return void
	*
	*	@param object banner_timer Timeout Object
	*
	*/
	var yahoo_banner_timer;
	function refresh_yahoo_banner() {
		if ( YAHOO.util.Dom.get('ContainsBANNER')) {
			
			// Google Analytics AJAX Ad Tracking
			pageTracker._trackPageview('/ajax/ad/BANNER/'+yahoo_ad_p);
			
			// Removes Orphaned Expandable Ads
			try {
				KillOrphanedAd();
			} catch (e) {}
			
			// Loads iFrame That Will Fetch Ad
			YAHOO.util.Dom.get('ContainsBANNER').innerHTML = '<iframe src="http://pn1.adserver.yahoo.com/a?f='+yahoo_ad_f+'&pn=grindtv&p='+yahoo_ad_p+'&l=N&c=sh&bg=000000" width="728" height="90" allowtransparency="true" wmode="transparent" marginwidth="0" marginheight="0" hspace="0" vspace="0" frameborder="0" scrolling="no"></iframe>';
			
			// Restarts Timer
			clearTimeout(yahoo_banner_timer);
			yahoo_banner_timer = setTimeout('refresh_yahoo_banner();', 40000);
			
		}
	}

	/**
	*
	*	Refreshes LREC Ad Position Every 60 Seconds
	*	@lib YUI
	*	@return void
	*
	*	@param object ad_timer Timeout Object
	*
	*/
	var yahoo_lrec_timer;
	function refresh_yahoo_lrec() {
		if (YAHOO.util.Dom.get('ContainsLREC')) {
			
			// Google Analytics AJAX Ad Tracking
			pageTracker._trackPageview('/ajax/ad/LREC/'+yahoo_ad_p);
			      
			// Removes Orphaned Expandable Ads
			try {
				KillOrphanedAd();
			} catch (e) {}
            
            seededCampaign = false;             
            if (typeof(current_video) != 'undefined') {
                seededCampaign = getSeededAd('LREC', current_video);
            }   
			
            // Loads Seeded iFrame
            if (seededCampaign == false) {
                YAHOO.util.Dom.get('ContainsLREC').innerHTML = '<iframe src="http://pn1.adserver.yahoo.com/a?f='+yahoo_ad_f+'&pn=grindtv&p='+yahoo_ad_p+'&l=LREC&c=sh&bg=000000" width="300" height="250" allowtransparency="true" wmode="transparent" marginwidth="0" marginheight="0" hspace="0" vspace="0" frameborder="0" scrolling="no"></iframe>';
            } else {
                YAHOO.util.Dom.get('ContainsLREC').innerHTML = '<iframe src="/ads/seeded.php?campaign='+seededCampaign+'" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" allowtransparency="true" wmode="transparent"></iframe>';
            }
			     
			// Restarts Timer
			clearTimeout(yahoo_lrec_timer);
			yahoo_lrec_timer = setTimeout("refresh_yahoo_lrec();", 40000);
			
		}
	}

	/**
	*
	*	Refreshes SKY Ad Position Every 60 Seconds
	*	@lib YUI
	*	@return void
	*
	*	@param object sky_timer Timeout Object
	*
	*/
	var yahoo_sky_timer;
	function refresh_yahoo_sky() {
		if (YAHOO.util.Dom.get('SKY')) {
			YAHOO.util.Dom.get('SKY').style.display = 'block';
		}
		if (YAHOO.util.Dom.get('ContainsSKY')) {
			
			// Google Analytics AJAX Ad Tracking
			pageTracker._trackPageview('/ajax/ad/SKY/'+yahoo_ad_p);
			
			// Removes Orphaned Expandable Ads
			try {
				KillOrphanedAd();
			} catch (e) {}
			
			// Loads iFrame That Will Fetch Ad
			YAHOO.util.Dom.get('ContainsSKY').innerHTML = '<iframe src="http://pn1.adserver.yahoo.com/a?f='+yahoo_ad_f+'&pn=grindtv&p='+yahoo_ad_p+'&l=SKY&c=sh&bg=000000" width="160" height="600" allowtransparency="true" wmode="transparent" marginwidth="0" marginheight="0" hspace="0" vspace="0" frameborder="0" scrolling="no"></iframe>';
			
			// Restarts Timer
			clearTimeout(yahoo_sky_timer);
			yahoo_sky_timer = setTimeout('refresh_yahoo_sky();', 40000);
			
		}
	}
	
	/**
	*
	*	Refreshes HLREC Ad Position Every 60 Seconds
	*	@lib YUI
	*	@return void
	*
	*	@param object hlrec_timer Timeout Object
	*
	*/
	var hlrec_timer;
	function refresh_hlrec() {
        YAHOO.util.Dom.get('ContainsHLREC').style.display = 'none';
		if ( YAHOO.util.Dom.get('ContainsHLREC')) {
		
			// Google Analytics AJAX Ad Tracking
			pageTracker._trackPageview('/ajax/ad/HLREC/'+ad_category);
			
			// Removes Orphaned Expandable Ads
			try {
				KillOrphanedAd();
			} catch (e) {}
			
			// Loads iFrame That Will Fetch Ad
			YAHOO.util.Dom.get('ContainsHLREC').innerHTML = '<iframe src="http://www.purevideo.com/ads/banner.php?s=1&pos=HLREC&cat='+ad_category+'" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" allowtransparency="true" wmode="transparent"></iframe>';
			
			// Restarts Timer
			clearTimeout(hlrec_timer);
			hlrec_timer = setTimeout('refresh_hlrec();', 40000);
			
		}
	}
	
	/**
	*
	*	Refreshes Tracking Pixel Every 60 Seconds
	*	@lib YUI
	*	@return void
	*
	*	@param object pixel_timer Timeout Object
	*
	*/
	var pixel_timer;
	function refresh_pixel() {
		if (YAHOO.util.Dom.get('ContainsPixel')) {
			
			// Loads Impression Pixel HTML Into Div
			YAHOO.util.Dom.get('ContainsPixel').innerHTML = pixel_html;
			
			// Restarts Timer
			clearTimeout(pixel_timer);
			pixel_timer = setTimeout('refresh_pixel();', 40000);
			
		}
	}
	
	/**
	*
	*	Hides Any Ads Busted Out Of IFrame (Orphaned By Ad Refresh)
	*	@return void
	*
	*/
	function KillOrphanedAd() {
		
		// Loops Thru All Body Child Nodes
		var nodes = document.getElementById('Body').childNodes;
		for (var i=0; i<nodes.length; i++) {
			
			// Searches For Unknown IDs
			var id = nodes[i].id;
			if (!(id == 'Modal' || id == 'PageCover' || id == 'global_cntr')) {
				
				// Attempts To Hide Unknown Elements
				try {
					if (nodes[i].nodeName.toLowerCase() == 'span' && nodes[i].style) {
						nodes[i].style.display = 'none';
					}
				} catch (e) {}
			}
		}
	}
    
    /**
    *
    *   Gets Seeded Ad Campaign
    *   @param string pos Ad Position
    *   @param int id Association ID
    *   @return string/boolean Returns Campaign Or Not Found
    *
    */
    function getSeededAd(pos, id) {
        var found = false;
        if (seededAds) {
            for (var i=0; i<seededAds.length; i++) {
                if (typeID == seededAds[i][0] && pos == seededAds[i][1] && id == seededAds[i][2]) {
                    found = seededAds[i][3];
                    break;
                }
            }
        }
        return found;
    }
    
    /**
    *
    *   Hides Ad Overlay
    *   @return void
    *
    */
    function hideOverlay() {
        if (document.getElementById("Overlay") && document.getElementById("OverlayFlash")) {
            document.getElementById("Overlay").removeChild(document.getElementById("OverlayFlash"));
        }
    }
	
	/****************************************
	**
	**	Yahoo Sports Navigation
	**
	****************************************/
    
    /**
    *
    *    Shows Yahoo Navigation Menu
    *    @return void 
    *
    */
    function ShowYahooNav() {
        YAHOO.util.Dom.get('nav_yahooSports').src = 'http://images.grindtv.com/images/1/images/nav/nav_yahooSports_on.gif';
        YAHOO.util.Dom.get('yahooNav').style.display = 'block';
    }
    
    /**
    *
    *    Hides Yahoo Navigation Menu
    *    @return void 
    *
    */
    function HideYahooNav() {
        YAHOO.util.Dom.get('nav_yahooSports').src = 'http://images.grindtv.com/images/1/images/nav/nav_yahooSports_off.gif';
        YAHOO.util.Dom.get('yahooNav').style.display = 'none';
    }
    
    /****************************************
    **
    **    Administration
    **
    ****************************************/
    
    /**
    *
    *    Executes General Administration AJAX Call
    *    @lib YUI
    *    @param string url URL String
    *    @param string params GET Parameters
    *    @return void
    *
    */
    function Execute(url, params) {
        if (confirm('Are you sure you wish to perform this function?')) {
            YAHOO.util.Connect.asyncRequest('GET', url+'?'+params, {
                success: function(o) {
                    Alert(o.responseText);
                }
            });
        }
    }

	/****************************************
	**
	**	Third-Party Functions
	**
	****************************************/

	/**
	*
	*  MD5 (Message-Digest Algorithm)
	*  http://www.webtoolkit.info/
	*
	**/
	var MD5 = function (string) {
	
		function RotateLeft(lValue, iShiftBits) {
			return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
		}
	
		function AddUnsigned(lX,lY) {
			var lX4,lY4,lX8,lY8,lResult;
			lX8 = (lX & 0x80000000);
			lY8 = (lY & 0x80000000);
			lX4 = (lX & 0x40000000);
			lY4 = (lY & 0x40000000);
			lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
			if (lX4 & lY4) {
				return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
			}
			if (lX4 | lY4) {
				if (lResult & 0x40000000) {
					return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
				} else {
					return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
				}
			} else {
				return (lResult ^ lX8 ^ lY8);
			}
		 }
	
		 function F(x,y,z) { return (x & y) | ((~x) & z); }
		 function G(x,y,z) { return (x & z) | (y & (~z)); }
		 function H(x,y,z) { return (x ^ y ^ z); }
		function I(x,y,z) { return (y ^ (x | (~z))); }
	
		function FF(a,b,c,d,x,s,ac) {
			a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
			return AddUnsigned(RotateLeft(a, s), b);
		};
	
		function GG(a,b,c,d,x,s,ac) {
			a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
			return AddUnsigned(RotateLeft(a, s), b);
		};
	
		function HH(a,b,c,d,x,s,ac) {
			a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
			return AddUnsigned(RotateLeft(a, s), b);
		};
	
		function II(a,b,c,d,x,s,ac) {
			a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
			return AddUnsigned(RotateLeft(a, s), b);
		};
	
		function ConvertToWordArray(string) {
			var lWordCount;
			var lMessageLength = string.length;
			var lNumberOfWords_temp1=lMessageLength + 8;
			var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
			var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
			var lWordArray=Array(lNumberOfWords-1);
			var lBytePosition = 0;
			var lByteCount = 0;
			while ( lByteCount < lMessageLength ) {
				lWordCount = (lByteCount-(lByteCount % 4))/4;
				lBytePosition = (lByteCount % 4)*8;
				lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
				lByteCount++;
			}
			lWordCount = (lByteCount-(lByteCount % 4))/4;
			lBytePosition = (lByteCount % 4)*8;
			lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
			lWordArray[lNumberOfWords-2] = lMessageLength<<3;
			lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
			return lWordArray;
		};
	
		function WordToHex(lValue) {
			var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
			for (lCount = 0;lCount<=3;lCount++) {
				lByte = (lValue>>>(lCount*8)) & 255;
				WordToHexValue_temp = "0" + lByte.toString(16);
				WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
			}
			return WordToHexValue;
		};
	
		function Utf8Encode(string) {
			string = string.replace(/\r\n/g,"\n");
			var utftext = "";
	
			for (var n = 0; n < string.length; n++) {
	
				var c = string.charCodeAt(n);
	
				if (c < 128) {
					utftext += String.fromCharCode(c);
				}
				else if((c > 127) && (c < 2048)) {
					utftext += String.fromCharCode((c >> 6) | 192);
					utftext += String.fromCharCode((c & 63) | 128);
				}
				else {
					utftext += String.fromCharCode((c >> 12) | 224);
					utftext += String.fromCharCode(((c >> 6) & 63) | 128);
					utftext += String.fromCharCode((c & 63) | 128);
				}
	
			}
	
			return utftext;
		};
	
		var x=Array();
		var k,AA,BB,CC,DD,a,b,c,d;
		var S11=7, S12=12, S13=17, S14=22;
		var S21=5, S22=9 , S23=14, S24=20;
		var S31=4, S32=11, S33=16, S34=23;
		var S41=6, S42=10, S43=15, S44=21;
	
		string = Utf8Encode(string);
	
		x = ConvertToWordArray(string);
	
		a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
	
		for (k=0;k<x.length;k+=16) {
			AA=a; BB=b; CC=c; DD=d;
			a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
			d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
			c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
			b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
			a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
			d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
			c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
			b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
			a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
			d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
			c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
			b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
			a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
			d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
			c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
			b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
			a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
			d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
			c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
			b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
			a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
			d=GG(d,a,b,c,x[k+10],S22,0x2441453);
			c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
			b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
			a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
			d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
			c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
			b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
			a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
			d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
			c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
			b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
			a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
			d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
			c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
			b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
			a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
			d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
			c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
			b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
			a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
			d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
			c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
			b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
			a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
			d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
			c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
			b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
			a=II(a,b,c,d,x[k+0], S41,0xF4292244);
			d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
			c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
			b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
			a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
			d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
			c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
			b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
			a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
			d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
			c=II(c,d,a,b,x[k+6], S43,0xA3014314);
			b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
			a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
			d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
			c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
			b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
			a=AddUnsigned(a,AA);
			b=AddUnsigned(b,BB);
			c=AddUnsigned(c,CC);
			d=AddUnsigned(d,DD);
		}
	
		var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
	
		return temp.toLowerCase();
	}
    
    /**
    *
    *  BrowserDetect (Browser Detection)
    *  http://www.quirksmode.org/js/detect.html
    *
    *  Properties:
    *   - BrowserDetect.browser
    *   - BrowserDetect.version
    *   - BrowserDetect.OS
    *
    */
    var BrowserDetect = {
        init: function () {
            this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
            this.version = this.searchVersion(navigator.userAgent)
                || this.searchVersion(navigator.appVersion)
                || "an unknown version";
            this.OS = this.searchString(this.dataOS) || "an unknown OS";
        },
        searchString: function (data) {
            for (var i=0;i<data.length;i++)    {
                var dataString = data[i].string;
                var dataProp = data[i].prop;
                this.versionSearchString = data[i].versionSearch || data[i].identity;
                if (dataString) {
                    if (dataString.indexOf(data[i].subString) != -1)
                        return data[i].identity;
                }
                else if (dataProp)
                    return data[i].identity;
            }
        },
        searchVersion: function (dataString) {
            var index = dataString.indexOf(this.versionSearchString);
            if (index == -1) return;
            return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
        },
        dataBrowser: [
            {
                string: navigator.userAgent,
                subString: "Chrome",
                identity: "Chrome"
            },
            {     string: navigator.userAgent,
                subString: "OmniWeb",
                versionSearch: "OmniWeb/",
                identity: "OmniWeb"
            },
            {
                string: navigator.vendor,
                subString: "Apple",
                identity: "Safari"
            },
            {
                prop: window.opera,
                identity: "Opera"
            },
            {
                string: navigator.vendor,
                subString: "iCab",
                identity: "iCab"
            },
            {
                string: navigator.vendor,
                subString: "KDE",
                identity: "Konqueror"
            },
            {
                string: navigator.userAgent,
                subString: "Firefox",
                identity: "Firefox"
            },
            {
                string: navigator.vendor,
                subString: "Camino",
                identity: "Camino"
            },
            {        // for newer Netscapes (6+)
                string: navigator.userAgent,
                subString: "Netscape",
                identity: "Netscape"
            },
            {
                string: navigator.userAgent,
                subString: "MSIE",
                identity: "Explorer",
                versionSearch: "MSIE"
            },
            {
                string: navigator.userAgent,
                subString: "Gecko",
                identity: "Mozilla",
                versionSearch: "rv"
            },
            {         // for older Netscapes (4-)
                string: navigator.userAgent,
                subString: "Mozilla",
                identity: "Netscape",
                versionSearch: "Mozilla"
            }
        ],
        dataOS : [
            {
                string: navigator.platform,
                subString: "Win",
                identity: "Windows"
            },
            {
                string: navigator.platform,
                subString: "Mac",
                identity: "Mac"
            },
            {
                string: navigator.platform,
                subString: "Linux",
                identity: "Linux"
            }
        ]

    };
    BrowserDetect.init();