// page init

var limit = 20;
var have = 0;
var bAddUserError = false;
var maxitems = 0;

$(function(){
	initSearchEnter();
	initYouTubes();
	initHoverPopups();
	initAjaxLoader();
	initAjaxInputs();
	initCheckboxes();
	initConfirms();
	initLabels();
	initPromoLinks();
	initInfoTriggers();
	initAjaxLinks();
	initSearch();
	initSort();
	initAddUsers();
	initAddUserForm();
	//initInviteSelects();
	
	
	
	// Check hash
	if(document.location.hash.replace('#lm','') != '') {
		newlimit = parseInt(document.location.hash.replace('#lm','')) - limit;
		if(newlimit < 20) {
			limit = 20;
		} else {
			limit = newlimit;
		}
		
		scroll( 0,$('body').innerHeight() );
	}	
	
})

function initAddUserForm() {
	
	$('#emailfiller').click( function() {
		$('#emailfillform').submit();
	});
	
	
	$('#adduserbutton').click( function() {
		
		document.location.href='#';
		
		var iScroll = 0;
		
		// Get pairs
		$('div.friend-box').each( function() {
			var sEmail = '';
			var sUsername = '';
			
			// get email
			$(this).find('input.adduser_email').each( function() {
				sEmail = $(this).attr('value');
			});
			
			// get username
			$(this).find('input.adduser_username').each( function() {
				sUsername = $(this).attr('value');
			});			
			
			var oInput = this;
			$(oInput).find('span.adding').show();
			
			$.ajax({
				  type: 'POST',
				  url: LINKROOT+'/do/company/adduser/',
				  data: {username: sUsername, email: sEmail},
				  dataType: 'html',
				  async: false,
				  success:
					  function (sResponse) {
						if(sResponse != 'OK') {
							// Error
							$(oInput).find('span.erroremail').hide();
							$(oInput).find('span.errorusername').html(sResponse).show();
							$(oInput).find('span.adding').hide();
							iScroll = iScroll+1.5;
							window.scrollBy(0,iScroll);
						} else {
							// Looks good, hide 
							$(oInput).parent().parent().parent().hide();
							
						}
			  }});
					
			
		});
		
		return false;
	});
	
	
}

function initAddUsers() {
	
	
	var _inputs = $('input.adduser');
	
	
	_inputs.each(function(){
		$(this).unbind('change');
		$(this).change( function() {
			if($(this).hasClass('adduser_email')) {
				
				var oInput = this;
				$(this).attr({value: trim($(this).attr('value').toLowerCase())});
				
				
				// Check current input
				var bDbl = false;
				$('input.adduser_email').each( function() {
					if(oInput != this) {
						if($(this).attr('value') == oInput.value) {
							$(oInput).parent().parent().find('span.erroremail').html(t('E-mail already elsewhere used in this form')).show();
							$(oInput).parent().parent().find('input.adduser_username').attr({disabled: true});
							bAddUserError = true;
							bDbl = true;
						}
						
					}
				});

				if(bDbl) {
					return false;
				}
				
				$.ajax({
					  type: 'POST',
					  url: LINKROOT+'/do/company/checkemail/',
					  data: {email: $(this).attr('value')},
					  dataType: 'html',
					  async: false,
					  success:
						  function (sResponse) {
							if(sResponse != 'OK') {
								// Bad e-mail
								
								$(oInput).parent().parent().find('span.erroremail').html(sResponse).show();
								$(oInput).parent().parent().find('input.adduser_username').attr({disabled: true});
								bAddUserError = true;
							} else {
								
								// Good !
								$(oInput).parent().parent().find('span.erroremail').hide();
								
								// Apply e-mail to username
								$(oInput).parent().parent().find('input.adduser_username').each( function() {
									$(this).attr({disabled:false});
									var aParts = $(oInput).attr('value').toLowerCase().split('@');
									$(this).attr({value: aParts[0].replace( /\./g,'')});
									$(this).change();
								}); 

							}
						}
					  
					});

				
				
				
			} else if($(this).hasClass('adduser_username')) {
				var oInput = this;
				
				// Check current input
				var bDbl = false;
				$('input.adduser_username').each( function() {
					if(oInput != this) {
						if($(this).attr('value') == oInput.value) {
							$(oInput).parent().parent().find('span.errorusername').html(t('Username already used elsewhere in this form')).show();
							
							bAddUserError = true;
							bDbl = true;
						}
						
					}
				});

				if(bDbl) {
					return false;
				}
								
				$.ajax({
					  type: 'POST',
					  url: LINKROOT+'/do/company/checkusername/',
					  data: {username: $(this).attr('value')},
					  dataType: 'html',
					  async: false,
					  success:
						  function (sResponse) {
							if(sResponse != 'OK') {
								// Bad username
								$(oInput).parent().parent().find('span.errorusername').html(sResponse).show();
							} else {
								$(oInput).parent().parent().find('span.errorusername').hide();
							}
					  }});
							
			}
		});
	});
}

