var MOCA_HOME_ID = 225; var MOCA_BASE_URL = 'https://book.cityfirstaid.co.nz/'; var MOCA_BASE_DIR = '/'; var MOCA_HOME_URL = 'https://book.cityfirstaid.co.nz/home'; var MOCA_BASE_ENTITY = 'Course'; var MOCA_BASE_ENTITYL = 'course'; var MOCA_HOST_ENTITY = 'Trainer'; var MOCA_TICKET_ENTITY = 'Ticket'; var MOCA_TICKET_ENTITYL = 'ticket'; var MOCA_TICKET_HOLDER_ENTITY = 'Student'; var MOCA_TICKET_HOLDER_ENTITYL = 'student'; var MOCA_ROADSHOW_ENTITY = 'Series'; var MOCA_ROADSHOW_ENTITYL = 'series'; var MOCA_USE_MIDDLE_NAME = '1'; var MOCA_USE_TYPES = '1'; var MOCA_USE_QUALS = '1'; var MOCA_USE_CERTS = '1'; var MOCA_USE_ROOMS = ''; var MOCA_ACCESS_LINK_ENTITY = 'Access Link'; var MOCA_SESSION_ORG_ID = '0'; var BR_USE_CLIENT_TZ = ''; var BR_DEFAULT_TZ = 'Pacific/Auckland'; var BR_CURRENT_COUNTRY = {"timezone":"NZDT","currency":"NZD","currency_name":"New Zealand Dollars","currency_symbol":"$","tax_name":"GST","tax_rate":15,"ccode":"NZ","icode":"64","name":"New Zealand","timezone_name":"Pacific\/Auckland"}; var BR_HOLDER_FIELD_CLIENT_ID = 'Client Id'; var MOCA_USE_PARTNERS = '1'; var BR_USE_IMAGE_ID = ''; // for ticket holders // Default table listing row bg colour var MOCA_TABLE_BG_DEFAULT = '#fff'; // Used to stripe listing tables for readability var MOCA_TABLE_BG = '#f3f3f3'; // Back-end var MOCA_SITE_TABLE_BG = '#f7f4f4'; // Front-end var MOCA_TABLE_BG_BLUE = '#f7f4f4'; // Highlight record being edited var MOCA_TABLE_HIGHLIGHT = '#ffc'; // Highlight just-created field var MOCA_TABLE_NEW_ROW = 'pink'; // Deprecated! [multiple currencies for orgs now pos // var MOCA_GST_RATE = 15; // eg: Optional ticket holder fields var MOCA_FIELD_EXISTS = 1; var MOCA_FIELD_REQUIRED = 2; var MOCA_BR_ADMIN_PRICE_TYPE_DOLLARS = 'dollars'; var MOCA_BR_ADMIN_PRICE_TYPE_PERCENTAGE = 'percentage'; var MOCA_FUNC_UPDATE = 'update'; var MOCA_FUNC_ADD = 'add'; var MOCA_FUNC_DELETE = 'delete'; var MOCA_FUNC_PROGRESS = 'progress'; var MOCA_CURRENT_YEAR = 2024; var MOCA_AGE_LIMIT = 12; var MOCA_MAX_ATTENDEE_YEAR = 2012; var MOCA_ECOMMERCE_TRACKING = ''; var MOCA_SHARED_SITE = false; /* Common Stylesheet colours: */ var MOCA_BR_CSS_ORANGE = '#d76927'; var MOCA_BR_CSS_BROWN = '#6B4936'; var MOCA_BR_CSS_DISABLED = '#9a9a9a'; var MOCA_EMAIL_PUBLIC_BOOKING_CONSTRAINT = false; // ckeditor window.WEBSPELLCHECKER_CONFIG = { autoSearch: true, lang: 'en_NZ', serviceId: 'UpGWdGRTXqi7SoK' }; var MOCA_MONTHS = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; var MOCA_MONTH_NAMES = ['January','February','March','April','May','June','July','August','September','October','November','December']; $.ajaxSetup({ //cache:false, error:function(x,e){ unthrob(); if(x.status==0){ // mocaAlert('No network found','Please try again'); }else if(x.status==404){ mocaAlert('Requested url not found','Whoops!'); }else if(x.status==500){ mocaAlert('A server error '+x.responseText+' - please contact the administrator','Whoops!'); }else if(e=='parsererror'){ mocaAlert('

