document.write('<style type="text/css">#pc-links li.deck,#external-links,#location-fields{display:none}</style>');
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 links');
        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 ZDNet Australia');
        $('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', '<strong>'+msg+'</strong>');
    } else {
        targetElement.set('html', '<a href="/videos/">Latest videos</a> 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; i<sfEls.length; i++) {
        sfEls[i].onmouseover=function() { this.className+=' sfhover'; }
        sfEls[i].onmouseout=function() { this.className=this.className.replace(new RegExp(' sfhover\\b'), ''); }
    }
}


/*-------------------------------------------------------------------
CAROUSEL.JS
http://clientside.cnet.com/cnet.gf/docs/files3/common/layout-widgets/carousel-js.html
------------------------------------------------------------------- */
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?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(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?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\-\._\?\,\'\/\\\+&amp;%\$#\=~])*|.{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',"<span>" + obj[0].name + " : </span>" + 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',"<span>" + obj.name + " : </span>" + 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("<!-- AJLOGIN_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);
    }
});