function initSort() {
	$('#sort').change(function() {
		document.sortform.submit();
	})
}

function initSearch() {
	$('#searchbutton').click( function() {
		$('#searchqry').attr({value: $('#searchquery').attr('value')});
		document.searchfrm.submit();
		return false;
	});
}

function initInviteSelects() {
	$('#service_webmail').change( function() {
		if($(this).attr('value') != '') {
			$('#service_social').attr({disabled: true});
		} else {
			$('#service_social').attr({disabled: false});
		}
	});
	
	$('#service_social').change( function() {
		if($(this).attr('value') != '') {
			$('#service_webmail').attr({disabled: true});
		} else {
			$('#service_webmail').attr({disabled: false});
		}
	});	
}

function initInfoTriggers() {
	$('a.info_trigger').click( function() {
		var target = '#'+this.id.replace('trigger_','info_');
		$(target).slideToggle('fast');
	})
}

function initYouTubes() {
	 $('a.youtube').flash(
		        { allowfullscreen: true, height: 470, width: 900, flashvars: { autoplay:0, rel:0, fs:1, color1: '0x178ACA', color2: '0x178ACA', border: 0, loop:0} },
		        { version: 8, expressInstall: true  },
		        
		        function(htmlOptions) {
		            $this = $(this);
		            htmlOptions.src = $this.attr('href');
		            $this.html($.fn.flash.transform(htmlOptions));						
		        }
		    );	
	 
	 $('a.youtube_home').flash(
		        { allowfullscreen: true, height: 350, width: 620, flashvars: { autoplay:0, rel:0, fs:1, color1: '0x5f6060', color2: '0x5f6060', border: 0, loop:0} },
		        { version: 8, expressInstall: true  },
		        
		        function(htmlOptions) {
		            $this = $(this);
		            htmlOptions.src = $this.attr('href');
		            $this.html($.fn.flash.transform(htmlOptions));						
		        }
		    );		 
	 
	 $('a.youtube_home').attr({href: '#'});
}

function initLabels() {
	$('input.labeled').unbind('click');
	$('input.labeled').focus( function() {
		if($(this).attr('unlabled') != 1) {
			$(this).attr({unlabled: 1, value: ''});
			// Also switch to password?
			if($(this).hasClass('topassword')) {
				$(this).hide();
				var sId = $(this).attr('id').replace('_fake','');
				$('#'+sId).show();
				$('#'+sId).focus();
			}
		}
	});
}

function initConfirms(hold) {
	var _links = $('a.confirm');
	if(hold) _links = hold.find('a.confirm');

	_links.each(function(){
		$(this).click( function() {
			var replace = $(this).attr('href')+'/?lm='+document.location.hash.replace('#lm','');
			$(this).attr({href: replace});
			
			if(confirm(t('Are you sure?'))) {
				return true;
			} else {
				
				return false;
			}
		} );
	});
	
}


function initPromoLinks(hold) {
	var _links = $('a.promoinfo');
	if(hold) _links = hold.find('a.promoinfo');

	_links.each(function(){

		$(this).click( function() {
			
			var target = $(this).attr('id').replace('promoinfo-','popup-holder-');
			$('#'+target+' li').each( function() {
				if(!$(this).hasClass('big')) {
					$(this).hide();
				} else {
					$(this).show();
					$(this).find('input.tiny').focus();
					$(this).find('input.tiny').select();
				}
			});
			
			return false;
		} );
	
	});
	
}

