/**
 * JReviews - Reviews Extension
 * Copyright (C) 2009 ClickFWD LLC
 * This is not free software, do not distribute it.
 * For licencing information visit http://www.reviewsforjoomla.com
 * or contact sales@reviewsforjoomla.com
**/ 
jreviews = 
{                            
    controlFieldListing: {}, // Make the class instance available to other scripts
    ajax_params: function() 
        {
            return '&Itemid='+jrPublicMenu; 
        },
    ajax_init: function()
        {
            jQuery(document).ready(function() 
                {               
                    /* Set jQuery ajax defaults */
                    jQuery.ajaxSetup({
                      url: s2AjaxUri, // pass controller/action as hidden fields in form data[controller],data[action]
                      global: true,
                      cache: false
                    });
                    
                    /* jQuery ajax actions */
                    jQuery().ajaxSend( function( r, s ) {
                        jQuery('#s2AjaxResponse').remove();    
                        jQuery("body").append('<div id="s2AjaxResponse" style="display:none;"></div>'); 
                    });
                    
                    jQuery().ajaxStop( function( r, s ) {
                    });
                });          
        }, 
    getScript: function(script,callback)
    {
        jQuery.ajax({type: "GET",url: script, success: function(){if(undefined!=callback) callback();},dataType: "script", cache: true});            
    }, 
    dispatch: function(options) 
        {       
            options = options || {};
            var method = undefined!=options.form_id ? 'POST' : 'GET';
            if(undefined!=options.method) method = options.method; 
            var data = undefined != options.controller ? jQuery.param({'data[controller]':options.controller,'data[action]':options.action}) : {};
            var type = options.type || "json";
            if(undefined != options.form_id)
            {
                var form = jQuery('#'+options.form_id);
                if(undefined != options.controller)
                {
                    form.find('input[name=data\\[controller\\]], input[name=data\\[action\\]]').remove();
                }
                data = form.serialize()+'&'+data;
            }
            if(options.data) data = data + '&' + jQuery.param(options.data);   
            jQuery.ajax({type: method, url: s2AjaxUri, data: data, success: function(res){ if(options.onComplete) options.onComplete(res); }, dataType: options.type}); 
        },      
    datepicker: function() 
        {              
            if('undefined' != typeof jQuery.datepicker){
                jQuery.datepicker.setDefaults({
                    showOn: 'button', 
                    buttonImage: datePickerImage, 
                    buttonImageOnly: true,
                    buttonText: 'Calendar',
                    dateFormat: 'yy-mm-dd',
                    changeMonth: true,
                    changeYear: true  
                    });    

                jQuery('.datepicker').datepicker();    
            }
        },
    discussion:
        {
            edit: function(element,options)
                {
                    jQuery(element).s2Dialog('jr_postEdit',{dialog:{width:'640px',height:'auto',title:options.title},dialogData:{url:'discussions/_edit/post_id:'+options.discussion_id}});                    
                },
            remove: function(element,options) 
                {
                    jQuery(element).s2Confirm(
                            {dialog:{title:options.title},
                             submitData:{'url':'discussions/_delete/post_id:'+options.discussion_id+'/token:'+options.token}
                            },options.text
                    );                    
                },    
            submit: function(element)
                {
                    jQuery(element).s2SubmitForm();
                },
            cancel: function(element,options)
                {
                    jQuery('#jr_postCommentFormOuter'+options.discussion_id).slideUp('slow',function(){
                        jQuery('#jr_postCommentAction'+options.discussion_id).slideDown('slow');
                    });                    
                },
            parentCommentPopOver: function()
                {				
					jQuery('.jr_popOver-target').each(function() {
						var post_id = jQuery(this).attr('name');
						var contentBox = jQuery(this).next();
						jQuery(this).tooltip({
							position: 'top left',
							tipClass: 'jr_tooltipBoxLight',
							delay: 500,
							opacity: 0.95,
							effect: 'slide',
							offset: [0, 10],
                            onBeforeShow: function(content){
                                if (contentBox.html() == "") {
                                    contentBox.html('<span class="jr_loadingMedium"></span>');
                                    jQuery.ajax({
                                        url: s2AjaxUri+'&url=discussions/getPost/'+post_id+jreviews.ajax_params(),
                                        type: 'GET',
                                        dataType: 'html',
                                        success: function(response){ contentBox.html(response); }
                                    });
                                }
                            }							
						});
					});					
                },                
            showForm: function(element,options)
                {
                    jQuery(element).parents('div:eq(0)').slideUp('slow',function(){
                        jQuery('#jr_postCommentHeader'+options.discussion_id).css('display','block');
                        jQuery('#jr_postCommentFormOuter'+options.discussion_id).slideDown('slow');
                    });             
                }      
        },
    field: 
        {
            addOption: function(element)
            {
                var $button = jQuery(element);
                var $field = $button.parent().siblings('select');
                var $text = $button.prev(':input');
                var parent_fname, parent_value;
                var value = $text.val();
                var controlledBy = '';

                if($field.data('controlledBy')) {
                    jQuery.each($field.data('controlledBy'),function(field,value){
                        parent_fname = field;
                        parent_value = value;
                        controlledBy = '|'+field+'|'+value;
                    });                        
                }

                var optionValue = value+'|click2add'+controlledBy;
                var $currOption = $field.children('option[value="' + optionValue+'"]');
                if(value != '' && $currOption.length == 0) {
                    $field
                        .append(jQuery("<option></option>")
                            .attr({
                                'value':optionValue,
                                'selected':'selected',
                                'data-ordering':99999, /* make sure it shows up last*/                            
                                'data-controlledBy':parent_fname,
                                'data-controlValue':parent_value
                            })
                            .text(value)
                        )
                        .trigger('change');
                    $text.val('');
                } 
                else if ($currOption.length == 1) { 
                    $currOption.attr('selected','selected');
                }
                
                $button.siblings('.jr_validation').remove();                 
            }
        },
    inquiry:
        {
            submit: function(element,options)
                {
                    jQuery('#jr_inquiryForm .jr_validation').hide();
                    var $spinner = jQuery(element).siblings('.jr_loadingSmall');
                    $spinner.fadeIn();
                    jQuery(element).attr('disabled','disabled');
                    jQuery.ajax({
                        url: s2AjaxUri,
                        type: 'POST',
                        dataType: 'json',
                        data: jQuery('#jr_inquiryForm').serialize()
                        ,success: function(s2Out){
                            if(s2Out.error != undefined){ 
                                jQuery('#jr_inquiryResponse').html(s2Out.error);
                                jQuery('#jr_inquirySubmit').removeAttr('disabled');                          
                            }
                           if(s2Out.html != undefined){                                        
                                jQuery('#jr_inquiryForm').fadeOut('slow',function(){
                                   jQuery(this).html(options.submit_text).slideDown(); 
                                });
                            }                             
                            $spinner.hide();
                        }
                    });                    
                }
        },
    favorite:
        {
            add: function(element,options)
                {
                    jQuery(element).s2SubmitNoForm('listings','_favoritesAdd','data[listing_id]='+options.listing_id);                       
                },
            remove: function(element,options)
                {
                    jQuery(element).s2SubmitNoForm('listings','_favoritesDelete','data[listing_id]='+options.listing_id);                       
                } 
        },
    module: 
        {
            pageNavInit: function(options)
                {
                    // options is object with module_id, page, page_count, columns, orientation, slideshow, slideshow_interval, arrows
					var o = options;
                    var $jr_modSlider = jQuery('div#jr_modSlider'+o.module_id);
					var $jr_modContainer = $jr_modSlider.find('.jr_modContainer').first().detach();	
					var $jr_modPrev = jQuery('a#jr_modPrev'+o.module_id);
					var $jr_modNext = jQuery('a#jr_modNext'+o.module_id);
					
					// fix plugin initialization when outputted inside CB tab
					var CBTabHidden = false;
					if ($jr_modSlider.parents('.tab-page').length) {
						var CBTab = $jr_modSlider.parents('.tab-page');
						if (CBTab.is(':hidden')) {
							CBTab.show();
							CBTabHidden = true;
						}
					}
					
					// fix related widget initialization when outputted inside a tab.
					var JRTabHidden = false;
					if ($jr_modSlider.parents('#relatedTab').length) {
						var JRTab = $jr_modSlider.parents('#relatedTab');
						if (JRTab.is(':hidden')) {
							JRTab.show();
							JRTabHidden = true;
						}
					}

					if (o.arrows === 'side') {
						$jr_modSlider.width($jr_modSlider.parent().width()-57);
					} else {
						$jr_modSlider.width($jr_modSlider.parent().width());
					}
					
					var page_width = $jr_modSlider.width();					
					$jr_modContainer.width(page_width);
					
					var listItems = $jr_modContainer.find('.listItem');
					if(o.columns > listItems.length) o.columns = listItems.length;
					listItems.each(function(){
						jQuery(this).width((page_width/o.columns)-10);
					});		

					$jr_modSlider.find('div.jr_modItems').append($jr_modContainer);
					
					var pageHeight = $jr_modContainer.height();			
					$jr_modSlider.height(pageHeight);
					
					if (o.arrows === 'side') {
						var arrows_margin =(($jr_modSlider.height()/2)-11);
						$jr_modPrev.css('marginTop',arrows_margin);
						$jr_modNext.css('marginTop',arrows_margin);
					}

					if (CBTabHidden) {
						CBTab.hide();
					}
					
					if (JRTabHidden) {
						JRTab.hide();
					}
								
                    var modSlider = jQuery('div#jr_modSlider'+o.module_id).scrollable({
                        clickable: false,
                        circular: o.slideshow === 1 && o.page_count > 1 ?  true : false,
                        interval: 0,
                        easing: 'swing',
                        speed: 1000,
                        items: '.jr_modItems',
                        prev: '.jr_modPrev',
                        next: '.jr_modNext',				
                        disabledClass: 'jr_modDisabled',	
                        keyboard: false,
						vertical: o.orientation === 'vertical' ? true : false,
                        onSeek: function() {
							var pageAmount = this.getSize();
							var pageIndex = this.getIndex();

                            if(pageAmount == 2 && o.page_count > 2) {
                                // If user clicks on the forward arrow, load two pages the first time to keep two in queue
								jreviews.module.getPage(o.module_id, o.columns);  							
                            }
                            if((pageIndex + 2) >= pageAmount && (pageAmount+1) < o.page_count) {
                                // Always keep two pages in queue and don't do anything if the last page had already been loaded
                                setTimeout('jreviews.module.getPage('+o.module_id+','+o.columns+');',1000); // delay so 2nd call always finishes last
							}
							jreviews.module.setDimensions(o.module_id);
                        }
                    });			
					
					if (o.slideshow === 1 && o.page_count > 1) {
						modSlider.autoscroll({ autoplay: true, interval: o.slideshow_interval });
					}	
					
                    if(o.page==1 && o.page_count > 1){                      
						jreviews.module.getPage(o.module_id, o.columns);                        
                    }				
                },
			setDimensions: function(module_id)
				{				
					var $jr_modSlider = jQuery('div#jr_modSlider'+module_id);				
					var api = jQuery("div#jr_modSlider"+module_id).data("scrollable");				
					var currentPage = $jr_modSlider.find('.jr_modContainer.pg'+api.getIndex());
					var page_width = $jr_modSlider.width();					
					currentPage.width(page_width);
					var pageHeight = currentPage.outerHeight();				
					$jr_modSlider.animate({'height': pageHeight}, 300);
				},
            getPage: function(module_id, columns)
                {
                    var controller = jQuery('#jr_modController'+module_id).val();
                    var action = jQuery('#jr_modAction'+module_id).val();
                    var extension = jQuery('#jr_modExtension'+module_id).val();
                    var page = parseInt(jQuery('#jr_modPage'+module_id).val()) + 1;
                    var limit = jQuery('#jr_modLimit'+module_id).val();
                    var page_count = jQuery('#jr_modPageCount'+module_id).val();                    
                    var $auto_ids = jQuery('#jr_modAutoIds'+module_id);
                    var auto_ids = $auto_ids.length ? jQuery('#jr_modAutoIds'+module_id).val() : '';
                    jQuery('#jr_modPage'+module_id).val(page); 
                    
                    jQuery.ajax({
                       type: 'POST',                                                                                                          
                       url: s2AjaxUri,
                       data: 'data[auto_ids]='+auto_ids+'&data[controller]='+controller+'&data[action]='+action+'&data[extension]='+extension+'&data[module_page]='+page+'&data[module_limit]='+limit+'&data[module_id]='+module_id+jreviews.ajax_params(),
                       dataType: 'json',
                       success: function(s2Out)
                       {
							var $html = jQuery(s2Out.response).appendTo('body');
										
							var $jr_modSlider = jQuery('div#jr_modSlider'+module_id);

							var page_width = $jr_modSlider.width();
							$html.width(page_width);
							
							var listItems = $html.find('.listItem');
							if(columns > listItems.length) columns = listItems.length;
							listItems.each(function(){
								jQuery(this).width((page_width/columns)-10);
							});
							
							$html.detach();
							
                            // get handle to scrollable api 
                            var api = jQuery("div#jr_modSlider"+module_id).data("scrollable"); 

                            // append new item
							api.addItem($html);

							var pages = api.getItems();
							var index = 0;
							pages.each(function(){
								jQuery(this).addClass('pg'+index);
								index++;
							});							
							
							if (api.getIndex() + 1 < page_count) {
								jQuery('#jr_modNext'+module_id).removeClass('jr_modDisabled');
                            }
                       }
                    });                    
                }              
        },
    lightbox: function()
        {
            if(jQuery('a.fancybox').size()) 
                {
                    jQuery("a.fancybox").fancybox({
                        'speedIn': 1000, 
                        'speedOut': 1000,
						'easingIn' : 'easeOutBack',
						'easingOut' : 'easeInBack',
						'transitionIn' : 'elastic',
						'transitionOut' : 'elastic',				
                        'overlayShow': true,
                        'opacity': true,
                        'padding': 4
                    }); 
                }                
        },        
    listing: 
        {
            claim: function (element,options)
                {
                    jQuery(element).s2Dialog('jr_claimListing',{
                            dialog:{width:'640px',height:'auto',title:options.title},
                            dialogData:{url:'claims/create/listing_id:'+options.listing_id}
                    });
                },
            remove: function (element,options)
                {
                    var data = {'url':'listings/_delete/id:'+options.listing_id}
                    data[options.token] = 1;
                    jQuery(element).s2Confirm({'dialog':{'title':options.title},'submitData':data},options.text);   
                },  
            manageAction: function(element,options,action)
                {
                    var data = {'data[Listing][id]':options.listing_id};
                    data[options.token] = 1;
                    jreviews.dispatch({'method':'get','type':'json','controller':'listings','action':action,'data':data,'onComplete':function(res){
                        if(!res.error)
                        {
                            var $element = jQuery(element);
                            var state = $element.is('.jr_published') ? 'unpublished' : 'published';
                            $element.removeClass().addClass('jr_'+state).html(options[state]);
                        } else 
                            s2Alert(res.msg);
                    }});
                },
            feature: function (element,options)
                {
                    jreviews.listing.manageAction(element,options,'_feature');
                },   
            frontpage: function (element,options)
                {
                    jreviews.listing.manageAction(element,options,'_frontpage');
                },                                                  
            publish: function (element,options)
                {
                    jreviews.listing.manageAction(element,options,'_publish');
                },              
            submit: function (element)
                {
                    jQuery('#controller, #action').remove();
                    var form = jQuery('#jr_listingForm');
                    
                    /* copy text of selected section/cat to hidden fields for use in Geomaps */
                    var count;
                    var selected = [];
                    var category;
                    var parent_category;
                    
                    jQuery("select[id^=cat_id]").each(function()
                    {  
                        var value = jQuery(this).val();
                        if(value > 0) selected.push(jQuery(this));
                    });
                    count = selected.length;
                    if(count == 1) 
                    {
                        form.find('#category').val(selected[0].find('option:selected').text().replace(/(- )+/,''));
                    }
                    else if(count > 1)
                    {
                        form.find('#category').val(selected[count-1].find('option:selected').text().replace(/(- )+/,''));
                        form.find('#parent_category').val(selected[count-2].find('option:selected').text().replace(/(- )+/,''));
                    }                    
                    form.find('#section').val(form.find('#section_id option:selected').text());
                    /* end copy text of selected section/cat to hidden fields for use in Geomaps */
                    
                    jQuery('.wysiwyg_editor').RemoveTinyMCE();
                    jQuery(element).siblings('.jr_loadingSmall').fadeIn();
                    jQuery('#jr_listingForm .button').attr('disabled','disabled');
                    document.jr_listingForm.submit();
                },
            submitSection: function (element)
                {
                    var $parentForm = jQuery('#jr_listingForm');
                    $parentForm.find('#cat_id1').val(0);
                    $parentForm.append('<input type="hidden" id="controller" name="data[controller]" value="listings" />');
                    $parentForm.append('<input type="hidden" id="action" name="data[action]" value="_loadCategories" />');
                    jQuery(element).s2SubmitForm();
                    jQuery('#controller, #action').remove();
                },
            submitCategory: function (element)
                {              
                    jQuery('.wysiwyg_editor').RemoveTinyMCE(); /* required so the editor can be added again on new section/category changes*/
                    var $parentForm = jQuery('#jr_listingForm');                   
                    $parentForm.append('<input type="hidden" id="action" name="data[action]" value="_loadForm" />');
                    $parentForm.append('<input type="hidden" id="controller" name="data[controller]" value="listings" />');
                    $parentForm.append('<input type="hidden" id="hidden_cat_id" name="data[catid]" value="'+element.value+'" />'); /*J16*/
                    $parentForm.append('<input type="hidden" id="cat_level" name="data[level]" value="'+element.id+'" />');  /*J16*/
                    var callbacks = {
                        onAfterResponse: function(){   
                            jQuery('.wysiwyg_editor').tinyMCE();
                            // Facebook integration           
                            if(jreviews.facebook.enable == true) {    
                                jreviews.facebook.checkPermissions({
                                    'onPermission':function(){jreviews.facebook.setCheckbox('jr_submitListing',true);},
                                    'onNoSession':function(){jreviews.facebook.setCheckbox('jr_submitListing',false);}
                                });
                            };   
                            // Load custom field data
                            if(element.value > 0) {
                                jreviews.controlFieldListing = new jreviewsControlField('jr_listingForm','hidden_cat_id');
                                jreviews.controlFieldListing.loadData({'entry_id':jQuery('#listing_id','#jr_listingForm').val(),'value':false,'page_setup':true,'referrer':'listing'});
                                if(jQuery('#reviewForm').length) {
                                    var $controlFieldReview = new jreviewsControlField('reviewForm','hidden_cat_id');
                                    $controlFieldReview.loadData({'fieldLocation':'Review','entry_id':0,'value':false,'page_setup':true,'referrer':'review'});
                                }  
                            }
                        }
                    };
                    jQuery(element).s2SubmitForm(callbacks);
                    jQuery('#controller, #action, #hidden_cat_id, #cat_level').remove();
                },
            setMainImage: function(element,options)
                {
                    jQuery(element).s2SubmitNoForm('listings','_imageSetMain','data[listing_id]='+options.listing_id+'&data[image_path]='+options.image_path+'&'+options.token+'=1');                    
                },
            deleteImage: function(element,options)
                {
                    var data =  {
                        'url':'listings/_imageDelete/',
                        'data[listing_id]':options.listing_id,
                        'data[delete_key]':options.delete_key,
                        'data[image_path]':options.image_path
                    };
                    data[options.token] = 1;
                    jQuery(element).s2Confirm({'dialog':{'title':options.title},'submitData': data},options.text);                 }        
        },
     review:
        {             
            starRating: function(suffix,inc)
                {
                    jQuery("div[id^='jr_stars"+suffix+"']").each(function(i) {
                        if( this.id != '' ) {
                            jQuery(this).parent().next().append('<span id="jr-rating-wrapper-' + this.id + '"></span>');
                            var splitStars = 1/inc; // 2 for half star ratings
                            jQuery("#"+this.id).stars({
                                split: splitStars,
                                captionEl: jQuery("#jr-rating-wrapper-" + this.id )
                            });
                        }
                    });                        
                },
            showForm: function(element)
                {
                    jQuery(element).hide('slow',function(){
                        jQuery('#jr_review0Form').slideDown(1000,function(){
                            jQuery('#jr_review0Form').scrollTo({duration:1000,offset:-50});
                        });
                    });                
                },
            hideForm: function()
                {
                    jQuery('#review_button').show();
                    jQuery('#review_button').scrollTo({duration:500,offset:-50}, function(){jQuery('#jr_review0Form').fadeOut('slow');});                
                },
            edit: function(element,options)
                {
                    jQuery(element).s2Dialog('jr_review'+options.review_id,
                        {
                            dialog:{width:800,height:600,title:options.title},
                            dialogData:{url:'reviews/_edit/review_id:'+options.review_id}
                        });
                },
            submit: function(element)
                {
                    jQuery(element).s2SubmitForm();                    
                },
            reply: function(element,options)
                {
                    jQuery(element).s2Dialog('jr_ownerReply',
                        {
                            dialog:{width:'640px',height:'auto',title:options.title},
                            dialogData:{url:'owner_replies/create/review_id:'+options.review_id}
                        });                    
                },        
            voteNo: function(element,options)
                {
                    jQuery(element).s2SubmitNoForm('votes','_save','data[Vote][review_id]='+options.review_id+'&data[Vote][vote_no]=1');                    
                }, 
            voteYes: function(element,options)
                {
                    jQuery(element).s2SubmitNoForm('votes','_save','data[Vote][review_id]='+options.review_id+'&data[Vote][vote_yes]=1');                    
                },
            rebuildRanksTable: function() 
                {
                    jreviews.dispatch({'controller':'reviews','action':'_rebuildRanksTable'});
                }
        },
     report:
        {
            showForm: function(element,options)
                {
                    jQuery(element).s2Dialog('jr_report',
                        {
                            dialog:{width:'640px',height:'auto',title:options.title},
                            dialogData:{url:'reports/create/listing_id:'+options.listing_id+'/review_id:'+options.review_id+'/post_id:'+options.post_id+'/extension:'+options.extension}
                        });                    
                }  
        },           
     search:
         {
            showRange: function(element,field) 
            {
                if(jQuery(element).val()=='between'){
                    jQuery('#'+field+'Div').fadeIn();
                } else {
                    jQuery('#'+field+'Div').fadeOut().find(':input').val('');                
                }    
            }
         },
     tooltip: function() 
         {
            if('undefined' != typeof jQuery.tools && 'undefined' != typeof jQuery.tools.tooltip)
            {     
                jQuery('.jr_infoTip').not('.jrTipInit').tooltip({
                    position: 'center right',
                    tipClass: 'jr_tooltipBox',
                    delay: 0,
                    opacity: 0.95,
                    effect: 'slide',
                    offset: [0, 10]
                }).addClass('jrTipInit');
            }
         },    
     user:
        {
            autocomplete: function(element,options)
                {
                    var defaults = {
                        'target_user_id' : 'jr_reviewUserid',
                        'target_name'   : 'jr_reviewName',
                        'target_username' : 'jr_reviewUsername',
                        'target_email' : 'jr_reviewEmail'
                    };

                    var settings = jQuery.extend(defaults, options);

                    element.autocomplete({
                            source: function( request, response ) {
                                var cache = element.data('cache') || {};
                                var term = request.term;
                                if ( term in cache ) {
                                    response( cache[ term ] );
                                    return;
                                }
                                jreviews.dispatch({'type':'json','controller':'users','action':'_getList','data': {"data[value]": term},'onComplete':function( data ) { 
                                    cache[ term ] = data;
                                    element.data('cache',cache)
                                    response(data);
                                }});
                            },
                            select: function( event, ui) {  
                                jQuery('#'+settings.target_user_id).val(ui.item.id); 
                                jQuery('#'+settings.target_email).val(ui.item.email); 
                                jQuery('#'+settings.target_name).val(ui.item.name); 
                                jQuery('#'+settings.target_username).val(ui.item.username); 
                            },
                            minLength: 2
                    });
                    jQuery('.ui-autocomplete').css('white-space','nowrap');   
                }
        },
    facebook:
    {
        enable: false,
        permissions: false, 
        uid: null,
        init: function(options) {
            if(undefined!=options) jreviews.facebook.options = options;    
            if('undefined'==typeof(FB)) {  // Load facebook js only if not already loaded
                jQuery.ajax({
                    type: "GET",
                    url: "http://connect.facebook.net/en_US/all.js",
                    success: function(){    
                        FB.init({appId: options.appid, status: false, cookie: true, xfbml: true});  
                        if(undefined!=options.success) options.success();
                    },
                    dataType: "script",
                    cache: true
                });            
            } else if(undefined!=options.success) {
                FB.init({appId: options.appid, status: false, cookie: true, xfbml: true});  
                options.success();                
            }
        },
        login: function()
        {     
            if(null == jreviews.facebook.uid) {
                FB.login(function(response) {
                    if (response.session && response.perms) {
                          // user is logged in and granted some permissions.
                          jreviews.facebook.uid = response.session.uid;
                    } else {
                        jQuery('#fb_publish').attr('checked',false);
                    } 
                }, {perms:'publish_stream'});              
            }
        },
        checkPermissions: function(options) {
            if(undefined==options) options = {};
            jQuery("body").data('fb.options',options);   
            
            if(typeof(FB) == 'undefined') {
                jreviews.facebook.permissions = false;
                return;
            }
            
            FB.getLoginStatus(function(response) 
            {                   
                if(response.session) 
                {         
                      // logged in and connected user
                      jreviews.facebook.uid = response.session.uid;
                      FB.api({
                                method: 'fql.query',
                                query: 'SELECT publish_stream FROM permissions WHERE uid= ' + response.session.uid
                            },
                            function(response) { 
                                if(!response[0].publish_stream)
                                {
                                    // re-request publish_stream permission
                                    FB.login(function(response) {
                                        if (response.session && response.perms) 
                                        {                 
                                            // user is logged in and granted some permissions.
                                            var options = jQuery("body").data('fb.options');
                                            if(undefined!=options.onPermission) options.onPermission();  
                                            jreviews.facebook.permissions = true;
                                        }
                                    },{perms:'publish_stream'});                
                                } else {                
                                    var options = jQuery("body").data('fb.options');
                                    if(undefined!=options.onPermission) options.onPermission();                                            
                                    jreviews.facebook.permissions = true;
                                }
                          }
                    );  
                } 
                else   // User not logged in or has not granted publish_stream permission
                {   
                    jreviews.facebook.permissions = false;
                    if(undefined!=options.onNoSession) options.onNoSession();  
                }
            });    
        },
        setCheckbox: function(id,hidden) {
            if(hidden == true && !jreviews.facebook.options.optout) {                                                                                       
                jQuery('#'+id).before('<input id="fb_publish" name="data[fb_publish]" value="1" type="hidden"/>');                                                                                      
            }
            else
            {
                var fbcheckbox = '<input id="fb_publish" name="data[fb_publish]" type="checkbox" onclick="if(this.checked) jreviews.facebook.login();" />'
                    +'&nbsp;<div class="fb_button fb_button_medium"><span class="fb_button_text"><label for="fb_publish">'
                    +jreviews.facebook.options.publish_text
                    +'</label></span></div><br /><br />';  
                jQuery('#'+id).before(fbcheckbox);            
                if(hidden && jreviews.facebook.options.optout) jQuery('#fb_publish').attr("checked","checked");
            }    
        }
    },
    common:
    {
        initForm: function(form_id)
        {
            var parentForm = jQuery('#'+form_id);
            var captchaDiv = parentForm.find('div.jr_captcha');
            parentForm.one('mouseover',function() {
                jQuery(parentForm).s2SubmitNoForm('common','_initForm','data[form_id]='+form_id+'&data[captcha]='+captchaDiv.length);
                parentForm.find('button').removeAttr('disabled');
            });
        },
        inArray: function (needle, haystack) {
            var length = haystack.length;
            for(var i = 0; i < length; i++) {
                if(haystack[i] == needle) return true;
            }
            return false;
        }        
    }                     
}