Houston, we have a problem!

For help, please call 07 575 6903 or brendon@bookingrooster.co.nz.

If you\'re a technology whiz it\'s ideal to send a screenshot of this page when you contact us

','Whoops!'); }else if(e=='timeout'){ mocaAlert('Request time out','Please Try Again'); }else { //mocaAlert('Unknown Ajax Error: '+x.responseText); } } }); function throb(el){ if(el){ $('#ajaxBusy').css('top',(el.offset()).top); } $('.ajaxBusy').show(); return true; } function unthrob(){return $('.ajaxBusy').hide(); } // For ajax calls var Func = { add:'add', edit:'edit', delete:'delete', status:'status', update:'update', progress:'progress', search:'search', costs: 'costs' }; // Dismiss status messages when anything clicked: // $(document).ready(function(){$("*", document.body).bind('click',function(){$('#statusMessage').text('');});}); // Populated by MocaForm::initJavascript() var Help = {}; // Whether fckeditor should use default fe stylesheet var MocaFckStyles = true; function logout(){ window.location.href = MOCA_BASE_URL + 'sitemgr/logout.php'; } function highlightRows(table_id, no_header_row,skip){ /* Given the ID of a table element, set every alternate row's background colour to MOCA_TABLE_BG colour. Unless no_header_row is set, the first row will be left untouched. Apply the class 'nonList' to any rows you want skipped */ var odd = false; var first = true; $('TABLE#' + table_id + ' TR:not(.nonList)').map( function(){ if(!no_header_row && first){skip--;first = false;return;} if(skip){odd=true;skip--;return;} if($(this).css('display')!='none'){ $('*:not(.nonList)',$(this)).map(function(){this.style.backgroundColor = odd ? MOCA_TABLE_BG : '';}); odd = !odd; } }) } function feHighlightRows(table_id, no_header_row,skip,colour){ /* Same for front-end */ var odd = true; var first = true; var clr = colour ? colour : MOCA_SITE_TABLE_BG; $('TABLE#' + table_id + '>TBODY>TR:not(.nonList)').map( function(){ if(!no_header_row && first){skip--;first = false;return;} if(skip){odd=true;skip--;return;} if($(this).css('display')!='none' && $(this).is(':visible')){ $('TD:not(.nonList)',$(this)).map(function(){this.style.backgroundColor = odd ? clr : '';}); odd = !odd; } }) } function highlightOptions(select_id,colour ){ /* Given the ID of a select element, set every alternate option's background colour to given colour.MOCA_TABLE_BG colour. */ colour = colour ? colour : MOCA_TABLE_BG; var odd = false; $('SELECT#' + select_id + ' OPTION:not(.nonList)').map( function(){ if($(this).css('display')!='none'){ this.style.backgroundColor = odd ? colour : ''; odd = !odd; } }) } function feHighlightOptions(select_id,colour ){ /* Given the ID of a select element, set every alternate option's background colour to given colour.MOCA_TABLE_BG colour. */ colour = colour ? colour : MOCA_SITE_TABLE_BG; var odd = false; $('SELECT#' + select_id + ' OPTION:not(.nonList)').map( function(){ if($(this).css('display')!='none'){ this.style.backgroundColor = odd ? colour : ''; odd = !odd; } }) } function FCKeditor_OnComplete(ed){ // Called by editor onLoad, change internal // stylesheet to that initialised by moca.form if(!MocaFckStyles){return;} //var ht = ed.GetData(); if($('#moca_browser').val()){ ed.Config['ImageBrowserWindowWidth'] = ed.Config['ScreenWidth'] * 0.4; ed.Config['ImageBrowserWindowHeight'] = ed.Config['ScreenHeight'] * 0.4; ed.Config['LinkBrowserWindowWidth'] = ed.Config['ScreenWidth'] * 0.5; ed.Config['LinkBrowserWindowHeight'] = ed.Config['ScreenHeight'] * 0.5; ed.Config['LinkBrowserURL'] = ed.Config['BasePath'] + 'filemanager/browser/link/fe_browser.php' ; } } function deleteFromListing(frm,ids){ // Delete records from listing page - ids is either array or // comma-separated string of ids. Form is DOM element frm.id_list.value = typeof ids == 'string' ? ids : ids.join(','); frm.func.value = 'delete'; frm.submit(); } // Convenience func for use in mocaConfirm & ilk function goto(href){window.location.href=href;} function showHelp(id){ if((Help == undefined) || !Help[id]){return;} mocaAlert(Help[id],'Help'); } function initHelp(){ $('.mfHelp').click(function() { if($(this).data("qtip")) $(this).qtip("destroy"); var n = this.id.substr(7)=='mfHelp_' ? this.id.substr(7) : this.id; if((Help == undefined) || !Help[n]){return;} var pos = $(this).hasClass('topLeft') ? {corner:{target:'topLeft',tooltip:'topRight'}} : ($(this).hasClass('bottomLeft') ? {corner:{target:'bottomLeft',tooltip:'topRight'}} : {corner:{target:'topRight',tooltip:'leftBottom'}}); $(this).qtip({ content:Help[n], position:pos, show:{when:false, ready:true}, hide:{when:'unfocus'}, style: { border:{width:5,radius:10,color:'#00adee'}, padding:10, background:'#00adee', color:'#ffffff', textAlign: 'left', tip: true, name: 'cream' } }); }); } // Front-end BR help $(document).ready(function(){ initHelp(); return false;}); function mocaPrompt(str,func,title) { str = str.indexOf('<')>-1 ? str : '