function initCheckboxes() {
	
	$('span.checkbox').each( function() {

		var sCheckbox = this.id.replace('checkbox-span-','');
		if($('#'+sCheckbox).attr('checked') == true) {
			$(this).addClass('checkbox-clicked');
			$('#'+sCheckbox).attr({checked: true});			
		}
		
	} );

	
	
	$('span.checkbox').click( function() {
		var sCheckbox = this.id.replace('checkbox-span-','');
		
		if($(this).hasClass('checkbox-clicked')) {
			$(this).removeClass('checkbox-clicked');
			$('#'+sCheckbox).attr({checked: false});
		} else {
			$(this).addClass('checkbox-clicked');
			$('#'+sCheckbox).attr({checked: true});
		}
		
		
	});
}


// ajax inputs
function initAjaxInputs() {
	var _slideSpeed = 300;
	$('div.ajax-inputs').each(function(){
		var _holder = $(this);
		var _ajaxHolder = _holder.find('div.ajax-inputs-holder');
		var _sample = _ajaxHolder.children().eq(0).clone();
		var _btnAdd = _holder.find('a.btn-add');

		// add inputs
		_btnAdd.click(function(){
			_sample.clone().hide().appendTo(_ajaxHolder).slideDown(_slideSpeed);
			initLabels();
			initAddUsers();
			return false;
		})
	});
}

// ajax loader
function initAjaxLoader() {
	var _delay = 100;
	var _slideSpeed = 500;
	var _loadingClass = 'loading';

	$('div.ajax-loader').each(function(){
		var _timer;
		var _loading = false;
		var _holder = $(this);
		var _target = _holder.attr('title');
		_holder.removeAttr('title');

		function loadItems() {

			
			if( _holder.children().length == maxitems) {
				return false;
			}
			
			
			if(_loading) return;
			_loading = true;
			_holder.addClass(_loadingClass);

			_timer = setTimeout(function(){
				$.ajax({				
					url:_target,
					type:'POST',
					data:'loadedcount='+_holder.children().length+'&limit='+limit,
					success:function(msg) {
						have = (have+limit);
						limit = 20;
						var _scrollTop = $(window).scrollTop();
						var _hold = $('<div>');
						_hold.html(msg);
						_hold.hide().appendTo(_holder);
						initHoverPopups(_hold);
						initAjaxLinks(_hold);
						initConfirms(_hold);
						initPromoLinks(_hold);
						_hold.slideDown(_slideSpeed,function(){
							_hold.children().appendTo(_holder);
							_hold.remove();
							//scrollTo(0, $('body').innerHeight());
							_loading = false;
							_holder.removeClass(_loadingClass);
							document.location.replace('#lm'+ (have));
							
						})
						
					},
					error:function() {
						alert('AJAX Error');
						_loading = false;
						_holder.removeClass(_loadingClass);
					}
				})
			},_delay)
		}

		$('body').bind('bottomscroll',loadItems);
	})

	// page scroll event
	$(window).scroll(function(){
		var current = $(window).scrollTop();
		var limit = ($(document.body).height() - $(window).height());
		limit = limit - 100;
		if(current >= limit) $('body').trigger('bottomscroll');
	})
}


// Function ajaxlinks init
function initAjaxLinks(hold) {
	var _blocks = $('a.ajaxlink');
	if(hold) _blocks = hold.find('a.ajaxlink');
	_blocks.each(function(){
		
		if($(this).hasClass('ajax_unpromote')) {
			$(this).click(ajaxUnpromote);
		}else if($(this).hasClass('ajax_removeconnection')) {
			$(this).click(ajaxRemoveConnection);
		}else if($(this).hasClass('ajax_removeuser')) {
			$(this).click(ajaxRemoveUser);
		}else if($(this).hasClass('ajax_makeadmin')) {
			$(this).click(ajaxMakeAdmin);
		}else if($(this).hasClass('ajax_removeadmin')) {
			$(this).click(ajaxRemoveAdmin);
		}else if($(this).hasClass('ajax_removepromoter')) {
			$(this).click(ajaxRemovePromoter);
		}
		
		
	});
}


function ajaxRemoveConnection() {
	
	if(confirm(t('Are you sure you want to remove this connection from your network?'))) {
		
		$(this).parent().parent().parent().parent().fadeOut('medium');
		have=have-1;
		maxitems=maxitems-1;
		$.get( $(this).attr('href')); 
		return false;
	} else {
		return false;
	}
	

}

