chaturbatefilter

chaturbate-filter

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name           chaturbatefilter
// @version 1.0
// @namespace      chaturbate_filter
// @description    chaturbate-filter
// @include        http://chaturbate.com/*
// @include        http://*.chaturbate.com/*
// @grant          GM_xmlhttpRequest
// @require         http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js
// @require         http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js
/*
 @require         https://raw.github.com/jaysalvat/buzz/master/dist/buzz.min.js
*/

// ==/UserScript==

version = 1.0;

var pageType = 0;
var startTime = +new Date();

var mySound = new buzz.sound( "http://soundjax.com/reddo/21862%5Ebeep1.mp3");
$(function() {
    $( "#dialog" ).dialog({
      autoOpen: false,
      autoResize: true,
      height: 'auto',
      width: 580,
      show: {
        effect: "blind",
        duration: 100
      },
      hide: {
        duration: 1000
      },
      position: {
        my: 'left',
        at: 'center',
        of: $('#header')
      },
      buttons: {
        "Close": function() {
          $( this ).dialog( "close" );
        },
        "Clear All": function() {
              var targetNodes =  $( "#ExhibitionistCams" ).find(".details");    
              if (targetNodes && targetNodes.length > 0) {
                  targetNodes.each ( function () {
                      removeFromAlert(getName($(this)));
                  } );
              }
              $( this ).dialog( "close" );
          }
      }, 
      open: function (event, ui) {
        $('#dialog').css('overflow', 'hidden'); 
          
      }
    });
 
    $( "#opener" ).click(function() {
      $( "#dialog" ).dialog( "open" );
    });    
    
    
    
    
    $( "#followeddialog" ).dialog({
      autoOpen: false,
      autoResize: true,
      height: 'auto',
      width: 580,
      show: {
        effect: "blind",
        duration: 100
      },
      hide: {
        duration: 1000
      },
      position: {
        my: 'left',
        at: 'center',
        of: $('#header')
      },
      buttons: {
        "Close": function() {
          $( this ).dialog( "close" );
        }
      },  
      open: function (event, ui) {
        $('#followeddialog').css('overflow', 'hidden'); 
      }
    });
 
    $( "#followeddialogopener" ).click(function() {
      var targetNodes =  $( "#FollowedCams" ).find(".details");
      if (targetNodes && targetNodes.length > 0) {
          targetNodes.each ( function () {
              $( "#FollowedCams" ).find('#'+getName($(this))).remove();
          } );
      }
      
      $.get( '/followed-cams/', function( data ) {
        var dataObj = $('<div/>').html(data);
        dataObj.find(".details").each( function() {
            var thisCam = createNewUserCam($(this));
            if(shouldShowCam(thisCam) && thisCam.type != 3) {
                $("#FollowedCams").append(thisCam.cam.parent());
            }
        }); 
	  }).fail(function() {
        alert( "error" );
      });
        
      $( "#followeddialog" ).dialog( "open" );
    });
    
    $( "#report_popupdialog" ).dialog({
      autoOpen: false,
      autoResize: true,
      height: 'auto',
      width: 400,
      show: {
        effect: "blind",
        duration: 100
      },
      hide: {
        duration: 1000
      },
      position: {
        my: 'left',
        at: 'center',
        of: $('#header')
      },
      buttons: {
        "Close": function() {
          $( this ).dialog( "close" );
        }
      },  
      open: function (event, ui) {
        $('#report_popupdialog').css('overflow', 'hidden'); 
      }
    });
 
    $( "#report_popupopener" ).click(function() {
       logit("report_popupopener clicked");
       $("#report_popup form").attr("action", "/abuse/report/lionrauuuhl/");        
       $( "#report_popupdialog" ).dialog( "open" );
    });
  });