' + str + '

'; str += ''; $('BODY').append('
' + str + '
'); $('#mocaDialog').dialog({ appendTo:document.body, 'close':function(){$('#mocaDialog').remove();}, 'buttons': { 'Ok': function() { var answer = jQuery('#mocaDialogText').val(); func(answer); $(this).dialog("close"); }, 'Cancel': function() {$(this).dialog("close");} } }); } function mocaConfirm(str,func,title){ title = arguments[2] ? arguments[2] : 'Please Confirm'; switch('jquidialog'){ case 'jquidialog': str = str.indexOf('<')>-1 ? str : '

' + str + '

'; $('BODY').append('
' + str + '
'); $('#mocaDialog').dialog({ appendTo:document.body, 'close':function(){$('#mocaDialog').remove();}, 'buttons': { 'Ok': function() {func(); $(this).dialog("close");}, 'Cancel': function() {$(this).dialog("close");} } }); break; case 'jqalert': return jAlert(str,title); break; default: return alert(str); break; } } function frontEndAlert(str,title,el_id){ /* Bootstrap version - only used in kiosk so far. */ title = title ? title : ''; if($('#mocaModalAlert').length==0){ $('body').append(''); } else{ $('#mocaModalAlert div.modal-title h5').html(title); $('#mocaModalAlert div.modal-body').html('

'+str+'

'); } if(el_id){ $('#'+el_id).scrollAboveHere(); } $('#mocaModalAlert').modal(); } function mocaAlert(str,title,pos,append){ /* Custom alert. First arg is message string. Second is title. Third is function to be executed on close. Only the first is mandatory */ title = title ? title : ''; var func = arguments[2] ? arguments[2] : null; var target_element = arguments[3] ? arguments[3] : null; switch('jquidialog'){ case 'jquidialog': if ($('body.kiosk').length>0){return frontEndAlert(str,title);} if ($('body.cp').length>0){return frontEndAlert(str,title);} str = str.includes('<') ? str : '

' + str + '