function ajaxRemoveUser() {
	
	if(confirm(t('Are you sure you want to remove this entire user from your company account? The entire profile of the user will be deleted!'))) {
		
		$(this).parent().parent().parent().parent().fadeOut('medium');
		have=have-1;
		maxitems=maxitems-1;
		$.get( $(this).attr('href')); 
		return false;
	} else {
		return false;
	}
	

}

function ajaxRemovePromoter() {
	
	if(confirm(t('Are you sure you want to remove this promoter? This cannot be undone.'))) {
		
		$(this).parent().parent().parent().parent().fadeOut('medium');
		have=have-1;
		maxitems=maxitems-1;
		$.get( $(this).attr('href')); 
		return false;
	} else {
		return false;
	}
	

}


function check255field(sField) {
	var iLen = $('#'+sField).attr('value').length;
	var iRemain = 255 - iLen;
	
	if(iLen >= 255) {
		$('#'+sField).attr({value: $('#'+sField).attr('value').substr(0,255)  });
		var iLen = $('#'+sField).attr('value').length;
		var iRemain = 255 - iLen;
		
	}
	
	$('#counter_'+sField+' span').html(iRemain);
}

function ajaxRemoveAdmin() {
	
	if(confirm(t('Are you sure you want to revoke this users permission to manage your company account?'))) {
		
		$(this).parent().find('em').each( function() {
			$(this).hide();
		});
		
		$(this).hide();
		$(this).parent().find('a.ajax_makeadmin').each( function() {
			$(this).show();
		});
		
		$.get( $(this).attr('href')); 
		return false;
	} else {
		return false;
	}
}

function ajaxMakeAdmin() {
	
	if(confirm(t('Are you sure you want to give this user permission to manage your company account?'))) {
		
		$(this).parent().find('em').each( function() {
			$(this).show();
		});
		
		$(this).hide();
		$(this).parent().find('a.ajax_removeadmin').each( function() {
			$(this).show();
		});
		
		$.get( $(this).attr('href')); 
		return false;
	} else {
		return false;
	}
}


function initSearchEnter() {
	$('#searchquery').keypress(function(e) {
	    if(e.keyCode == 13) {
			$('#searchqry').attr({value: $('#searchquery').attr('value')});
			document.searchfrm.submit();
			return false;

	    }
	});

}

function ajaxUnpromote() {
	
	if(confirm(t('Are you sure you want to stop promoting this item?'))) {
		
		if($(this).parent().parent().hasClass('button-list')) {
			$(this).parent().parent().parent().parent().parent().parent().fadeOut('medium');	
		} else {
			$(this).parent().parent().parent().parent().parent().parent().parent().fadeOut('medium');	
		}
	
		have=have-1;
		maxitems=maxitems-1;
		$.get( $(this).attr('href')); 
		return false;
	} else {
		return false;
	}
}


// function popups init
function initHoverPopups(hold) {
	var _animSpeed = ($.browser.msie ? 0 : 300);
	var _delay = 50;
	var _hoverClass = 'popup-hover';
	var _blocks = $('div.grey-box, .box-holder.has-drop');
	if(hold) _blocks = hold.find('div.grey-box, .box-holder.has-drop');

	_blocks.each(function(){
		var _holder = $(this);
		var _popup = _holder.find('div.drop')
		var _opener = _holder.find('a.btn-open, a.button-open');
		var _closer = _holder.find('a.btn-close');
		var _timer;

		if(_popup.length) {
			
			// init
			var _closeFlag = false;

			_popup.hide();
			_holder.removeClass(_hoverClass);

			// stretch overlay if needed
			var _stretch = _holder.find('div.stretch-me');
			var _stretchSize = _holder.find('div.stretch-size');
			if(_stretch.length && _stretchSize.length) _stretch.css({height:_stretchSize.height()})

			
			
			// hover behaviour
			_opener.hover(function(){
				if(!_closeFlag) {
					_timer = setTimeout(function(){
						_holder.addClass(_hoverClass);
						$('a.youtube_home, a.youtube').css({visibility: 'hidden'});
						_popup.fadeIn(_animSpeed);
					},_delay)
				}
			},function(){_closeFlag = false})

			// show/hide popup onclick
			_opener.click(function(){
				if(_timer) clearTimeout(_timer);
				_holder.addClass(_hoverClass);
				_popup.fadeIn(_animSpeed);
				_closeFlag = false;
			})
			_closer.click(function(){
				if(_timer) clearTimeout(_timer);
				_holder.removeClass(_hoverClass);
				_popup.fadeOut(_animSpeed, function() {
					$('a.youtube_home, a.youtube').css({visibility: 'visible'});
					_popup.find('li').each( function() {
						if($(this).hasClass('big')) {
							$(this).hide();
						} else {
							$(this).show();
						}
					
				});
				});
				_closeFlag = true;
				return false;
			})

			// hide popup on mouseout of entire block
			_holder.hover(function(){
			},function(){
				if(_timer) clearTimeout(_timer);
				_timer = setTimeout(function(){
					_holder.removeClass(_hoverClass);
					_popup.fadeOut(_animSpeed,function(){
						$('a.youtube_home, a.youtube').css({visibility: 'visible'});
						_popup.find('li').each( function() {
							if($(this).hasClass('big')) {
								$(this).hide();
							} else {
								$(this).show();
							}
						});						
						_closeFlag = false;
					})
					
				},_delay)
			})
		}
	})
}