function addCheckboxes() {      
    var sort, user_informationID = $("#user_information"), logo_zone = $(".logo-zone");
    
        sort = 
            [
             '  <div id="user_information" style="float:right; font-size: 4pt" align="right" >',
             '    <div class="top" align="middle">',
             '      <label class="username"><strong><font color="#e45900">Sort</font><strong></label>',
             '    </div>',
                '    <div class="bottom" style="height:40px; padding:0px 4px 4px 0px;">',
             '      <table>',
             '        <tr height="2px">',
             '          <td><label id="showFemaleLabel"><input type="checkbox"            name="showFemale"                            id="showFemale" checked           />Show Females</label></td>',
             '          <td><label id="showCouplesLabel"><input type="checkbox"           name="showCouples"                           id="showCouples"                  />Show Couples</label></td>',
             '          <td><label id="showOnlyOnlineLabel"><input type="checkbox"        name="showOnlyOnline"                        id="showOnlyOnline"               />Show Only Online</label></td>',
             '          <td><label id="showOnlyNewLabel"><input type="checkbox"           name="showOnlyNew"                           id="showOnlyNew"                  />Show Only New</label></td>',
             '          <td><label id="showOnly1825Label"><input type="checkbox"          name="showOnly1825"                          id="showOnly1825"                 />Show 18-25</label></td>',
             '          <!--td><button id="followeddialogopener">Followed Cams</button></td-->',
             '        </tr>',
             '        <tr height="2px">',
             '          <td><label id="showMaleLabel"><input type="checkbox"              name="showMale"              id="showMale"               />Show Males</label></td>',
             '          <td><label id="showTranssexualLabel"><input type="checkbox"       name="showTranssexual"       id="showTranssexual"        />Show Transsexual</label></td>',
             '          <td></td>',
             '          <td><label id="showOnlyExhibitionistLabel"><input type="checkbox" name="showOnlyExhibitionist" id="showOnlyExhibitionist"  />Show Only Exhibitionist</label></td>',
             '          <td><label id="showOnly2635Label"><input type="checkbox"          name="showOnly2635"          id="showOnly2635"           />Show 26-35</label></td>',
             '          <!--td><button id="report_popupopener">Report</button></td-->',
             '        </tr>',
             '      </table>',
             '    </div>',
             '</div>',
                
                
             '<div id="dialog" title="New Exhibitionist Cams" >',
                '    <div id="ExhibitionistCams" class="list" style="width: 100%; min-width: 0;"></div>',
			 '</div>',
                
             '<div id="followeddialog" title="Followed Cams" >',
             '    <div id="FollowedCams" class="list"></div>',
			 '</div>',
               
             '<div style="display:none" id="report_popupdialog" title="Report Abuse">',
             ' <form method="post" action="">',
             ' <div class="report_formborder">',
             '   <p class="report_select">Choose a category:',
             '   <select name="category" id="id_abuse_category_select">',
             '     <option value="">---</option>',
             '     <option value="recording">Recorded video</option>',
             '     <option value="underage">Broadcaster underage</option>',
             '     <option value="advertising">Broadcaster is advertising</option>',
             '     <option value="gender">Broadcaster is wrong gender</option>',
             '     <option value="other">Other</option>',
             '   </select></p>',
             '   <p class="report_comments">Additional Comments:<br />',
             '     <textarea id="id_additional_comments" name="additional_comments" draggable="false"></textarea>',
             '   </p>',
             '   <div class="button_abuse_report" style="width: auto;">',
             '     <a href="#" class="abuse_report_button" id="abuse_report_button" style="color:#FFF;">REPORT</a>',
             '   </div>',
             '   <div class="button_abuse_cancel">',
             '     <a href="#" class="abuse_cancel_button" id="abuse_cancel_button" style="color:#FFF;">CANCEL</a>',
             '   </div>',
             ' </div>',
             ' </form>',
             '</div>',
                
             '<div id="OtherPages"><h2>Cams From Other Pages</h2><div id="OtherPagesInside" class="list"></div></div>',
			 
			 '<div id="BannedCams"><h2>Banned Cams</h2><div id="BannedCamsInside" class="list"></div></div>',
             
            ].join('\n');
                
        if (typeof user_informationID.html() === "undefined") {
           logo_zone.before(sort);                  
        } else {
        	user_informationID.before(sort);      
        }
        
        $('#OtherPages').hide();
		$('#BannedCams').hide();
        
        $('#showFemale').click(function() {
            saveCheckboxSettings();
            refreshThePeopleList();
        });
        $('#showMale').click(function() {
            saveCheckboxSettings();
            refreshThePeopleList();
        });
        $('#showCouples').click(function() {
            saveCheckboxSettings();
            refreshThePeopleList();
        });   
        $('#showTranssexual').click(function() {
            saveCheckboxSettings();
            refreshThePeopleList();
        });  
        $('#showOnly1825').click(function() {
            saveCheckboxSettings();
            refreshThePeopleList();
        });
        $('#showOnlyOnline').click(function() {
            saveCheckboxSettings();
            refreshThePeopleList();
        });
        $('#showOnly2635').click(function() {
            saveCheckboxSettings();
            refreshThePeopleList();
        });        
        $('#showOnlyNew').click(function() {
            if($('#showOnlyNew').attr('checked')) {
              $('#showOnlyExhibitionist').attr('checked', false);
            }
            saveCheckboxSettings();
            refreshThePeopleList();
        });
        $('#showOnlyExhibitionist').click(function() {
            if($('#showOnlyExhibitionist').attr('checked')) {
              $('#showOnlyNew').attr('checked', false);
            }
            saveCheckboxSettings();
            refreshThePeopleList();
        });
        
        restoreCheckboxSettings();
}