'; if($('#mocaDialog').length==0){ var cont = target_element ? target_element : 'body'; $(cont).append(''); } else{ $('#mocaDialog').attr('title',title).html(str); } !pos ? $('#mocaDialog').dialog({title:title,buttons:{'Ok':function(){$(this).dialog('close');}}}) : $('#mocaDialog').dialog({title:title, position:{my:'left top',at:'left top',of: pos}, buttons:{'Ok':function(){$(this).dialog('close');}}}); return false; /*{ appendTo:'body', 'close':function(){if(func){func();}else{$(this).remove();}}, 'buttons': { 'Ok': function() { if(func){func();} else {$(this).remove();} } } }); if(jQuery().easydrag){ $('.ui-dialog').easydrag(); } */ break; case 'jqalert': return jAlert(str,title); break; default: return alert(str); break; } } var BrAudioContext = null; function beep(vol, freq, duration){ if(!BrAudioContext){BrAudioContext = new AudioContext();} vol = vol ? vol : 2000; freq = freq ? freq : 800; duration = duration ? duration : 60; v=BrAudioContext.createOscillator() u=BrAudioContext.createGain() v.connect(u) v.frequency.value=freq v.type="sine" u.connect(BrAudioContext.destination) u.gain.value=vol*0.01 v.start(BrAudioContext.currentTime) v.stop(BrAudioContext.currentTime+duration*0.001) } function burp(){ console.log('burp()'); beep(0,500,300); } function validateDob(dob){ // Implementation of age limit if(!MOCA_AGE_LIMIT || MOCA_AGE_LIMIT==0){return true;} dob = dob.mocaReverseDate(); var now = new Date(); var born = new Date(Date.parse(dob)); var birthday = new Date(now.getFullYear(), born.getMonth(), born.getDate()); var age = now >= birthday ? now.getFullYear() - born.getFullYear() : now.getFullYear() - born.getFullYear() - 1; return age >= MOCA_AGE_LIMIT; } function is_numeric(el){ return (typeof(el) === 'number' || typeof(el) === 'string') && el !== '' && !isNaN(el); } function to_decimal(n){ n = new Number(n); return n.toFixed(2); } function is_url(str){ let url; try { url = new URL(str); } catch (_) { return false; } return url.protocol === "http:" || url.protocol === "https:"; } function bidf(id){ // Apply prefix and pad booking id if(!is_numeric(id)){return id;} if(id < 10000){ id = String(id); id = id.mocaPad(5); } return 'BRN' + id; } String.prototype.mocaEnglishify = function(){ var last = this[this.length-1]; if ((this[this.length-2]=='1' && last=='1') || (this[this.length-2]=='1' && last=='2')){ return this+'th'; } switch (last) { case '1': return this + 'st'; case '2': return this + 'nd'; case '3': return this+'rd'; default: return this+'th'; } }; String.prototype.mocaStartsWithVowel = function(){ var v=['a','e','i','o','u','A','E','I','O','U']; for(i=0; i"'`]/g, function (chr) { // " return '&#' + chr.charCodeAt(0) + ';';}); }; String.prototype.mocaCamelCase = function(){ var s = $.trim( this.toLowerCase() ); return s.replace( / ([a-z])/g, function(t,b) { return b.toUpperCase(); } ); }; String.prototype.mocaCapitalize = function(){ return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } ); }; String.prototype.mocaPad = function(num,char){ char = char || '0'; return this.length >= num ? this : new Array(num - this.length + 1).join(char) + this; }; String.prototype.mocaUcWords = function() { str = this.toLowerCase(); return str.replace(/(^([a-zA-Z\p{M}]))|([ -][a-zA-Z\p{M}])/g, function(s){ return s.toUpperCase(); }); }; String.prototype.mocaReverseDate = function(){ if(this.match(/(\d{4})-(\d{2})-(\d{2})/g)){ var s = this.split('-'); return s[2]+'-'+s[1]+'-'+s[0]; } if(this.match(/(\d{2})-(\d{2})-(\d{4})/g)){ var s = this.split('-'); return s[2]+'-'+s[1]+'-'+s[0]; } return this; }; String.prototype.mocaValidDate = function(){ this.replace('/','-'); if(res = this.match(/^(\d{1,2})-(\d{1,2})-(\d{2,4})$/)){ var d;var m;var y; d = new Number(res[1]); if(d<1 || d>31){return false;} m = new Number(res[2]); if(m<1 || m>12){return false;} if(res[3].length==2){ y = new Number(res[3]); if(y<50){y = y + 2000;} else{y = y + 1900;} } else{ if(res[3].length==3){return false;} if(res[3].length==4){ y = new Number(res[3]); if(y<1900 || y>2099){return false;} } } return new Date(y,m-1,d); } else{ return false; } }; Array.prototype.mocaRemove = function(x) { var pos = -1; for(var i=0; imax){max=this[i];} } return max; }; function objectSize(obj){ var size = 0, key; for (key in obj) { if (obj.hasOwnProperty(key)) size++; } return size; } Date.prototype.mocaToString=function() { // 03-12-2010 var d = String(this.getDate());var m = String(this.getMonth()+1); var y = String(this.getYear()+1900); return d.mocaPad(2) + '-' + m.mocaPad(2) + '-' + y; }; Date.prototype.mocaToLongString=function() { // 3 Apr 2015 11:58 return String(this.getDate()) + ' ' + MOCA_MONTHS[this.getMonth()] + ' ' + String(this.getYear()+1900) + ' ' + this.getHours() + ':' + this.getMinutes(); }; Date.prototype.mocaToSqlDate=function() { // 2015-04-03 return this.getFullYear() + '-' + String(this.getMonth()+1).mocaPad(2) + '-' + String(this.getDate()).mocaPad(2); }; $(document).ready(function(){ (function($){ // Legacy - old formbuilder edit field js $.fn.positionCenter = function(options) { var pos = { sTop : function() { return window.pageYOffset || document.documentElement && document.documentElement.scrollTop || document.body.scrollTop; }, wHeight : function() { return window.innerHeight || document.documentElement && document.documentElement.clientHeight || document.body.clientHeight; } }; return this.each(function(index) { if (index == 0) { var $this = $(this); var elHeight = $this.outerHeight(); var elTop = pos.sTop() + (pos.wHeight() / 2) - (elHeight / 2); $this.css({ position: 'absolute', margin: '0', top: elTop, left: (($(window).width() - $this.outerWidth()) / 2) + 'px' }); } }); }; })(jQuery); }) $.fn.centerIt = function() { this.css({ 'position': 'fixed', 'left': '50%', 'top': '50%' }); this.css({ 'margin-left': -this.outerWidth() / 2 + 'px', 'margin-top': -this.outerHeight() / 2 + 'px' }); return this; } var MocaCookiesEnabled = false; function clientCookieCheck(){ // Call in form pages reliant on sessions setCookie('test_name','test_value',0); var ck = getCookie('test_name'); if(!ck || (ck != 'test_value')) { return mocaAlert('Your browser and/or network is not configured '+ 'to use "cookies". To use this site you must be able to send and receive cookies '+ 'from our server. Until you can do so you will not be able to continue.'); } else { MocaCookiesEnabled = true; deleteCookie('test_name'); } } function setCookie(name, value, expires // in X days ){ /* OPTIONAL PARAMS: path - where valid, usually '/' domain - all crossing of subdomain secure */ var today = new Date(); today.setTime( today.getTime() ); var expires_date = new Date( today.getTime() + (expires ? expires*1000*60*60*24 : 0) ); document.cookie = name+'='+escape( value ) + (expires ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString() (arguments[3]? ';path=' + arguments[3] : '' ) + (arguments[4]? ';domain=' + arguments[4] : '' ) + (arguments[5]? ';secure' : '' ); } function getCookie(name) { var start = document.cookie.indexOf( name + "=" ); var len = start + name.length + 1; if (!start && name != document.cookie.substring( 0, name.length )) {return null;} if (start == -1) {return null;} var end = document.cookie.indexOf( ';', len ); if ( end == -1 ) end = document.cookie.length; return unescape( document.cookie.substring( len, end ) ); } function deleteCookie(name){ if (getCookie(name)){ document.cookie = name + '=' + (arguments[1] ? ';path=' + arguments[1] : '') + (arguments[2] ? ';domain=' + arguments[2] : '' ) + ';expires=Thu, 01-Jan-1970 00:00:01 GMT'; } } // str * num : mult('0',5) = '00000' function mult(str, num) { return num ? Array(num + 1).join(str) : ""; } function showTerms(){ $.fancybox.init(); $.fancybox({ 'hideOnOverlayClick':true, 'overlayShow':true, 'overlayOpacity':0.5, // 'transitionIn':'fade', // 'transitionOut':'fade', // 'speedOut':700, 'type':'iframe', 'scrolling':'auto', 'height':650, 'width':750, 'titleShow':false, 'href':'https://book.cityfirstaid.co.nz/terms_of_use_popup' }); $("#fancybox-wrap").easydrag(); } function showLogin(id){ $.fancybox.init(); $.fancybox({'hideOnContentClick':false, 'hideOnOverlayClick':false, 'overlayShow':true, 'overlayOpacity':0.9, 'speedIn':1700, 'transitionIn':'fade', 'transitionOut':'fade', 'speedOut':700, 'type':'iframe', 'scrolling':'no', 'height':550, 'titleShow':false, 'href':'https://book.cityfirstaid.co.nz/user_login_iframe?id='+id // user_login_iframe }); $("#fancybox-wrap").easydrag(); } function reflectLogin(){ $.fancybox.close(); self.location.reload(true); } function invEvent(feat){ return mocaAlert('The '+feat+' feature is not available for this '+MOCA_BASE_ENTITYL); } function showSuggestUpgrade(goback,target){ $.fancybox({'hideOnContentClick':false, 'hideOnOverlayClick':false, 'overlayShow':true, 'overlayColor':'#d76927', 'overlayOpacity':0.6, 'speedIn':600, 'transitionIn':'fade', 'transitionOut':'fade', 'speedOut':700, 'type':'iframe', 'height':450, 'width':600, 'titleShow':false, 'onCleanup':function(){parent.location.href = 'https://book.cityfirstaid.co.nz/' + goback;}, 'href':'https://book.cityfirstaid.co.nz/suggest_upgrade/anc/'+target }); $("#fancybox-wrap").easydrag(); } function takeUpgrade(){ parent.location.href = 'https://book.cityfirstaid.co.nz/organisation_plans/upgr/1'; } // DEV tool function dump(obj){ var str=''; for(p in obj){ if (!obj.hasOwnProperty(p)) { continue; } var _str = typeof obj[p] === 'object' && obj[p] !== null ? (p + ' = %o', obj[p]) : obj[p]; str = str + p + ' = ' + _str + "\n"; } return str; } function parsePh(ph){ ph = $.trim(ph); var bits = []; if(!ph){ return bits; } // Only bother with phone number if it's easily parseable: if(ph.indexOf(',') != -1){ return ph.split(','); } else{ var _bits = ph.split(' '); if(_bits.length==4){ //std case return [_bits[0],_bits[1],_bits[2]+' '+_bits[3]]; } if(_bits.length==3){ //var num = _bits[1]+_bits[2]; //if(num.length>7){ if(_bits[2].length<6){ // no intl code return ['',_bits[0],_bits[1]+' '+_bits[2]]; } } if(_bits.length==2){ var num = _bits[0]+_bits[1]; if(num.length>7){ return ['',_bits[0],_bits[1]]; } else{ return ['','',_bits.join(' ')]; } } if(_bits.length==1){ return ['','',_bits[0]]; } return [_bits.shift(),_bits.shift(),_bits.join(' ')]; } return []; } function isDark(colour){ // Mostly when deciding whether text on a background should be white or black // Variables for red, green, blue values var r, g, b, hsp; // Check the format of the colour, HEX or RGB? if (colour.match(/^rgb/)) { // If HEX --> store the red, green, blue values in separate variables colour = colour.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d+)?))?\)$/); r = colour[1]; g = colour[2]; b = colour[3]; } else { // If RGB --> Convert it to HEX: http://gist.github.com/983661 colour = +("0x" + colour.slice(1).replace( colour.length < 5 && /./g, '$&$&')); r = colour >> 16; g = colour >> 8 & 255; b = colour & 255; } // HSP (Highly Sensitive Poo) equation from http://alienryderflex.com/hsp.html hsp = Math.sqrt( 0.299 * (r * r) + 0.587 * (g * g) + 0.114 * (b * b) ); // Using the HSP value, determine whether the colour is light or dark return hsp>127.5 ? false : true; } function shadeColour(colour, percent) { /* darken or lighten given colour, percent as float from -1.0 to 1.0 */ var f=parseInt(colour.slice(1),16),t=percent<0?0:255,p=percent<0?percent*-1:percent,R=f>>16,G=f>>8&0x00FF,B=f&0x0000FF; return "#"+(0x1000000+(Math.round((t-R)*p)+R)*0x10000+(Math.round((t-G)*p)+G)*0x100+(Math.round((t-B)*p)+B)).toString(16).slice(1); } function blendColours(c0, c1, p) { /* Same as shadeColour, but instead of darkenint (black) or lightening(white) you can elect the second colour. p = percent float from 0.0 to 1.0 */ var f=parseInt(c0.slice(1),16),t=parseInt(c1.slice(1),16),R1=f>>16,G1=f>>8&0x00FF,B1=f&0x0000FF,R2=t>>16,G2=t>>8&0x00FF,B2=t&0x0000FF; return "#"+(0x1000000+(Math.round((R2-R1)*p)+R1)*0x10000+(Math.round((G2-G1)*p)+G1)*0x100+(Math.round((B2-B1)*p)+B1)).toString(16).slice(1); } $.fn.scrollToHere = function () { return this.each(function () { $('html, body').animate({ scrollTop: $(this).offset().top }, 500); }); }