function md5 ( str ) {
    // Calculate the md5 hash of a string
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_md5/
    // +       version: 810.112
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // + namespaced by: Michael White (http://getsprink.com)
    // +    tweaked by: Jack
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // -    depends on: utf8_encode
    // *     example 1: md5('Kevin van Zonneveld');
    // *     returns 1: '6e658d4bfcb59cc13f96c14450ac40b9'

    var RotateLeft = function(lValue, iShiftBits) {
        return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
    };

    var AddUnsigned = function(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);
        }
    };

    var F = function(x,y,z) { return (x & y) | ((~x) & z); };
    var G = function(x,y,z) { return (x & z) | (y & (~z)); };
    var H = function(x,y,z) { return (x ^ y ^ z); };
    var I = function(x,y,z) { return (y ^ (x | (~z))); };

    var FF = function(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    var GG = function(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    var HH = function(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    var II = function(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    var ConvertToWordArray = function(str) {
        var lWordCount;
        var lMessageLength = str.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] | (str.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;
    };

    var WordToHex = function(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;
    };

    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;

    str = utf8_encode(str);
    x = ConvertToWordArray(str);
    a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
    
    xl = x.length;
    for (k=0;k<xl;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();
}// }}}

function utf8_encode ( string ) {
    // Encodes an ISO-8859-1 string to UTF-8
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_utf8_encode/
    // +       version: 811.1414
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: sowberry
    // +    tweaked by: Jack
    // +   bugfixed by: Onno Marsman
    // +   improved by: Yves Sucaet
    // +   bugfixed by: Onno Marsman
    // *     example 1: utf8_encode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'

    string = (string+'').replace(/\r\n/g, "\n").replace(/\r/g, "\n");

    var utftext = "";
    var start, end;
    var stringl = 0;

    start = end = 0;
    stringl = string.length;
    for (var n = 0; n < stringl; n++) {
        var c1 = string.charCodeAt(n);
        var enc = null;

        if (c1 < 128) {
            end++;
        } else if((c1 > 127) && (c1 < 2048)) {
            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
        } else {
            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
        }
        if (enc != null) {
            if (end > start) {
                utftext += string.substring(start, end);
            }
            utftext += enc;
            start = end = n+1;
        }
    }

    if (end > start) {
        utftext += string.substring(start, string.length);
    }

    return utftext;
}// }}}


function urlencode( str ) {
    // URL-encodes string
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_urlencode/
    // +       version: 809.1713
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // %          note: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
    // *     example 1: urlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin+van+Zonneveld%21'
    // *     example 2: urlencode('http://kevin.vanzonneveld.net/');
    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
    // *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'
                                     
    var histogram = {}, histogram_r = {}, code = 0, tmp_arr = [];
    var ret = str.toString();
    
    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };
    
    // The histogram is identical to the one in urldecode.
    histogram['!']   = '%21';
    histogram['%20'] = '+';
    
    // Begin with encodeURIComponent, which most resembles PHP's encoding functions
    ret = encodeURIComponent(ret);
    
    for (search in histogram) {
        replace = histogram[search];
        ret = replacer(search, replace, ret) // Custom replace. No regexing
    }
    
    // Uppercase for full PHP compatibility
    return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) {
        return "%"+m2.toUpperCase();
    });
    
    return ret;
}// }}}

function trim(value) {
	  value = value.replace(/^\s+/,'');
	  value = value.replace(/\s+$/,'');
	  return value;
	}