function showHideCheckboxes() {
   if (pageType==7) {
       toggleCheckbox($('#showOnlyExhibitionist'),$('#showOnlyExhibitionistLabel'),false);
       toggleCheckbox($('#showOnlyNew'),$('#showOnlyNewLabel'),false);
   } else {
       toggleCheckbox($('#showOnlyExhibitionist'),$('#showOnlyExhibitionistLabel'),true);
       toggleCheckbox($('#showOnlyNew'),$('#showOnlyNewLabel'),true);
   }
    
   if (pageType==2 || pageType==3 || pageType==4 || pageType==5) {
       toggleCheckbox($('#showFemale'),$('#showFemaleLabel'),false);
       toggleCheckbox($('#showMale'),$('#showMaleLabel'),false);
       toggleCheckbox($('#showCouples'),$('#showCouplesLabel'),false);
       toggleCheckbox($('#showTranssexual'),$('#showTranssexualLabel'),false);
   } else {
       toggleCheckbox($('#showFemale'),$('#showFemaleLabel'),true);
       toggleCheckbox($('#showMale'),$('#showMaleLabel'),true);
       toggleCheckbox($('#showCouples'),$('#showCouplesLabel'),true);
       toggleCheckbox($('#showTranssexual'),$('#showTranssexualLabel'),true);
   }
    
    if(pageType==6) {
       toggleCheckbox($('#showOnlyOnlineLabel'),$('#showOnlyOnline'),true);
    } else {
        toggleCheckbox($('#showOnlyOnlineLabel'),$('#showOnlyOnline'),false);
    }
}

function getPageType() {
    // 1= Performer Page
    // 2= Female Page
    // 3= Male Page
    // 4= Couple Page
    // 5= Transsexual Page
    // 6= Followed Page
    // 7= Exhibitionist Page
    // 0= other
    var result = 0, activeTab = $(".active");
    if(activeTab.html()!=null) {
        if (activeTab.html().indexOf('s Cam') != -1) {
            result = 1;
        } else if (activeTab.html().indexOf('<a href="/female-cams/">FEMALE</a>') != -1) {
            result = 2;
        } else if (activeTab.html().indexOf('<a href="/male-cams/">MALE</a>') != -1) {
            result = 3;
        } else if (activeTab.html().indexOf('<a href="/couple-cams/">COUPLE</a>') != -1) {
            result = 4;
        } else if (activeTab.html().indexOf('<a href="/transsexual-cams/">TRANSSEXUAL</a>') != -1) {
            result = 5;
        } else if (activeTab.html().indexOf('<a href="/followed-cams/" class="followed">') != -1) {
            result = 6;
        }  else {
            $(".endless_page_template").each(function () {
                if ($(this).find(":nth-child(1)").html().indexOf('<h2>Exhibitionist Cams</h2>') != -1) {
                    result = 7;
                }
            });
        }
    }
    return result;
}

function isBetween18And25(age) {
    var ageValues = ["18","19", "20", "21", "22", "23", "24", "25", "99" ];
    return ageValues.indexOf(age) > -1;
}

