document.write(''); var initSite = { photoGallery: function() { if ($('photo-gallery') && $('nav-overlay')) { var navFader = new Fx.Morph('nav-overlay', {duration:200}); $('image-holder').addEvents({ 'mouseenter': function(){navFader.start({'opacity': [0, .6]})}, 'mouseleave': function(){navFader.start({'opacity': [.6, 0]})} }); } }, powerCentre: function() { if ($('promo-power-centre')) { pcSliders = $$('#pc-links li.deck'); sliders = []; $$('#pc-links img.toggle').each(function(el, i){ sliders[i] = new Fx.Slide(pcSliders[i], {duration:100}).hide(); el.addEvent('click', function() { pcSliders[i].setStyle('display', 'inline'); sliders[i].toggle(); if (el.getProperty('alt') == 'Expand') { el.setProperties({src:'/i/ads/powercentre-collapse.gif', alt:'Collapse'}); } else { el.setProperties({src:'/i/ads/powercentre-expand.gif', alt:'Expand'}); } }); }); } }, register: function() { $$('.member-signup').fireEvent('click'); }, start: function() { initSite.powerCentre(); } }; /*------------------------------------------------------------------- MEMBERSHIP REGISTRATION ------------------------------------------------------------------- */ function toggleFields(obj, fields) { var i = $(obj).selectedIndex; if ($(obj).options[i].text == 'Australia') { $(fields).fade('show'); } else { $(fields).fade('hide'); } } function memberCheckName() { var file = '/membership/check_username.htm'; var username = encodeURIComponent($('username').value); var email = encodeURIComponent($('email').value); var str = ""; //Return null if no username provided if(username == ""){ return null; } str = "username="+username+"&email="+email; request.open( "POST", file, false ); request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); request.send(str); var response = request.responseText; response = response.split("||"); if(response != 'Username is available.'){ return '0'; }else{ return '1'; } } function memberCheckEmail() { var file = '/membership/check_email.htm'; var email = encodeURIComponent($('email').value); var str = ""; str = "email="+email; request.open( "POST", file, false ); request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); request.send(str); var response = request.responseText; response = response.split("||"); if(response == 'Email already registered.'){ return '-1'; }else if(response != 'Email is available.'){ return '0'; }else{ return '1'; } } var fc; var lbinit = false; var lightboxjs = { init: function() { $$('.member-signup').addEvent('click', function(e){ if(lbinit == true) return false; lbinit = true; if(e){ e.stop();} if($('sl')){ $('sl').dispose(); lbinit = false; if($('video-player-story')) $('video-player-story').setStyle('visibility', 'visible'); } var bl = new Element('div', { 'id':'bl' }).inject($(document.body),'top'); new Request({url:'/membership/aj/member-signup.htm',evalScripts:true, onSuccess: function(responseHTML) { // Lightbox shows up trackOmnitureMembership("event3"); var sl = new Element('div', { 'html':responseHTML, 'id':'sl' }).inject($(document.body),'top'); if($('video-player-story')) $('video-player-story').setStyle('visibility', 'hidden'); lightboxjs.positionBox(); lightboxjs.buildForm(); } }).send(); }); }, buildForm: function() { fc = new FormCheck('sl-form'); $each($$('.sl-select-replace'), function(el, idx){ lightboxjs.replaceSelect(el, idx); }); $each($$('.sl-checkbox-replace'), function(el, idx){ lightboxjs.replaceCheckbox(el); }); $each($$('.sl-radiobutton-replace'), function(el, idx){ lightboxjs.replaceRadioButton(el); }); $('sl-close').addEvent('click', function(e){ e.stop(); $('bl').dispose(); lbinit = false; $('sl').dispose(); $each($$('.fc-tbx'), function(el){ el.dispose(); }); if($('video-player-story')) $('video-player-story').setStyle('visibility', 'visible'); }) }, positionBox:function(){ if($('sl')){ scrollToElement(document.body); var windowScrollSize = $(document.window).getScrollSize(); var windowSize = $(document.window).getSize(); var boxSize = $('sl').getSize(); var topBox = (windowSize.y - boxSize.y)/2; var leftBox = (windowSize.x - boxSize.x)/2; $('sl').setStyles({ top:topBox, left:leftBox }); $('bl').setStyles({ width:windowScrollSize.x, height:windowScrollSize.y }); } }, toggleList: function(el){ var list = el.getParent().getElement('ul.sl-select-list'); list.fade(); }, replaceCheckbox: function(el){ if(el.getProperty('checked')) el.getParent().addClass('sl-valid'); var span = new Element('span').inject(el.getParent()); el.getParent().addEvent('click', function(){ if(this.hasClass('sl-valid')){ this.removeClass('sl-valid') el.setProperty('checked', false); }else{ this.addClass('sl-valid'); el.setProperty('checked', true); } }) }, replaceRadioButton: function(el){ if(el.getProperty('checked')) el.getParent().addClass('sl-valid'); var span = new Element('span').inject(el.getParent()); el.getParent().addEvent('click', function(){ if(!this.hasClass('sl-valid')){ this.addClass('sl-valid'); el.setProperty('checked', true); var currentVal = el.get('value'); var currentName = el.get('name'); $each($$('.sl-radiobutton-replace[name='+currentName+']'), function(el, idx){ if(currentVal != el.get('value')){ el.getParent().removeClass('sl-valid'); el.setProperty('checked', false); } }); } }) }, replaceSelect: function(el, idx){ var select = el; var ul = new Element('ul', { 'class': 'sl-select-list', 'styles': { 'z-index': (100 - idx) } }); $each(select.getElements('option'), function(el, idx){ if(idx == 0){ var p = new Element('p', { 'text': el.get('text'), 'class': 'sl-select', 'events': { 'click': function(e){ lightboxjs.toggleList(this); } } }).inject(select.getParent()); return; } var liClass; if(el.hasClass('sl-select-head')) liClass = 'sl-select-head'; if(el.getProperty('selected')){ liClass = 'sl-selected'; select.getParent().getElement('p.sl-select').set('text', el.get('text')); fc.validate(select); } var li = new Element('li', { 'text': el.get('text'), 'class': liClass, 'events': { 'click' : function(){ if(!el.hasClass('sl-select-head')){ if(ul.getElement('li.sl-selected')) ul.getElement('li.sl-selected').removeClass('sl-selected'); this.addClass('sl-selected'); select[idx].setProperty('selected', true) select.getParent().getElement('p.sl-select').set('text', this.get('text')); //Add country select check if(select.id == 'user_country'){ toggleFields(select.id, 'sl-state'); } ul.fade('hide'); fc.validate(select); } } } }).inject(ul); }); ul.inject(el.getParent()).fade('hide'); } } window.addEvent('domready', lightboxjs.init); window.addEvent('resize', lightboxjs.positionBox); /*------------------------------------------------------------------- MISC SITE FUNCTIONS ------------------------------------------------------------------- */ function switchTabs(activeTab, tabParent) { var tabs = $(tabParent).getElements('li'); var panels = $(tabParent.getParent()).getElements('.box-content'); tabs.each(function(el, x){ tabs[x].removeClass('active'); panels[x].setStyle('display', 'none'); if(x == activeTab) { tabs[x].addClass('active'); panels[x].setStyle('display', 'block'); } }); } /* tina: need to duplicate function for boxes that don't have a box-content class */ function switchTabs2(activeTab, tabParent) { var tabs = $(tabParent).getElements('li'); var panels = $(tabParent.getParent()).getElements('.nil-box-content'); tabs.each(function(el, x){ tabs[x].removeClass('active'); panels[x].setStyle('display', 'none'); if(x == activeTab) { tabs[x].addClass('active'); panels[x].setStyle('display', 'block'); } }); } function visibilite(el) { if ($(el).getStyle('display') == 'none') { $(el).setStyle('display', 'block'); } else { $(el).setStyle('display', 'none'); } } function scrollToElement(target) { var scrollFx = new Fx.Scroll(window, {duration:400}).toElement(target); } var footerClick, fLinks, fSlider; function toggleFooter() { var fToggler = $('toggle-footer'); if (!footerClick) { fLinks = $('external-links').setStyle('display', 'block'); fSlider = new Fx.Slide(fLinks, {duration:800}).hide(); footerClick = true; } if (!fSlider.isVisible()) { fToggler.set('text', 'Hide this section'); var footerHeight = fLinks.getStyle('height').toInt() + 30; $('footer').setStyle('height', footerHeight+'px'); var fScroll = new Fx.Scroll(window).toBottom().chain(function(){ fSlider.toggle(); }); } else { fToggler.set('text', 'Around SHEEP Indonesia Foundation'); $('footer').setStyle('height', 'auto'); fSlider.hide(); } } function showBlogBio(el) { if($(el).getStyle('display') == 'none') { $('expand-link').set('text', '[-] Hide bio'); } else { $('expand-link').set('text', '[-] Read bio'); } visibilite(el); } function snapshot(activeTab){ snapshotTabs = $('snapshot').getElements('li'); snapshotPanels = $('snapshot').getElements('p.clearfix'); snapshotTabs.each(function(el, x) { snapshotTabs[x].removeClass('snapshot_selected'); snapshotPanels[x].setStyle('display', 'none'); if(snapshotTabs[x].id == activeTab.id) { snapshotTabs[x].addClass('snapshot_selected'); snapshotPanels[x].setStyle('display', 'block'); } }); } function videoThumbText(msg){ var targetElement = $('video-thumb-display') ; if (msg) { targetElement.set('html', ''+msg+''); } else { targetElement.set('html', 'Latest videos on ZDNet Australia'); } } /*------------------------------------------------------------------- SUCKERFISH Replicate :hover pseudo class on any element for IE ------------------------------------------------------------------- */ function initStoryTools(){ if ($('story-tools')) { suckerfish(sfHover, 'LI', 'story-tools'); } } function suckerfish(type, tag, parentId) { if (window.attachEvent) { window.attachEvent('onload', function() { var sfEls = (parentId==null)?document.getElementsByTagName(tag):document.getElementById(parentId).getElementsByTagName(tag); type(sfEls); }); } } var sfHover = function(sfEls) { for (var i=0; i35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('k s=f d({17:4(7,3){2.7=$(7);a(!2.7.1L(\'U\')){2.7.x(\'U\');2.9=[];2.8=[];2.M({H:d.g,D:d.g,16:d.g,13:d.g,14:".n",J:".u",15:1q,I:1i,R:0,w:"1j",A:"1k",z:"K",N:1H,p:1G},3);2.9=$(7).1b(2.3.14);2.8=$(7).1b(2.3.J);2.C();2.e(2.3.R);a(2.3.p)2.p();a(2.3.z!=\'K\')2.O(2.3.z);S 2}W S 1s},O:4(b){2.8.q(4(l,y){$(l).1u(b,4(){2.m.M(2.m.3,{Q:2.3.N});a(2.j!=y)2.e(y);2.18()}.1w(2))},2)},C:4(){2.m=f 1x.1y(2.9,{Q:2.3.I});2.9.q(4(n){n.t(\'B\',0)})},e:4(6){k b={};2.9.q(4(n,5){a(5==6&&5!=2.j){$(2.8[5]).X(2.3.A).x(2.3.w);b[5.11()]={\'B\':[1]}}W{$(2.8[5]).X(2.3.w).x(2.3.A);b[5.11()]={\'B\':[0]}}},2);2.h(\'13\',6);2.j=6;2.m.1E(b)},p:4(){2.C();2.12=2.E.1I(2.3.15,2);2.h(\'16\')},18:4(){1K(2.12);2.h(\'D\')},E:4(){v=2.j;T=(v+1>=2.9.1f)?0:v+1;2.e(T);2.h(\'H\')},1l:4(){$(2.3.o).t(\'L\',\'1m\');a(!$(2.3.o).1n())$(2.3.o).t(\'1r\',\'1t\')},1v:4(){$(2.3.o).t(\'L\',\'1A\')}});s.10(f 1B);s.10(f 1D);k 1F=s.1J({17:4(l,3){2.P(l,$1c({G:\'.1e\',V:\'F://i.i.r.r/1a.1d/i/Z/c/1g.Y\',19:\'F://i.i.r.r/1a.1d/i/Z/c/1z.Y\'},3))},e:4(6){2.8.q(4(u,5){$(u).1h(2.3.G).1o=(5==6)?2.3.V:2.3.19},2);2.P(6)}});k 1p=1C;',62,110,'||this|options|function|index|slideIndex|container|buttons|slides|if|action||Class|showSlide|new|empty|fireEvent||currentSlide|var|el|slideFx|slide|carouselContainer|autoplay|each|com|CNETcarousel|setStyle|button|current|buttonOnClass|addClass|idx|rotateAction|buttonOffClass|opacity|createFx|onStop|rotate|http|bubbleButtonBGImgSelector|onRotate|transitionDuration|buttonsSelector|none|visibility|setOptions|rotateActionDuration|setupAction|parent|duration|startIndex|return|next|hasCarousel|buttonOnGifSrc|else|removeClass|gif|fd|implement|toString|slideshowInt|onShowSlide|slidesSelector|slideInterval|onAutoPlay|initialize|stop|buttonOffGifSrc|cnwk|getElements|merge||bbg|length|green_button|getElement|500|selected|off|show|visible|isVisible|src|carousel|4000|display|false|block|addEvent|hide|bind|Fx|Elements|gray_button|hidden|Options|null|Events|start|CNETcarouselWithButtons|true|100|periodical|extend|clearInterval|hasClass'.split('|'),0,{})) /*------------------------------------------------------------------- SIMPLESLIDE.JS http://tobiaswallin.com/files/SlideShow/documentation.php ------------------------------------------------------------------- */ eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('a W=j L({X:8(5,7){4.5=5;4.7=7;6(4.7.n=="M"||4.7.n=="C"){a o;4.o=4.D.N(4.7.O,4,$(4.5))}b{4.D($(4.5))}},D:8(5){a f;6(4.7)f=4.7.f;b f="A";a 3;6(4.7.d){a d=4.7.d.K();d-=1}a 9=5.c().c()[0];9.r(8(e){6(e.i=="s"){3=e}});6(d||d==0){6(5.c()[0].c()[d])3=5.c()[0].c()[d];b P("Q "+d+" R S T")}b{6(!3){6(f=="A"){3=9[0].w()}b 6(f=="H"){3=5.c()[0].F()}}b{6(f=="A"){a t=5.c()[0].F();6(t==3.w()&&4.7.n=="C")$I(4.o);6(t==3)3=9[0];b 3=3.w()}b 6(f=="H"){a E=5.c()[0].V();6(E==3.J()&&4.7.n=="C")$I(4.o);6(E==3)3=5.c()[0].F();b 3=3.J()}}}6(3){6(4.7.G=="l")4.l(5,9,3);b 6(4.7.G=="h")4.h(5,9,3);b 6(4.7.G=="v")4.v(5,9,3)}},l:8(5,9,3){a l=j k.u(5,{g:4.7.g,m:8(){9.r(8(e){e.i=""});3.i="s"}}).x(3)},h:8(5,9,3){a h=j k.y(5,\'z\',{g:4.7.g,m:8(){j k.u(5,{g:1,m:8(){9.r(8(e){e.i=""});3.i="s";j k.y(5,\'z\').q(0.p,1)}}).x(3)}});h.q(1,0.p)},v:8(5,9,3){a B=4.7.g.K();a h=j k.y(5,\'z\',{g:(B/2)});h.q(1,0.p).U(8(){h.q(0.p,1)});j k.u(5,{g:B,m:8(){9.r(8(e){e.i=""});3.i="s"}}).x(3)}});',60,60,'|||child|this|container|if|options|function|children|var|else|getChildren|goTo||direction|duration|fade|id|new|Fx|scroll|onComplete|auto|automated|01|start|each|currentChild|lastElement|Scroll|scrollfade|getNext|toElement|Style|opacity|forward|durationInt|once|slider|firstElement|getLast|type|back|clear|getPrevious|toInt|Class|loop|periodical|time|alert|Slide|does|not|exist|chain|getFirst|SimpleSlide|initialize'.split('|'),0,{})) /*------------------------------------------------------------------- PLUGIN EXTENSIONS ------------------------------------------------------------------- */ Fx.Slide.implement({ isVisible: function() { return (this.wrapper.offsetHeight == 0 || this.wrapper.offsetWidth == 0) ? false: true; } }); /*------------------------------------------------------------------- FORM CHECK ------------------------------------------------------------------- */ var FormCheck = new Class({ Implements: [Options, Events], options : { tipsClass: 'fc-tbx', //tips error class errorClass: 'fc-error', //div error class fieldErrorClass: 'fc-field-error', //error class for elements trimValue : true, //trim (remove whitespaces before and after) the value submitByAjax : true, //false : standard submit way, true : submit by ajax ajaxResponseDiv : 'sl', //element to inject ajax response into (can also use onAjaxSuccess) [cronix] ajaxEvalScripts : false, //use evalScripts in the Request response [cronix] onAjaxRequest : $empty, //Function to fire when the Request event starts onAjaxSuccess : $empty, //Function to fire when the Request receives . Args: response [the request response] - see Mootools docs for Request.onSuccess onAjaxFailure : $empty, //Function to fire if the Request fails display : { showErrors : 1, titlesInsteadNames : 0, errorsLocation : 1, indicateErrors : 1, keepFocusOnError : 0, checkValueIfEmpty : 0, addClassErrorToField : 0, fixPngForIe : 1, replaceTipsEffect : 1, flashTips : 0, closeTipsButton : 1, tipsPosition : "right", tipsOffsetX : -45, tipsOffsetY : 0, listErrorsAtTop : false, scrollToFirst : true, fadeDuration : 300 }, alerts : { submit: "There was an error during registration. Please try again.", required: "This field is required.", alpha: "This field accepts alphabetic characters only.", alphanum: "This field accepts alphanumeric characters only.", nodigit: "No digits are accepted.", digit: "Please enter a valid integer.", digitltd: "The value must be between %0 and %1", number: "Please enter a valid number.", email: "Please enter a valid email.", phone: "Please enter a valid phone.", url: "Please enter a valid url.", confirm: "This field is different from %0", differs: "This value must be different of %0", length_str: "The length is incorrect, it must be between %0 and %1", length_fix: "The length is incorrect, it must be exactly %0 characters", lengthmax: "The length is incorrect, it must be at max %0", lengthmin: "The length is incorrect, it must be at least %0", checkbox: "Please check the box", radios: "Please select a radio", select: "Please choose a value", username_invalid: "Username not available or invalid, please choose another.", email_invalid: "Email not available or invalid, please choose another.", email_registered: "Email has already been registered, please choose another.", mobile_update: "Please supply a mobile number." }, regexp : { required : /[^.*]/, alpha : /^([a-z ._-]+|.{0})$/i, alphanum : /^([a-z0-9 ._-]+|.{0})$/i, digit : /^([-+]?[0-9]+|.{0})$/, nodigit : /^([^0-9]+|.{0})$/, number : /^([-+]?\d*\.?\d+|.{0})$/, email : /^([a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}|.{0})$/i, phone : /^([\d\s ().-]+|.{0})$/, url : /^((http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&%\$#\=~])*|.{0})$/i } }, /* Constructor: initialize Constructor Add event on formular and perform some stuff, you now, like settings, ... */ initialize : function(form, options) { if (this.form = $(form)) { this.form.isValid = true; this.regex = ['length']; this.setOptions(options); //internalization if (typeof(formcheckLanguage) != 'undefined') this.options.alerts = formcheckLanguage; this.validations = []; this.alreadyIndicated = false; this.firstError = false; var regex = new Hash(this.options.regexp); regex.each(function(el, key) { this.regex.push(key); }, this); this.form.getElements("*[class*=validate]").each(function(el) { el.validation = []; var classes = el.getProperty("class").split(' '); classes.each(function(classX) { if(classX.match(/^validate(\[.+\])$/)) { var validators = eval(classX.match(/^validate(\[.+\])$/)[1]); for(var i = 0; i < validators.length; i++) { el.validation.push(validators[i]); } this.register(el); } }, this); }, this); this.form.addEvents({ "submit": this.onSubmit.bind(this) }); if(this.options.display.fixPngForIe) this.fixIeStuffs(); document.addEvent('mousewheel', function(){ this.isScrolling = false; }.bind(this)); } }, /* Function: register Private method Add listener on fields */ register : function(el) { this.validations.push(el); el.errors = []; if (el.validation[0] == 'submit') { el.addEvent('click', function(e){ this.onSubmit(e); }.bind(this)); return true; } if (this.isChildType(el) == false) el.addEvent('blur', function(e) { if((el.element || this.options.display.showErrors == 1) && (this.options.display.checkValueIfEmpty || el.value)) this.manageError(el, 'blur'); }.bind(this)) //We manage errors on radio else if (this.isChildType(el) == true) { //We get all radio from the same group and add a blur option var nlButtonGroup = this.form.getElements('input[name="'+ el.getProperty("name") +'"]'); nlButtonGroup.each(function(radio){ radio.addEvent('blur', function(){ if((el.element || this.options.display.showErrors == 1) && (this.options.display.checkValueIfEmpty || el.value)) this.manageError(el, 'click'); }.bind(this)) },this); } }, /* Function: validate Private method Dispatch check to other methods */ validate : function(el) { el.errors = []; el.isOk = true; if (this.options.trimValue && el.value != null ) el.value = el.value.trim(); //On valide l'lment qui n'est pas un radio ni checkbox el.validation.each(function(rule) { if(this.isChildType(el)) { if (this.validateGroup(el) == false) { el.isOk = false; } } else { var ruleArgs = []; if(rule.match(/^.+\[/)) { var ruleMethod = rule.split('[')[0]; ruleArgs = eval(rule.match(/^.+(\[.+\])$/)[1].replace(/([A-Z\._]+)/i, "'$1'")); } else var ruleMethod = rule; if (this.regex.contains(ruleMethod) && el.get('tag') != "select") { if (this.validateRegex(el, ruleMethod, ruleArgs) == false) { el.isOk = false; } } if (ruleMethod == 'confirm') { if (this.validateConfirm(el, ruleArgs) == false) { el.isOk = false; } } if (ruleMethod == 'differs') { if (this.validateDiffers(el, ruleArgs) == false) { el.isOk = false; } } if (el.get('tag') == "select" || (el.type == "checkbox" && ruleMethod == 'required')) { //Do extra checking that country is Australia before making state mandatory if(el.id == 'user_state') { var i = $('user_country').selectedIndex; if ($('user_country').options[i].text == 'Australia') { if (this.simpleValidate(el) == false) { el.isOk = false; } } //Make sure others are mandatory } else { if (this.simpleValidate(el) == false) { el.isOk = false; } } } if(ruleMethod == 'username_availability'){ if(el.value != ""){ var username_status = memberCheckName(); if(username_status == '0'){ el.errors.push(this.options.alerts.username_invalid); el.isOk = false; } }else{ el.isOk = false; } } if(ruleMethod == 'email_availability'){ if(el.value != ""){ var email_status = memberCheckEmail(); if(email_status == '0'){ el.errors.push(this.options.alerts.email_invalid); el.isOk = false; }else if(email_status == '-1'){ el.errors.push(this.options.alerts.email_registered); el.isOk = false; } }else{ el.isOk = false; } } if(ruleMethod == 'user_mobile'){ if(el.checked == true){ if(this.validateRegex($('user_mobile'), 'required', false) == false){ el.errors.push(this.options.alerts.mobile_update); $('user_mobile').getParent().addClass('sl-error'); el.isOk = false; } } } } }, this); if (el.isOk){ el.getParent().removeClass('sl-error'); //Only highlight correct when really checking for values if(el.value != "") { el.getParent().addClass('sl-valid'); } return true; }else { el.getParent().removeClass('sl-valid'); el.getParent().addClass('sl-error'); return false; } }, /* Function: simpleValidate Private method Perform simple check for select fields and checkboxes */ simpleValidate : function(el) { if (el.get('tag') == 'select' && (el.options[el.selectedIndex].text == el.options[0].text)) { el.errors.push(this.options.alerts.select); return false; } else if (el.type == "checkbox" && el.checked == false) { el.errors.push(this.options.alerts.checkbox); return false; } return true; }, /* Function: validateRegex Private method Perform regex validations */ validateRegex : function(el, ruleMethod, ruleArgs) { var msg = ""; if (ruleArgs[1] && ruleMethod == 'length') { if (ruleArgs[1] == -1) { this.options.regexp.length = new RegExp("^[\\s\\S]{"+ ruleArgs[0] +",}$"); msg = this.options.alerts.lengthmin.replace("%0",ruleArgs[0]); } else if(ruleArgs[0] == ruleArgs[1]) { this.options.regexp.length = new RegExp("^[\\s\\S]{"+ ruleArgs[0] +"}$"); msg = this.options.alerts.length_fix.replace("%0",ruleArgs[0]); } else { this.options.regexp.length = new RegExp("^[\\s\\S]{"+ ruleArgs[0] +","+ ruleArgs[1] +"}$"); msg = this.options.alerts.length_str.replace("%0",ruleArgs[0]).replace("%1",ruleArgs[1]); } } else if (ruleArgs[0] && ruleMethod == 'length') { this.options.regexp.length = new RegExp("^.{0,"+ ruleArgs[0] +"}$"); msg = this.options.alerts.lengthmax.replace("%0",ruleArgs[0]); } else { msg = this.options.alerts[ruleMethod]; } if (ruleArgs[1] && ruleMethod == 'digit') { var regres = true; if (!this.options.regexp.digit.test(el.value)) { el.errors.push(this.options.alerts[ruleMethod]); regres = false; } if (ruleArgs[1] == -1) { if (el.value >= ruleArgs[0]) var valueres = true; else var valueres = false; msg = this.options.alerts.digitmin.replace("%0",ruleArgs[0]); } else { if (el.value >= ruleArgs[0] && el.value <= ruleArgs[1]) var valueres = true; else var valueres = false; msg = this.options.alerts.digitltd.replace("%0",ruleArgs[0]).replace("%1",ruleArgs[1]); } if (regres == false || valueres == false) { el.errors.push(msg); return false; } } else if (this.options.regexp[ruleMethod].test(el.value) == false) { el.errors.push(msg); return false; } return true; }, /* Function: validateConfirm Private method Perform confirm validations */ validateConfirm: function(el,ruleArgs) { if (el.validation.contains('required') == false) { el.validation.push('required'); } var confirm = ruleArgs[0]; if(el.value != this.form[confirm].value){ if (this.options.display.titlesInsteadNames) var msg = this.options.alerts.confirm.replace("%0",this.form[confirm].getProperty('title')); else var msg = this.options.alerts.confirm.replace("%0",confirm); el.errors.push(msg); return false; } return true; }, /* Function: validateDiffers Private method Perform differs validations */ validateDiffers: function(el,ruleArgs) { var differs = ruleArgs[0]; if(el.value == this.form[differs].value){ if (this.options.display.titlesInsteadNames) var msg = this.options.alerts.differs.replace("%0",this.form[differs].getProperty('title')); else var msg = this.options.alerts.differs.replace("%0",differs); el.errors.push(msg); return false; } return true; }, /* Function: isChildType Private method Determine if the field is a group of radio or not. */ isChildType: function(el) { var elType = el.type.toLowerCase(); if((elType == "radio")) return true; return false; }, /* Function: validateGroup Private method Perform radios validations */ validateGroup : function(el) { el.errors = []; var nlButtonGroup = this.form[el.getProperty("name")]; el.group = nlButtonGroup; var cbCheckeds = false; for(var i = 0; i < nlButtonGroup.length; i++) { if(nlButtonGroup[i].checked) { cbCheckeds = true; } } if(cbCheckeds == false) { el.errors.push(this.options.alerts.radios); return false; } else { return true; } }, /* Function: listErrorsAtTop Private method Display errors */ listErrorsAtTop : function(obj) { if(!this.form.element) { this.form.element = new Element('div', {'id' : 'errorlist', 'class' : this.options.errorClass}).injectTop(this.form); } if ($type(obj) == 'collection') { new Element('p').set('html',"" + obj[0].name + " : " + obj[0].errors[0]).injectInside(this.form.element); } else { if ((obj.validation.contains('required') && obj.errors.length > 0) || (obj.errors.length > 0 && obj.value && obj.validation.contains('required') == false)) { obj.errors.each(function(error) { new Element('p').set('html',"" + obj.name + " : " + error).injectInside(this.form.element); }, this); } } }, /* Function: manageError Private method Manage display of errors boxes */ manageError : function(el, method) { var isValid = this.validate(el); if ((!isValid && el.validation.contains('required')) || (!el.validation.contains('required') && el.value && !isValid)) { if(this.options.display.listErrorsAtTop == true && method == 'submit') { this.listErrorsAtTop(el, method); } if (this.options.display.indicateErrors == 2 ||this.alreadyIndicated == false || el.name == this.alreadyIndicated.name) { if(!this.firstError) this.firstError = el; this.alreadyIndicated = el; if (this.options.display.keepFocusOnError && el.name == this.firstError.name) (function(){el.focus()}).delay(20); this.addError(el); return false; } } else if ((isValid || (!el.validation.contains('required') && !el.value)) && el.element) { this.removeError(el); return true; } return true; }, /* Function: addError Private method Add error message */ addError : function(obj) { if(!obj.element && this.options.display.indicateErrors != 0) { if (this.options.display.errorsLocation == 1) { var pos = (this.options.display.tipsPosition == 'left') ? obj.getCoordinates().left : obj.getCoordinates().right; var options = { 'opacity' : 0, 'position' : 'absolute', 'float' : 'left', 'z-index' : '9999', 'left' : pos + this.options.display.tipsOffsetX } obj.element = new Element('div', {'class' : this.options.tipsClass, 'styles' : options}).injectInside(document.body); this.addPositionEvent(obj); } else if (this.options.display.errorsLocation == 2){ obj.element = new Element('div', {'class' : this.options.errorClass, 'styles' : {'opacity' : 0}}).injectBefore(obj); } else if (this.options.display.errorsLocation == 3){ obj.element = new Element('div', {'class' : this.options.errorClass, 'styles' : {'opacity' : 0}}); if ($type(obj.group) == 'object' || $type(obj.group) == 'collection') obj.element.injectAfter(obj.group[obj.group.length-1]); else obj.element.injectAfter(obj); } } if (obj.element) { obj.element.empty(); if (this.options.display.errorsLocation == 1) { var errors = []; obj.errors.each(function(error) { errors.push(new Element('p').set('html', error)); }); var tips = this.makeTips(errors).injectInside(obj.element); if(this.options.display.closeTipsButton) { tips.getElements('a.close').addEvent('mouseup', function(){ this.removeError(obj); }.bind(this)); } obj.element.setStyle('top', obj.getCoordinates().top - tips.getCoordinates().height + this.options.display.tipsOffsetY); } else { obj.errors.each(function(error) { new Element('p').set('html',error).injectInside(obj.element); }); } if (!Browser.Engine.trident5 && obj.element.getStyle('opacity') == 0) new Fx.Morph(obj.element, {'duration' : this.options.display.fadeDuration}).start({'opacity':[1]}); else obj.element.setStyle('opacity', 1); } /* if (this.options.display.addClassErrorToField && this.isChildType(obj) == false) { obj.addClass(this.options.fieldErrorClass); }*/ }, /* Function: addPositionEvent Update tips position after a browser resize */ addPositionEvent : function(obj) { if(this.options.display.replaceTipsEffect) { obj.event = function(){ new Fx.Morph(obj.element, { 'duration' : this.options.display.fadeDuration }).start({ 'left':[obj.element.getStyle('left'), obj.getCoordinates().right + this.options.display.tipsOffsetX], 'top':[obj.element.getStyle('top'), obj.getCoordinates().top - obj.element.getCoordinates().height + this.options.display.tipsOffsetY] }); }.bind(this); } else { obj.event = function(){ obj.element.setStyles({ 'left':obj.getCoordinates().right + this.options.display.tipsOffsetX, 'top':obj.getCoordinates().top - obj.element.getCoordinates().height + this.options.display.tipsOffsetY }); }.bind(this) } window.addEvent('resize', obj.event); }, /* Function: removeError Private method Remove the error display */ removeError : function(obj) { this.firstError = false; this.alreadyIndicated = false; obj.errors = []; obj.isOK = true; window.removeEvent('resize', obj.event); if (this.options.display.errorsLocation == 2) new Fx.Morph(obj.element, {'duration' : this.options.display.fadeDuration}).start({ 'height':[0] }); if (!Browser.Engine.trident5) { new Fx.Morph(obj.element, { 'duration' : this.options.display.fadeDuration, 'onComplete' : function() { if (obj.element) { obj.element.destroy(); obj.element = false; } }.bind(this) }).start({ 'opacity':[1,0] }); } else { obj.element.destroy(); obj.element = false; } if (this.options.display.addClassErrorToField && !this.isChildType(obj)) { obj.removeClass(this.options.fieldErrorClass); } }, /* Function: focusOnError Private method Create set the focus to the first field with an error if needed */ focusOnError : function (obj) { if (this.options.display.scrollToFirst && !this.alreadyFocused && !this.isScrolling) { if (this.alreadyIndicated.element) { switch (this.options.display.errorsLocation){ case 1 : var dest = obj.element.getCoordinates().top; break; case 2 : var dest = obj.element.getCoordinates().top-30; break; case 3 : var dest = obj.getCoordinates().top-30; break; } this.isScrolling = true; } else if (!this.options.display.indicateErrors) { var dest = obj.getCoordinates().top-30; } /*if (window.getScroll.y != dest) { new Fx.Scroll(window, { onComplete : function() { this.isScrolling = false; obj.focus(); }.bind(this) }).start(0,dest); } else { this.isScrolling = false; obj.focus(); }*/ this.alreadyFocused = true; } }, /* Function: fixIeStuffs Private method Fix png for IE6 */ fixIeStuffs : function () { if (Browser.Engine.trident4) { //We fix png stuffs var rpng = new RegExp('url\\(([\.a-zA-Z0-9_/:-]+\.png)\\)'); var search = new RegExp('(.+)formcheck\.css'); for (var i = 0; i < document.styleSheets.length; i++){ if (document.styleSheets[i].href.match(/formcheck\.css$/)) { var root = document.styleSheets[i].href.replace(search, '$1'); var count = document.styleSheets[i].rules.length; for (var j = 0; j < count; j++){ var cssstyle = document.styleSheets[i].rules[j].style; var bgimage = root + cssstyle.backgroundImage.replace(rpng, '$1'); if (bgimage && bgimage.match(/\.png/i)){ var scale = (cssstyle.backgroundRepeat == 'no-repeat') ? 'crop' : 'scale'; cssstyle.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, src=\'' + bgimage + '\', sizingMethod=\''+ scale +'\')'; cssstyle.backgroundImage = "none"; } } } } } }, /* Function: makeTips Private method Create tips boxes */ makeTips : function(txt) { var table = new Element('table'); table.cellPadding ='0'; table.cellSpacing ='0'; table.border ='0'; var tbody = new Element('tbody').injectInside(table); var tr1 = new Element('tr').injectInside(tbody); new Element('td', {'class' : 'tl'}).injectInside(tr1); new Element('td', {'class' : 't'}).injectInside(tr1); new Element('td', {'class' : 'tr'}).injectInside(tr1); var tr2 = new Element('tr').injectInside(tbody); new Element('td', {'class' : 'l'}).injectInside(tr2); var cont = new Element('td', {'class' : 'c'}).injectInside(tr2); var errors = new Element('div', {'class' : 'err'}).injectInside(cont); txt.each(function(error) { error.injectInside(errors); }); if (this.options.display.closeTipsButton) new Element('a',{'class' : 'close'}).injectInside(cont); // new Element('div', {'style' : "clear:both"}).injectInside(cont); new Element('td', {'class' : 'r'}).injectInside(tr2); var tr3 = new Element('tr').injectInside(tbody); new Element('td', {'class' : 'bl'}).injectInside(tr3); new Element('td', {'class' : 'b'}).injectInside(tr3); new Element('td', {'class' : 'br'}).injectInside(tr3); return table; }, /* Function: reinitialize Private method Reinitialize form before submit check */ reinitialize: function() { this.validations.each(function(el) { if (el.element) { el.errors = []; el.isOK = true; if(this.options.display.flashTips == 1) { el.element.destroy(); el.element = false; } } }, this); if (this.form.element) this.form.element.empty(); this.alreadyFocused = false; this.firstError = false; this.alreadyIndicated = false; this.form.isValid = true; }, /* Function: submitByAjax Private method Send the form by ajax, and replace the form with response */ submitByAjax: function() { var url = this.form.getProperty('action'); var submission_type = $('fh_controller').value; if(submission_type == 'ajnew_member') { $('sl-submit').set('text', 'Registering'); } else { $('sl-submit').set('text', 'Updating Profile'); } this.fireEvent('ajaxRequest'); new Request({ url: url, method: this.form.getProperty('method'), data : this.form.toQueryString(), evalScripts: this.options.ajaxEvalScripts, onFailure: function(instance){ this.fireEvent('ajaxFailure', instance); }.bind(this), onSuccess: function(result){ this.fireEvent('ajaxSuccess', result); if(this.options.ajaxResponseDiv){ var response = result.split(""); if(response[0] != "1"){ //Set that an error occurred $('sl-submit').errors.push(this.options.alerts.submit); this.addError($('sl-submit')); if(submission_type == 'ajnew_member') { $('sl-submit').set('text', 'Join Now'); } else { $('sl-submit').set('text', 'Update my profile'); } }else{ if(submission_type == 'ajnew_member') { // Registration successful trackOmnitureMembership("event4"); $(this.options.ajaxResponseDiv).set('html', response[2]); lightboxjs.buildForm(); //Update login $('login-button-text').innerHTML = 'Login'; $('ajres').innerHTML = response[1]; $('flogin').style.display = 'none'; $('ajres').style.display = 'block'; } else { //Successful URS update trackOmnitureMembership("event35"); $(this.options.ajaxResponseDiv).set('html', response[1]); } //Add event on close button $('sl-close').addEvent('click', function(e){ e.stop(); $('bl').dispose(); $('sl').dispose(); $each($$('.fc-tbx'), function(el){ el.dispose(); }); }); } } }.bind(this) }).send(); }, /* Function: onSubmit Private method Perform check on submit action */ onSubmit: function(event) { new Event(event).stop(); this.reinitialize(); this.validations.each(function(el) { if(!this.manageError(el,'submit')) this.form.isValid = false; }, this); (this.form.isValid) ? ((this.options.submitByAjax) ? this.submitByAjax() : this.form.submit()) : this.focusOnError(this.firstError); } });