function isBetween26And35(age) {
    var ageValues = ["26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "99" ];
    return ageValues.indexOf(age) > -1;
}

function saveCheckboxSettings() {
    var checkboxSettings = $(':checkbox').map(function () {return this.checked;}).get().join();
    createCookie('checkboxSettings',checkboxSettings);  
}

function restoreCheckboxSettings() {
    var checkboxSettings = readCookie('checkboxSettings');
    if(checkboxSettings) {
      $(checkboxSettings.split(',')).each(function (i) {
          $(':checkbox:eq(' + i + ')').attr('checked', (this.toString() === 'true'));
      });
    }
}

function getAge(jNode) {
    var age = "99";
    if(jNode.find('.age')) {
        age = jNode.find('.age').text();
    }  
    return age;
}

function getName(jNode) {
    var name = "";
    if(jNode.find('.title')) {
        name = jNode.find('.title').find('a').text();
    }  
    return name;
}

function getGender(jNode) {
    // 0=error
    // 1=male
    // 2=female
    // 3=couple
    // 4=Transsexual
    var result = 0, span = jNode.find('.title span');
    if (span && span.hasClass('genderm')) {
        result = 1;
    } else if (span && span.hasClass('genderf')) {
        result = 2;
    } else if (span && span.hasClass('genderc')) {
        result = 3;
    } else if (span && span.hasClass('genders')) {
        result = 4;
    }
    return result;
}

function getType(jNode) {
    // 0=other
    // 1=new
    // 2=EXHIBITIONIST
    // 3=OFFLINE
    // 4=
    var result = 0;
    if (jNode.parent().html().indexOf('<div class="thumbnail_label thumbnail_label_c_new">NEW</div>') != -1) {   
        result = 1;
    } else if (jNode.parent().html().indexOf('<div class="thumbnail_label thumbnail_label_exhibitionist">EXHIBITIONIST</div>') != -1) {
        result = 2;
    } else if (jNode.parent().html().indexOf('<div class="thumbnail_label thumbnail_label_offline">OFFLINE</div>') != -1) {
        result = 3;
    }
    return result;
}
        
function userCam(cam,name,gender,age,type,hidden) {
    cam.parent().attr('id',name);
    var that= this;
	this.cam=cam;
	this.name=name;
	this.gender=gender;
	this.age=age;
	this.type=type;
	this.hidden=hidden;
    this.getGenderString=function() {
        var result = "Unknown";
        if (that.gender==1) {
            result = "Male";
        } else if (that.gender==2) {
            result = "Female";
        } else if (that.gender==3) {
            result = "Couple";
        } else if (that.gender==4) {
            result = "Transsexual";
        } 
        return result;
    };
    this.href=cam.find('.title a').attr('href');
    this.hide=function() {
        cam.parent().hide();
        hidden=true;
    };
    this.show=function() {
        cam.parent().show();
        hidden=false;
    };
    this.getCamClone=function() {
        return cam.parent().clone();
    };
    var report = '<li id="reportButton"><button id="report_popupopener">Report</button></li>';
    //if(this.cam.find('.sub-info #reportButton').length==0)
      //this.cam.find('.sub-info .cams').after(report);
}
    

function createNewUserCam(jNode) {
    return new userCam(jNode,getName(jNode),getGender(jNode),getAge(jNode),getType(jNode),false); 
}

function preProcessCam(jNode) {
    return createNewUserCam(jNode);
}

function shouldShowCam(userCam) {
    var result = true;
    if (pageType!=2 && pageType!=3 && pageType!=4 && pageType!=5) {
        if (userCam.gender==1) {
            if(!isChecked($('#showMale'))) {
                result = false;
            }
        } else if (userCam.gender==2) {
            if(!isChecked($('#showFemale'))) {
                result = false;
            }
        } else if (userCam.gender==3) {
            if(!isChecked($('#showCouples'))) {
                result = false;
            }
        } else if (userCam.gender==4) {
            if(!isChecked($('#showTranssexual'))) {
                result = false;
            }
        }
    }
    
    if((isChecked($('#showOnlyNew')) && pageType!=7 && userCam.type!=1) || (isChecked($('#showOnlyExhibitionist')) && pageType!=7 && userCam.type!=2)) {
        result = false;
    } 
    
    if (isChecked($('#showOnly1825')) && !isBetween18And25(userCam.age) && !(isChecked($('#showOnly2635')) && !isBetween26And35(userCam.age))) {
        result = false;
    }
    
    if (isChecked($('#showOnly2635')) && !isBetween26And35(userCam.age) && !(isChecked($('#showOnly1825')) && !isBetween18And25(userCam.age))) {
        result = false;
    }
    if (isChecked($('#showOnlyOnline')) && pageType==7 && userCam.type==3) {
        result = false;
    }
    
    return result;
}

function processCam(userCam) {
    if (pageType!=7) {
        addTokensRemaining(userCam.cam);
    }
    
    if(shouldShowCam(userCam)) {        
       userCam.show();
	} else {
        userCam.hide();
	}
}

function processCams(cams) {
    $.each(cams, function (index,userCam) {
        processCam(userCam);
    });
}

var firstTimeThru=true;
function processExhibitionist(userCam, refreshThePeopleListIgnoreUserList) {
    if (pageType==7) {
        if(refreshThePeopleListIgnoreUserList!==null && !arrayContains(userCam.name, refreshThePeopleListIgnoreUserList.split(',')) && shouldShowCam(userCam)) {
            refreshThePeopleListIgnoreUserList = addUserToIgnoreUserList(userCam.name, refreshThePeopleListIgnoreUserList);
			var camOnMainPage = false;
            $('.list').not("#OtherPagesInside, #BannedCamsInside, #ExhibitionistCams").children("div[id] :visible").each( function() { 
                //logit(userCam.name);
                if($(this).attr('id') == userCam.name) {
                    camOnMainPage = true;
                }
            }); 
            if (!firstTimeThru && !camOnMainPage && $("#ExhibitionistCams").find("#"+userCam.name).length == 0 && $("#FollowedCams").find("#"+userCam.name).length == 0) {  
                
                var cloneOfCamParent = userCam.getCamClone();
                addAlertButtons(cloneOfCamParent, userCam.name);
                $("#ExhibitionistCams" ).append(cloneOfCamParent);
                
                var targetNodes =  $( "#ExhibitionistCams" ).find(".details");    
              	if (targetNodes && targetNodes.length > 9) {
                    $('#dialog').dialog('option','width',782);
                } else {
                    $('#dialog').dialog('option','width',580);
                }
                $("#dialog" ).dialog( "open" ); 
                
                mySound.play();
                setImageRefresh(cloneOfCamParent, userCam.name);
            }
        } 
    }     
}

var refreshThePeopleListRunning = false;
var newUserArray = [];
var currentUserArray = [];
var refreshThePeopleListIgnoreUserList;
function refreshThePeopleList() {
   refreshThePeopleListRunning = true;
   refreshThePeopleListIgnoreUserList = getUserToIgnoreUserList();
   var targetNodes = $(".details");
   //$('.list').not("#OtherPagesInside, #BannedCamsInside, #ExhibitionistCams").children(":visible").each( function() {  
                
   //});     
   if (targetNodes && targetNodes.length > 0) {
        targetNodes.each ( function () {
            var userCam = actionFunction($(this), refreshThePeopleListIgnoreUserList);
			newUserArray.push(userCam.name);
        });
    }
		
	currentUserArray.every(removeRefreshImages);
	currentUserArray = newUserArray;
	
	if(newUserArray.length > 0) {
		firstTimeThru=false;
	}
	
    //might not want to do this
    newUserArray = [];
    refreshThePeopleListRunning = false;
}

function actionFunction(jNode, refreshThePeopleListIgnoreUserList) {
    var userCam = preProcessCam(jNode);
    processCam(userCam);
    processExhibitionist(userCam, refreshThePeopleListIgnoreUserList);
    return userCam;
}

var intervalMap = new Object();
function setImageRefresh(cloneOfCamParent, name) {
    var image = cloneOfCamParent.find('img');
    //logit("setImageRefresh for: "+ name);
    var thisInterval = setInterval(function (name) {
        //logit("Refreshing image for: "+ name);
        image[0].src=image[0].src.replace(/\?.*/,function () {
            return '?'+new Date();
        });
    }, 60000);
	
	intervalMap[name] = thisInterval;
}

function removeFromAlert(name) {
    $( "#ExhibitionistCams" ).find('#'+name).remove();
    if ($( "#ExhibitionistCams" ).html() == '') {
        $( "#dialog" ).dialog( "close" );
    }
}

function addAlertButtons(jNode, name) { 
    jNode.find('.cams').after('<input type="button" id="clearButton_'+name+'" value="Clear" >');
    jNode.find('#clearButton_'+name).button().click(function(){ removeFromAlert(name);});   
    
    jNode.find('#clearButton_'+name).after('<input type="button" id="removeButton_'+name+'" value="Hide Room Forever" >');
    jNode.find('#removeButton_'+name).button().click(function(){ if(window.confirm("Are you sure you want to remove this room from showing on chaturbate forever?")) {alert("Removed");}}); 
}

var removeRefreshImages = function(x) {
    var found = false;
	for (var i = 0; i < newUserArray.length; i++) {
		if(x==newUserArray[i]) {
			found = true;
		}
	}
	
	if(!found && x in intervalMap) {
        clearInterval(intervalMap[x]);
		delete intervalMap[x];
	}
};



function getTokensRemaining(jNode) {
    var tokensRemaining = "", subjectElementHTML = jNode.find('.subject').html(),startpos,length;
    if(subjectElementHTML && subjectElementHTML.lastIndexOf("[") != -1 && subjectElementHTML.lastIndexOf(" tokens remaining]")!=-1) {
        startpos = subjectElementHTML.lastIndexOf("[")+1;
        length = subjectElementHTML.lastIndexOf(" tokens remaining]")-startpos;
        tokensRemaining = subjectElementHTML.substr(startpos,length);
    }
    return tokensRemaining.trim();
}

function addTokensRemaining(jNode) {
    var tokensRemaining = getTokensRemaining(jNode);
    if(jNode.find('#tokensRemaining')) {
        jNode.find('#tokensRemaining').remove();
    } 
    if(tokensRemaining=="") {
        tokensRemaining="--";
    }
    jNode.find('.cams').after('<li id="tokensRemaining">Tokens Remaining: ['+tokensRemaining+']</li>');    
}

function addUserToIgnoreUserList(userName, ignoreUserList) {
    if (!arrayContains(userName, ignoreUserList.split(','))) {
       if (ignoreUserList && ignoreUserList.split(',').length > 0) {
           ignoreUserList = ignoreUserList+',';
       }
       ignoreUserList = ignoreUserList + userName;
       createCookie('ignoreUserList',ignoreUserList);
	}
	return ignoreUserList;
}

function getUserToIgnoreUserList() {
    var ignoreUserList = readCookie('ignoreUserList');  
    if(!ignoreUserList) {
        ignoreUserList = '';
    }
    return ignoreUserList;
}
    
function createCookie(name,value,days) {
    var date = new Date(), expires="";
	if (days) {
		date.setTime(date.getTime()+(days*24*60*60*1000));
		expires = "; expires="+date.toGMTString();
    }
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var c, i, nameEQ = name + "=", ca = document.cookie.split(';');
	for(i=0;i < ca.length;i++) {
		c = ca[i];
        while (c.charAt(0)==' ') {
            c = c.substring(1,c.length);
        }
        if (c.indexOf(nameEQ) == 0) {
            return c.substring(nameEQ.length,c.length);
        }
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

function addGlobalStyle(css) {
    var head, style;
    head = document.getElementsByTagName('head')[0];
    if (!head) { return; }
    style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = css;
    head.appendChild(style);
}

function addStyle(style) {
	var head = document.getElementsByTagName("HEAD")[0], ele = head.appendChild(window.document.createElement( 'style' ));
	ele.innerHTML = style;
	return ele;
}

function arrayContains(obj, a) {
    var i;
    for (i = 0; i < a.length; i++) {
        if (a[i] === obj) {
            return true;
        }
    }
    return false;
}
    
function showCheckbox(checkbox, checkboxlabel) {
    checkbox.show();
    checkboxlabel.show();
}

function hideCheckbox(checkbox, checkboxlabel) {
    checkbox.hide();
    checkboxlabel.hide();
}

function checkCheckbox(checkbox,checked) {
    if(checked != null) {
        checkbox.attr('checked', checked);
    }
}

function toggleCheckbox(checkbox, checkboxlabel, show, checked) {    
    if(show) {
        showCheckbox(checkbox,checkboxlabel);
    } else {
        hideCheckbox(checkbox,checkboxlabel);
    }
    checkCheckbox(checkbox,checked);
}

function isChecked(checkbox) {
    return checkbox.attr('checked');
}  
    
function loadOtherPagesDiv() {
     if (typeof $("#OtherPages2").html() === "undefined") {
        var otherPages = $('#OtherPages').clone();
        otherPages.attr('id','OtherPages2');
		//logit("Showing OtherPages2");
        otherPages.show();
		
		var bannedCams = $('#BannedCams').clone();
        bannedCams.attr('id','BannedCams2');
		//logit("Showing BannedCams2");
        bannedCams.show();
         
         // Removes cams that are on this page from otherpagesinside
         $.get( window.location.pathname, function( data ) {
             $('.list').not("#OtherPagesInside, #BannedCamsInside, #ExhibitionistCams").children(":visible").each( function() {  
                var thisCamPage = $(this).find('.title a').attr('href');    
            	var thisCamName = thisCamPage.substring(1, thisCamPage.length-1);
                if($("#OtherPagesInside").find("#"+thisCamName).length > 0) {
                    $("#OtherPagesInside").find("#"+thisCamName).remove();
                }
            });  
             
		}).fail(function() {
            logit("loadOtherPagesDiv error: " + nextPagelink);
        });
        $(".content").find('.list').after(otherPages);
		$("#OtherPages2").after(bannedCams);
     }
}

function loadPage(url){ 
    $.get( url, function( data ) {
        var dataObj = $('<div/>').html(data);
        getCamsFromOtherPages(dataObj);
	}).fail(function() {
        alert( "error" );
    });
}

var getCamsFromOtherPagesRunning = false;
function getCamsFromOtherPages() {
    getCamsOnPage($("html"));
    loadOtherPagesDiv();
}
    
function getCamsOnPage(data) {      
    getCamsFromOtherPagesRunning = true;
    var nextPagelink = getNextPageLink(data);
    if (nextPagelink != null) {
        $.get( nextPagelink, function( data ) {
            var dataObj = $('<div/>').html(data);
            dataObj.find(".details").each( function() {
                var thisCam = createNewUserCam($(this));
                if(shouldShowCam(thisCam)) {
                    if ( $("#OtherPagesInside").find("#"+thisCam.name).length == 0) {
                        $("#OtherPagesInside").append(thisCam.cam.parent());
                        loadOtherPagesDiv();
                    } else if ( $("#OtherPagesInside").find("#"+thisCam.name).length == 1) {
                        var oldCam = $("#OtherPagesInside").find("#"+thisCam.name);
                    }
                }
            }); 
            getCamsOnPage(dataObj);  
		}).fail(function() {
            logit("getCamsOnPage error: " + nextPagelink);
        });
    } 
    
    getCamsFromOtherPagesRunning = false;
}

//http://chaturbate.com/followed-cams/
//<a href="/followed-cams/" class="followed">FOLLOWED(7/490)</a>
function getFavoritePage(data) {
    if($('#followed')) {
        getFavoritePage("/followed-cams/");
    }
}
function getFavoritePage(nextPagelink) {     
    if (nextPagelink != null) {
        $.get( nextPagelink, function( data ) {
            var dataObj = $('<div/>').html(data);
            dataObj.find(".details").each( function() {
                $("#FavoritePagesInside").append($(this).parent());
            }); 
            getFavoritePage(dataObj);  
		}).fail(function() {
            logit("getFavoritePage error: " + nextPagelink);
        });
    }     
}

function checkedCam(cam, camPage, lastChecked, status) {
    this.cam = cam;
    this.camPage = camPage;
    this.lastChecked = lastChecked;
    this.status = status;
    
}
    
var checkedCams = {};
var pauseOtherCams = false;
function checkOtherCamsOnline() {
    //logit("\n\n(checkOtherCamsOnline) start");
    pauseOtherCams = true;
    $("#OtherPagesInside").find('.details').each( function() {
        var thisCamPage = $(this).find('.title a').attr('href'); 
        var thisCamName = thisCamPage.substring(1, thisCamPage.length-1);
        var thisCam = $("#OtherPagesInside " + "#"+thisCamName);//.find("#"+thisCamName);
        
        //if($(this).find('.thumbnail_label').text() != 'BANNED') {
        if(thisCam.find('.thumbnail_label').text() != 'BANNED') {
        	$.get( thisCamPage, function( data ) {
            	var status = "Online";
            
            	if (data.indexOf("offline_tipping") >= 0) {
					status = "Offline";	
                	thisCam.find('.thumbnail_label').attr('class', 'thumbnail_label thumbnail_label_offline');
                	thisCam.find('.thumbnail_label').text('OFFLINE!');
                	thisCam.remove();                
                	//logit("(checkOtherCamsOnline) removing: "+thisCamName);    
            	} else if(data.indexOf("This room has been banned.") >= 0) {
                	status = "Banned"; 
                	thisCam.find('.thumbnail_label').attr('class', 'thumbnail_label thumbnail_label_offline');
                	thisCam.find('.thumbnail_label').text('BANNED');
                	if ( $("#BannedCamsInside").find("#"+thisCamName).length == 0) {
                        logit("** Moving Other Page Cam "+thisCamName+"to Banned Cams\n");
                    	thisCam.appendTo("#BannedCamsInside");
                    } else {
                        logit("Already in Banned Section, Removing Other Page Cam "+thisCamName + "\n");
                    	thisCam.remove();
                    }
            	} else if(data.indexOf("Access Denied. This room is not available to your region or gender.") >= 0) {
                	status = "Blocked"; 
                	thisCam.find('.thumbnail_label').attr('class', 'thumbnail_label thumbnail_label_offline');
                	thisCam.find('.thumbnail_label').text('BLOCKED');
            	} else if(data.indexOf("This room requires a password.") >= 0) {
                	status = "Password"; 
                	thisCam.find('.thumbnail_label').attr('class', 'thumbnail_label thumbnail_label_offline');
                	thisCam.find('.thumbnail_label').text('PASSWORD');
            	}
                
            	if(!(thisCamName in checkedCams)) {
                    var thisCheckedCam = new checkedCam($(this), thisCamPage, new Date(), status);
                    checkedCams[thisCamName] = thisCheckedCam;
                    //logit("Other Pages Cam added: "+ thisCamName);
                } else {
                    var newDate = new Date();
                    var seconds = (newDate - checkedCams[thisCamName].lastChecked) / 1000;
                    checkedCams[thisCamName].lastChecked = newDate;
                    //logit("Other Pages Cam found: "+ thisCamName+", last checked " + seconds +" ago");
                }                
            
			});  
        } else {
            if ( $("#BannedCamsInside").find("#"+thisCamName).length == 0) {
                logit("** Moving Other Page Cam "+thisCamName+"to Banned Cams\n");
                thisCam.appendTo("#BannedCamsInside");
            } else {
                logit("(checkOtherCamsOnline) Already in BannedCamsInside removing: "+thisCamName); 
                thisCam.remove();
            }
        }
    });        
        
    $("#ExhibitionistCams").find('.details').each( function() {
        var thisCamPage = $(this).find('.title a').attr('href'); 
        var thisCamName = thisCamPage.substring(1, thisCamPage.length-1);
        var thisCam = $("#ExhibitionistCams " + "#"+thisCamName);//.find("#"+thisCamName);
        
        if(thisCam.find('.thumbnail_label').text() != 'BANNED') {    
            $.get( thisCamPage, function( data ) {
                var status = "Online";
                
                if (data.indexOf("offline_tipping") >= 0) {
                    //logit("(checkOtherCamsOnline) marking as offline in ExhibitionistCams: "+thisCamName);
                    thisCam.find('.thumbnail_label').attr('class', 'thumbnail_label thumbnail_label_offline');
                    thisCam.find('.thumbnail_label').text('OFFLINE!');
                    status = "Offline";
                } else if(data.indexOf("This room has been banned.") >= 0) {
                    logit("(checkOtherCamsOnline) marking as banned in ExhibitionistCams: "+thisCamName);
                    thisCam.find('.thumbnail_label').attr('class', 'thumbnail_label thumbnail_label_offline'); 
                    thisCam.find('.thumbnail_label').text('BANNED');
                    status = "Banned";
                } else if($("#OtherPagesInside").find("#"+thisCamName).length > 0) {
                    var otherPagesInsideClass = $("#OtherPagesInside").find("#"+thisCamName).find('.thumbnail_label').attr('class');
                    var otherPagesInsideThumbnail = $("#OtherPagesInside").find("#"+thisCamName).find('.thumbnail_label').text();
                    //logit("\nthisCamName - Class: "+otherPagesInsideClass+" Thumbnail: "+otherPagesInsideThumbnail+"\n");
                    thisCam.find('.thumbnail_label').attr('class', otherPagesInsideClass);
                    thisCam.find('.thumbnail_label').text(otherPagesInsideThumbnail);
                } else if(data.indexOf("Access Denied. This room is not available to your region or gender.") >= 0) {
                	status = "Blocked"; 
                	thisCam.find('.thumbnail_label').attr('class', 'thumbnail_label thumbnail_label_offline');
                	thisCam.find('.thumbnail_label').text('BLOCKED');
            	} else if(data.indexOf("This room requires a password.") >= 0) {
                	status = "Password"; 
                	thisCam.find('.thumbnail_label').attr('class', 'thumbnail_label thumbnail_label_offline');
                	thisCam.find('.thumbnail_label').text('PASSWORD');
            	}
                
                if(!(thisCamName in checkedCams)) {
                    var thisCheckedCam = new checkedCam($(this), thisCamPage, new Date(), status);
                    checkedCams[thisCamName] = thisCheckedCam;
                    //logit("Exhibitionist Cam added: "+ thisCamName);
                } else {
                    var newDate = new Date();
                    var seconds = (newDate - checkedCams[thisCamName].lastChecked) / 1000;
                    checkedCams[thisCamName].lastChecked = newDate;
                    //logit("Exhibitionist Cam found: "+ thisCamName+", last checked " + seconds +" ago");
                }
                
			});
        } else {
            if ( $("#BannedCamsInside").find("#"+thisCamName).length == 0) {
                logit("*** Copying Exhibitionist Cam "+thisCamName+" to Banned Cams\n");
                var thisCamClone = thisCam.clone();
                thisCamClone.find("#clearButton_"+thisCamName).remove();
                thisCamClone.find("#removeButton_"+thisCamName).remove();
                thisCamClone.appendTo("#BannedCamsInside");
            } else {
                logit("(checkOtherCamsOnline) Already in BannedCamsInside: "+thisCamName); 
            }
        }            
    });
    
    var ids = {};
    $("#BannedCamsInside").children().each( function() {
        logit($(this).attr('id'));
        var id = $(this).attr('id');
        clearInterval(id);

    	//was this id previously seen?
   		if ( ids.hasOwnProperty(id) ) {
        	$( "#"+id ).remove();
    	}
    	//a brand new id was discovered!
    	else {
        	ids[ id ] = true;
    	}
    });    
    pauseOtherCams = false;         
}

function logit(text) {
    console.log(text);
}

function getNextPageLink(data) {
    if(data == null) {
        return null;
    }
    var paging = data.find('.paging'), nextLink = null;
    paging.find('link').each(function() {
        var rel = $(this).attr('rel');
        if(rel=="next") {
            nextLink = $(this).attr('href');
        }
    });
    return nextLink;
}

$(document).ready(function () {
    $(".advanced_search_button").live("click", function () {
        $(".advanced_search_button").toggle();
        $("a.hide_advanced_search_button").toggle();
        $("div.advanced_search_options").slideDown();
        return false;
    });
    $(".hide_advanced_search_button").live("click", function () {
        $(".advanced_search_button").toggle();
        $("a.hide_advanced_search_button").toggle();
        $("div.advanced_search_options").slideUp();
        return false;
    });
    $("#filter_location_form input[type='checkbox']").click(function () {
        $(".searching-note").show();
        $.ajax({
            type: 'POST',
            url: $("#filter_location_form").attr("action"),
            data: $("#filter_location_form").serialize(),
            success: function (data) {
                $(".endless_page_template").load(window.location.href);
                $(".searching-note").hide();
            }
        });
        return true;
    });
    $("#filter_options_form").click(function () {
        $(".searching-note").show();
        $.ajax({
            type: 'POST',
            url: $("#filter_options_form").attr("action"),
            data: $("#filter_options_form").serialize(),
            success: function (data) {
                $(".endless_page_template").load(window.location.href);
                $(".searching-note").hide();
            }
        });
        return true;
    });
    $("#filter_search_form input[type='submit']").click(function () {
        var skey = $("#id_keywords").val();
        var search_message = interpolate(gettext("Searching for %(skey)s ..."), {skey: skey}, true);
        $(".searching-keyword h1").text(search_message);
        $(".searching-keyword").show();
        $(".endless_page_template").load($("#filter_search_form").attr("action") + '?' + $("#filter_search_form").serialize());
        return false;
    });
    
    $('.list').parent().bind("DOMNodeInserted",function(){
        if(!getCamsFromOtherPagesRunning && !refreshThePeopleListRunning && pageType==7) {
            getCamsFromOtherPages();
            refreshThePeopleList();
        } else if(!refreshThePeopleListRunning){
            refreshThePeopleList();
            logit("refreshThePeopleListRunning not running");
        }
    });
    
    //$('.list').parent().bind("DOMNodeRemoved",function(){
        //console.log('DOMNodeRemoved');
    //});
    
});

function do_script() {
    pageType = getPageType();
    if (pageType!=1) {  
        addGlobalStyle('.ui-widget-header-custom {background-color: #3D9700;color:White;font-weight:bold;}');
        addStyle('@import "http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css";');        
        addGlobalStyle('.ui-dialog .ui-dialog-buttonpane { text-align: center; }');
        addGlobalStyle('.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: none; }');
        if (pageType == 7) { 
        	createCookie('ignoreUserList',''); 
        }
        //eraseCookie('ignoreUserList');
        addCheckboxes();
        if (pageType==7) {
            getCamsFromOtherPages();
        }
        
        refreshThePeopleList();
        
        showHideCheckboxes();
        setInterval(checkOtherCamsOnline, 30000); 
	}
    if (pageType==7) {
        reload_rooms.delay = 10000;
        setTimeout(reload_rooms.on_timeout,15000);
    } else {
        reload_rooms.delay = 90000;
    }
}

do_script();	
//.user.js