console.log("starting to load application.js");

var globalWebroot = 'http://map.sysomos.com/';

function load(url /*String*/) {
        if (url == null) {
                alert('unable to load the document');
        } else {
                console.log("Loading "+url);
                window.location.href=url;
        }
}

/* reload the same page */
function reloadPage() {
        load(window.location);
}

function confirmLoad(url /* string */, msg /* optional string */) {
        msg = msg || "Are you sure?";
        var sure = confirm(msg);
        if (sure) {
                load(url);
        }
}

function changeClass(obj, className) {
        obj.className = className;
}

/* Evaluate scripts present in HTML content; copied from Dojo library */

function snarfScripts(cont, byRef){
        // summary
        //              strips out script tags from cont
        // invoke with 
        //      byRef = {errBack:function(){/*add your download error code here*/, downloadRemote: true(default false)}}
        //      byRef will have {code: 'jscode'} when this scope leaves
        // copied with modifications from http://archive.dojotoolkit.org/nightly/dojotoolkit/dojox/layout/ContentPane.js
        byRef.code = "";

        function download(src){
                if(byRef.downloadRemote){
                        // console.debug('downloading',src);
                        dojo.xhrGet({
                                url: src,
                                sync: true,
                                load: function(code){
                                        byRef.code += code+";";
                                },
                                error: byRef.errBack
                        });
                }
        }
        
        // match <script>, <script type="text/..., but not <script type="dojo(/method)...
        return cont.replace(/<script\s*(?![^>]*type=['"]?dojo)(?:[^>]*?(?:src=(['"]?)([^>]*?)\1[^>]*)?)*>([\s\S]*?)<\/script>/gi,
                function(ignore, delim, src, code){
                        if(src){
                                download(src);
                        }else{
                                byRef.code += code;
                        }
                        return "";
                }
        );
}

function evalScriptInGlobal(code, appendNode){
        // we do our own eval here as dojo.eval doesn't eval in global crossbrowser
        // This work X browser but but it relies on a DOM
        // plus it doesn't return anything, thats unrelevant here but not for dojo core
        // copied from http://archive.dojotoolkit.org/nightly/dojotoolkit/dojox/layout/ContentPane.js
        appendNode = appendNode || dojo.doc.body;
        var n = appendNode.ownerDocument.createElement('script');
        n.type = "text/javascript";
        appendNode.appendChild(n);
        n.text = code; // DOM 1 says this should work
}

function executeScripts(currentContent /*html content string*/, node /*DomNode*/) {
        //console.log('executing scripts from ',currentContent);
        var code, byRef = {
                downloadRemote: true,
                errBack:function(e){
                        console.log('Error running (remote) scripts for '+node, e);
                }
        };
        currentContent = this.snarfScripts(currentContent, byRef);
        code = byRef.code;
        //console.log('executing scripts in ', code);
        try{
                this.evalScriptInGlobal(code, node);
        }catch(e){
                console.log('Error running scripts for '+node, e);
        }
        console.log('finished executing scripts for ', node);
}

function highlight(/* DomeNode */ node) {       
        var highlightAnim = dojo.animateProperty({
                node: node,
                duration: 3000,
                properties: {
        backgroundColor: { start:"#ffff99", end: "#ffffff" }
        }
        });
        highlightAnim.play();
}

function saveItemsFolderSelector(id) {
	var selectedFolderId = getSelectValue('fs' + id);
	var newFolderNameObj = dojo.byId("fs_newfn_" + id);
	if (selectedFolderId > 0) {
		newFolderNameObj.style.display = "none";
	} else {
		newFolderNameObj.style.display = "block";
		newFolderNameObj.select();
	}
}
function saveItemsToFolder(id /* string id used as suffix in save form */, callback) {
        console.log('save items to folder id is ' + id);
        var selectedFolderId = getSelectValue('fs' + id);
        var tmpNF = dojo.byId("fs_newfn_" + id);
        var finame = dojo.byId('finame' + id).value;
        var extendedItemdata = getRadioValue('sw' + id);
        var msgbox = dojo.byId('save_to_folder_message_' + id);
        dojo.addClass(msgbox, "info");
        msgbox.innerHTML='Saving...please wait';
        console.log('Will save in ' + selectedFolderId + ' with name ' + finame + ' item ' + extendedItemdata);
        addItemCallback = function(folderid){
                console.log("Calling the add item callback with folderid " + folderid);
                DWRRestricted.addItemsToFolder(folderid, [extendedItemdata], [finame], function(data){
                        dojo.addClass(msgbox, "success");
                        dojo.removeClass(msgbox, "info");
                        msgbox.innerHTML = 'Item saved successfully.';
                        tmpNF.style.display = "none";
                        if (callback && callback != "") {
                                console.log('Item added, will now call the callback [' + callback + ']');
                                eval(callback);
                        }
                });
        };
        console.log("addItemCallback is ", addItemCallback);
        if (selectedFolderId > 0) {
                addItemCallback(selectedFolderId);
        } else {
        		var folderName = dojo.trim(dojo.byId('fs_newfn_' + id).value);
        		folderName = folderName.replace(/\s/g, "-");
        		var userName = dojo.byId('user' + id).value;
                createFolder(folderName, userName, addItemCallback);
        }
}

function createUserInputFolder(userName, reloadUrl) {
        var folderName = prompt('Enter name of the new folder to create', 'TestFolder');
        console.log('will create a new folder with name ' + folderName + ' for ' + userName + ' and reload to ' + reloadUrl);
        createFolder(folderName, userName, function(folderid) {
                alert('Created the new folder successfully');
                load(reloadUrl);
        });
}

function createFolder(folderName, user, callback) {
        console.log("will create folder with name " + folderName +" for " + user +" with callback ", callback);
        DWRRestricted.createFolder(folderName, user, function(data) {
                if (data.indexOf("error") >= 0) {
                        alert("Unable to create new folder "+data);
                        console.log("createFolder returned " + data);
                } else {
                        console.log("created new folder with id " + data + " for the user");
                        if (callback) {
                                callback(data);
                        }
                }
        });
}

function deleteFolder(folderid, reloadUrl) {
        var sure = confirm('Are you sure you want to delete the folder and all associated data? Once deleted, the data can not be restored.');
        if (!sure) {
                return;
        }
        DWRRestricted.deleteFolder(folderid, function(data) {
                if (data == "") {
                        alert("deleted the folder successfully");
                        if (reloadUrl) {
                                load(reloadUrl);
                        }
                } else {
                        alert("unable to delete the folder " + data);
                }
        });
}

function deleteFolderItem(itemid, reloadUrl) {
        var sure = confirm('Are you sure you want to delete the item? Once deleted, the data can not be restored.');
        if (!sure) {
                return;
        }
        DWRRestricted.deleteFolderItem(itemid, function(data) {
                if (data == true) {
                        alert("deleted the item successfully");
                        if (reloadUrl) {
                                load(reloadUrl);
                        }
                } else {
                        alert("unable to delete the item " + data);
                }
        });
}


function updateSaveItemName(id /* string id used as suffix in save form */, suffix /*string*/){
        var selectedRadioNode = getSelectedRadioNode('sw' + id);
        var itemName = dojo.attr(selectedRadioNode, 'itemName');
        console.log("for fs"+id+", itemName is " + itemName);
        var completeName = itemName + suffix;
        dojo.byId('finame' + id).value = completeName;
}

/**
 * Returns the selected value from a menu (HTML's select tag), given the id of the select node.
 */
function getSelectValue(selectId /* String */) {
        var select = dojo.byId(selectId);
        console.log("node for " + selectId +" is ", select)
        var value = select.options[select.selectedIndex].value;
        return value;
}

function getRadioValue(radioGrpClass /* String */) {
        var selectedNode = getSelectedRadioNode(radioGrpClass);
        if (selectedNode) {
        	return selectedNode.value;
        }
        return false;
}

/**
 * Returns the selected radio node in a radio group assuming all nodes use the readioGrpClass.
 */
function getSelectedRadioNode(radioGrpClass /* String */) {
        var selectedNode = undefined;
        var radioGrp = dojo.query("." + radioGrpClass).forEach(function(node) {
                // console.log("node ", node, node.checked);
                if (node.checked) {
                        selectedNode = node;
                }
        });
        return selectedNode;
}

function deleteBlogsetItem(blogsetId, blogid, callback) {
        console.log("will delete blogid " + blogid +" from " + blogsetId);
        DWRRestricted.deleteBlogsetBlog(blogsetId, blogid, function(data) {
                console.log('delete blogset blog returned ' + data);
                if (callback) {
                        callback();
                }
        });
}

/**
 * Same as updateUrlSingle(url, key, values) below, except it is returning value.
 */
function getUrlValueByKey(url /*String*/, key /*String*/) {
		var value = "";
		
        if (url.lastIndexOf("#") == url.length - 1) {
                url = url.substring(0, url.length - 1);
        }
        if (url.indexOf('?') < 0) {
                url = url + "?";
        }
        // var keyIndex = url.indexOf(key + "=");
        var keyIndex = url.indexOf("&" + key + "=");
        if (keyIndex < 0) {
        	keyIndex = url.indexOf("?" + key + "=");
        }
        
        if (keyIndex < 0) {
        	return value;
        }
        var valStartIndex = 1 + url.indexOf("=", keyIndex + 1);
        var valEndIndex = url.indexOf("&", valStartIndex);
        if (valEndIndex < 0) {
        	valEndIndex = url.length -1;
        }
        value = url.substring(valStartIndex, valEndIndex);
        
        return unescape(value);
}
/**
 * Same as updateUrl(url, keyValues) below, except it is for a single key-value pair.
 */
function updateUrlSingle(url /*String*/, key /*String*/, value /*String*/) {
        console.log("[updateUrl] key="+key+", value="+value+", url="+url);
        if (url.lastIndexOf("#") == url.length - 1) {
                url = url.substring(0, url.length - 1);
        }
        if (url.indexOf('?') < 0) {
                url = url + "?";
        }
        // var keyIndex = url.indexOf(key + "=");
        var keyIndex = url.indexOf("&" + key + "=");
        if (keyIndex < 0) {
                keyIndex = url.indexOf("?" + key + "=");
        }
        var newurl;
        if (keyIndex < 0) {
                if (url.charAt(url.length - 1) == '&') {
                        newurl = url + key + "=" + encodeURIComponent(value);
                } else {
                        newurl = url + "&" + key + "=" + encodeURIComponent(value);
                }
                return newurl;
        }
        var valStartIndex = 1 + url.indexOf("=", keyIndex + 1);
        var urlPrefix = url.substring(0, valStartIndex);
        var urlEndPrefix = "";
        var valEndIndex = url.indexOf("&", valStartIndex);
        if (valEndIndex > 0) {
                urlEndPrefix = url.substring(valEndIndex);
        }
        newurl = urlPrefix + encodeURIComponent(value) + urlEndPrefix;
        return newurl;
}

/**
 * This function takes in a url as input and returns an updated url such that 
 * the query string of the returned url is modified. The new query string is 
 * constructed using the supplied keyValues JSON object, which simply contains 
 * the parameter name to parameter value pairs. Parameter keys not in the param
 * keyValues are left unchanged from input url to the returned url.
 */
function updateUrl(url /*String*/, keyValues /*JSON map*/) {
        console.log("[updateUrl] keyValues=",keyValues,"  url="+url);
        var newurl = url;
        for (key in keyValues) {
                var value = keyValues[key];
                newurl = updateUrlSingle(newurl, key, value);
        }
        return newurl;
}

function updateAndLoadUrl(keyValues /*JSON map */) {
        var url = window.location.href;
        var newurl = updateUrl(url, keyValues);
        console.log("updated url is " + newurl);
        load(newurl);
}

function toggleVisibilityAnimated(node /*dom node or string id*/) {
        if (dojo.style(node, "display") == "none") {
                dojo.fx.wipeIn({node: node, duration: 1000}).play();
        } else {
                dojo.fx.wipeOut({node: node,duration: 1000}).play();
        }
}

function manuallyMarkSpam(blogid, mark) {
        dojo.byId("mark"+blogid).innerHTML = "marking...";
        DWRRestricted.manuallyMarkSpam(blogid, mark, function(data) {
                var msg = "error";
                if (mark == 1) {
                        msg = "Successfully marked as HAM";
                }
                if (mark == -1) {
                        msg = "Successfully marked as SPAM";
                }
                if (mark == -2) {
                        msg = "Successfully marked as INACTIVE (but not spam)";
                }
                dojo.byId("mark"+blogid).innerHTML = msg;
        });
}

function tagSpam(url, userid, tag, blogid) {
        dojo.byId("tag"+blogid).innerHTML = "tagging...";
        DWRRestricted.tagSpam(url, userid, tag, function(data) {
                var msg = "error";
                if (tag == 1) {
                        msg = "Successfully tagged as LEGIT";
                }
                if (tag == -1) {
                        msg = "Successfully tagged as SPAM";
                }
                dojo.byId("tag"+blogid).innerHTML = msg;
        });
}

/*function trim(q) {
        return q.replace(/^\s+|\s+$/g, '');
}*/

function bookmarkCurrentPage(webroot /*string*/) {
    var currentUrl = window.location.href;
    var i = currentUrl.indexOf(webroot);
    if (i == 0) {
        currentUrl = currentUrl.substring(webroot.length);
    } else {
        console.log("bookmark index is " + i + " for webroot " + webroot +" and current url " + currentUrl);
        alert('Failed to bookmark -- webroot not found');
        return;
    }
    if (currentUrl.indexOf('?') != 0) {
        // we currently only allow bookmarking of the analyze pages
        alert('Failed to bookmark -- this page can not be bookmarked');
        return;
    }
    var name = prompt("Enter name for bookmark", "");
    name = trim(name);
    if (name == '') {
        alert('Failed to bookmark -- please provide a proper name');
        return;
    }
    dojo.attr("bookmarksAddA", "href", "javascript:void(0)");
    dojo.byId("bookmarksAddA").innerHTML = "Adding Bookmark...";
    DWRRestricted.bookmark(currentUrl, name, function(data) {
        console.log("bookmark returned " + data);
        var bookmarkNode = dojo.byId("bookmarksAddA");
        if (data) {
            bookmarkNode.innerHTML = "Successfully Bookmarked";
            alert("Successfully Bookmarked");
            reloadPage();
        } else {
            alert('Failed to bookmark');
            bookmarkNode.innerHTML = "Failed to Bookmark";
        }
    });
}

function reportSpamBlog(blogid, user, labelId) {
        DWRRestricted.sendSpamMarkRequest(blogid, user, function(data) {
               if (data) {
                        var button = dojo.byId(labelId);
                        button.href = "javascript:void(0)";
                        button.onClick = "javascript:void(0)";
                        button.innerHTML = "Successfully Reported";
                } else {
                        alert('Error while reporting spam');
                }
         });
}

function toggleItemStar(itemid) {
        console.log('calling toggle star for ' + itemid);
        var curstar = dojo.byId("item_star_"+itemid).src;
        var isStarred = curstar.indexOf('active') > 0;
        console.log('item ' + itemid + ' is currently starred');
        var newStarUrl = isStarred ? 'http://map.sysomos.com/img/star.gif' : 'http://map.sysomos.com/img/star_active.gif';
        DWRRestricted.setFolderItemStarred(itemid, !isStarred, function(data) {
                if (data == true) {
                        dojo.byId("item_star_"+itemid).src = newStarUrl;
                } else {
                        alert("unable to toggle star for the item");
                }
        });
}
function updateItemTagsComments(itemid) {
        dojo.byId("item_update_message_" + itemid).innerHTML = "<br><p class='info'>Updating...please wait</p>";
        var tags = dojo.byId('item_tags_' + itemid).value;
        var name = dojo.byId('item_name_' + itemid).value;
        var comments = dojo.byId('item_comments_' + itemid).value;
        DWRRestricted.setFolderItemMetadata(itemid, name, tags, comments, function(data) {
                if (data == true) {
                        try {
                                dojo.byId("item_display_name_"+itemid).innerHTML = name;
                                dojo.byId("item_display_tags_"+itemid).innerHTML = tags;
                        } catch (e) {
                                // this can happen -- not necessarily an error (See item.jsp)
                                console.log("nothing to update " + e);
                        }
                        dojo.byId("item_update_message_" + itemid).innerHTML = "<br><p class='success'>Item updated successfully</p>";
                } else {
                        alert("unable to update tags and comments for the item");
                }
        });
}

function updateSessionFolder(id) {
        var selectedFolderId = dojo.byId('fs' + id).value;
        var msgbox = dojo.byId('save_to_folder_message_' + id);
        dojo.addClass(msgbox, "info");
        msgbox.innerHTML='Updating...please wait';
        DWRRestricted.setSessionFolder(selectedFolderId, function(data) {
                if (data) {
                        dojo.addClass(msgbox, "success");
                        dojo.removeClass(msgbox, "info");
                        msgbox.innerHTML = 'Updated folder successfully.';
                        var fnameHeader = dojo.byId('header_folder_select_name');
                        fnameHeader.innerHTML = data;
                } else {
                        dojo.addClass(msgbox, "error");
                        dojo.removeClass(msgbox, "info");
                        msgbox.innerHTML = 'Error while updating the folder.';
                }
        });
}

/**
 * Given the qid (string id), find the value of the HTML input field, which can be a 
 * simple text box, checkbox or the select menu.
 */
function getFormValue(qid /*String|DOMNode*/) {
        var node = dojo.byId(qid);
        var key = dojo.attr(node, 'name');
        var val = "";
        if (node.nodeName == 'INPUT') {
                val = node.value;
                if (node.type == 'checkbox') {
                        val = node.checked;
                }
        } else if (node.nodeName == 'SELECT') {
                val = getSelectValue(node);
        } else if (node.nodeName == 'TEXTAREA') {
                val = node.value;
        } else {
                console.error('[getFormValue] node not supported ', node, node.nodeName);
        }
        return val;
}

function getQueryStringMap(qclass /* string css class */) {
        var qstrmap = {};
        dojo.query("."+qclass).forEach(function (node) {
                console.log("[getQueryStringMap] node ", node);
                var key = dojo.attr(node, 'name');
                var val = getFormValue(node);
                qstrmap[key] = val;
                console.log('[getQueryStringMap] updated qstrmap ', qstrmap, ' using key ', key, ' and value ', val);
        });
        return qstrmap;
}

function submitDynamicForm(qclass /* string css class */, baseurl) {
        var newurl = baseurl || window.location.href;
        var qstrmap = getQueryStringMap(qclass);
        newurl = updateUrl(newurl, qstrmap);
        newurl = updateUrlSingle(newurl, 'submitDynamicForm', 'true');
    console.log(newurl);
        load(newurl);
}

function concatMap(map1 /* simple map (i.e., Object) */, map2 /* simple map */) {
        var newmap = {};
        for (var i in map1) {
                newmap[i] = map1[i];
        }
        for (var i in map2) {
                newmap[i] = map2[i];
        }
        return newmap;
}
                
console.log("finished loading application.js");

function allCheckboxes(form, flag) {
        if (!form) { return; } 

        var len = form.elements.length;
        for(var i = 0; i < len; i++ ) {
                var e = form.elements[i];
                if (e.type == "checkbox") {
                        e.checked = flag;
                }
        }
}

/**
 * Post a twitter message in reply to a specific beat
 */
function postTwitterMsg(name, hid, bid, replyToTweetId, screenName) {
		var msg = dojo.byId('status_' + bid).value;
        if (dojo.trim(msg) == "") {
                alert('No message specified.');
                return;
        }
        var button = dojo.byId('replayButton_' + bid);
        button.className = "disabled_button";
        button.href = "#";

        DWRRestricted.postTweet(name, screenName, hid, bid, msg, replyToTweetId, function(returnValue) {
                        if (returnValue) {
                                dojo.byId("postStatus_"+ bid).innerHTML = '<div class="infobox"><div class="success_massages"><div class="success_top_boxer"><div class="l_t"></div><div class="r_t"></div></div><div class="success_content"><span class="bold">Successfully Posted:</span> "'+msg+'" on <a href="http://twitter.com/'+screenName+'">http://twitter.com/'+screenName+'</a></div><div class="success_bottom_boxer"><div class="l_b"> </div><div class="r_b"> </div></div></div></div>';
                                dojo.byId("msgBox_"+ bid).style.display = "none";
                        } else {                                
                                dojo.byId("postStatus_"+ bid).innerHTML = '<div class="warning_massages"><div class="warning_top_boxer"><div class="l_t">&nbsp;</div><div class="r_t">&nbsp;</div></div><div class="warning_content"><span class="bold">Failed:</span> An error occurred while posting.</div><div class="warning_bottom_boxer"><div class="l_b">&nbsp;</div><div class="r_b">&nbsp;</div></div></div>';
                        }
                }
        );
}

/**
 * Post a message to a twitter user 
 */
function postTwitterMsgNoReply(name, hid, userid, screenName) {
	var msg = dojo.byId('status_' + userid).value;
    if (dojo.trim(msg) == "") {
            alert('No message specified.');
            return;
    }
    var button = dojo.byId('replayButton_' + userid);
    button.className = "disabled_button";
    button.href = "#";
    DWRRestricted.postTweet(name, screenName, -1, -1, msg, -1, function(returnValue) {
                    if (returnValue) {
                            dojo.byId("postStatus_"+ userid).innerHTML = '<div class="infobox"><div class="success_massages"><div class="success_top_boxer"><div class="l_t"></div><div class="r_t"></div></div><div class="success_content"><span class="bold">Successfully Posted:</span> "'+msg+'" on <a href="http://twitter.com/'+screenName+'">http://twitter.com/'+screenName+'</a></div><div class="success_bottom_boxer"><div class="l_b"> </div><div class="r_b"> </div></div></div></div>';
                            dojo.byId("msgBox_"+ userid).style.display = "none";
                    } else {                                
                            dojo.byId("postStatus_"+ userid).innerHTML = '<div class="warning_massages"><div class="warning_top_boxer"><div class="l_t">&nbsp;</div><div class="r_t">&nbsp;</div></div><div class="warning_content"><span class="bold">Failed:</span> An error occurred while posting.</div><div class="warning_bottom_boxer"><div class="l_b">&nbsp;</div><div class="r_b">&nbsp;</div></div></div>';
                    }
            }
    );
}

function textAreaMaxSize(obj, maxSize) {
        if (obj) {
                var tmpStr = obj.value;
                if(tmpStr.length > maxSize) {
                        obj.value = tmpStr.substring(0,maxSize);
                }
        }
}

function addBookmark(hid, jsId, urlQString, isRename) {
        
        var nameObj = dojo.byId(jsId + '_name');
        var name = dojo.trim(nameObj.value);
        
        if(name == "") {
                alert('Please enter bookmark name.');
                nameObj.focus();
                return;
        }       

        if (isRename) { 
                DWRRestricted.renameBookmark(hid, name, urlQString, function(returnValue) {
                                if (returnValue) {
                                       dojo.byId(jsId).className = "bookmarked";
                                       dijit.byId('bookmarkDialog').closeDropDown();
                                }
                        }
                );      
        } else {
                DWRRestricted.addBookmark(hid, name, urlQString, function(returnValue) {
                                if (returnValue) {
                                        dojo.byId(jsId).className = "bookmarked";
                                        dijit.byId('bookmarkDialog').closeDropDown();
                                }
                        }
                );      
        }
}
function deleteBookmark(hid, jsId, urlQString) {
        DWRRestricted.deleteBookmark(hid, urlQString, function(returnValue) {
                        if (returnValue) {
                                dojo.byId(jsId).className = "bookmark"
                                dijit.byId('bookmarkDialog').closeDropDown();
                        }
                }
        );      
}

function isNotEmpty(id, msg) {
        var elem = dojo.byId(id);
        if (!elem) { return false;}
        var m = msg || "Please fill in empty field.";
        var str = dojo.trim(elem.value);
        if(str == "") {
                alert(m);
                elem.focus();
                return false;
        } else {
                return true;
        }
}

function passwordStrength(password,username) {
        var shortPass = 0;
        var badPass = 1;
        var goodPass = 2;
        var strongPass = 3;
        
    score = 0 
    
    if (password.length < 8 ) { return shortPass }
    
    if (password.toLowerCase()==username.toLowerCase()) return badPass
    
    score += password.length * 4
    score += ( checkRepetition(1,password).length - password.length ) * 1
    score += ( checkRepetition(2,password).length - password.length ) * 1
    score += ( checkRepetition(3,password).length - password.length ) * 1
    score += ( checkRepetition(4,password).length - password.length ) * 1

    if (password.match(/(.*[0-9].*[0-9].*[0-9])/))  score += 5 
    
    if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) score += 5 
    
    if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))  score += 10 
    
    if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))  score += 15 

    if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/))  score += 15 
    
    if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/))  score += 15 
    
    if (password.match(/^\w+$/) || password.match(/^\d+$/) )  score -= 10 
    
    if ( score < 0 )  score = 0 
    if ( score > 100 )  score = 100 
    
    if (score < 34 )  return badPass 
    if (score < 68 )  return goodPass
    return strongPass
}

function checkRepetition(pLen,str) {
    res = ""
    for ( i=0; i<str.length ; i++ ) {
        repeated=true
        for (j=0;j < pLen && (j+i+pLen) < str.length;j++)
            repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen))
        if (j<pLen) repeated=false
        if (repeated) {
            i+=pLen-1
            repeated=false
        }
        else {
            res+=str.charAt(i)
        }
    }
    return res
}
function trim(str, maxSize, suffix) {
        suffix = suffix || "...";
        var tmpRet = dojo.trim(str);
        if (maxSize) {
                if(tmpRet.length > maxSize) {
                        tmpRet = tmpRet.substring(0,(maxSize-suffix.length));
                        tmpRet += suffix;
                }
        }
        return tmpRet;
}

function starToggleLead(obj, visitorId, siteId) {
        var _obj = obj;
        DWRRestricted.starToggleLead(visitorId, siteId, function(data) {
                if(data) {
                        _obj.className= "star_on";
                } else {
                        _obj.className= "star_off";
                }
        });
}

function adLeadsFilterChange(obj) {
        var tmpOpt = obj.options[obj.selectedIndex];
        var tmpBox = dojo.byId("filterSerchBox"); 
        
        
        if (tmpOpt.getAttribute("needSearchBox") == "true") {
                dojo.style(tmpBox, {display:"inline"});
                
        } else {                
                dojo.style(tmpBox, {display:"none"});
                location.href = tmpOpt.value;   
        }       
}
function adSendFilterSearch(url) {
        var sel = dojo.byId("adFilterDropDown");
        var opt = sel.options[sel.selectedIndex];
        var url = opt.value;
        var tmpFS = dojo.byId("adFilterSearch");
        var fs = dojo.trim(tmpFS.value);
        if (fs == "") {
                alert ("Search value cannot be empty, please try again.");
                tmpFS.focus();
                return;
        }
        
        document.location.href = url + "&q=" + escape(fs);
}

function checkBooleanFlag() {	
	var query = dojo.byId('queryBoxModify').value;	
	if(isBooleanQuery(query)) {		
		dojo.byId('luceneSyntaxBoxModify').checked = true;
	} /* else {
		dojo.byId('luceneSyntaxBoxModify').checked = false;
	}	*/
}
function isBooleanQuery(query) {
	if (dojo.trim(query) == "") {
		return true;
	}
	var ret = /\b\"~\d+($| )/;
	if (query.match(ret)) {
		return true;
	}	
	var repl = /"[^"]+(AND|NOT|OR)*[^"]+"/;
	query = query.replace(repl, " ");

	var re = /\b(AND|OR|NOT)+\b/;	
	if(query.match(re)) {
		return true;
	}
	
	return false;
}
function replaceCurlyQuotes(query) {
	var re = /[“”]/g;	
	query = query.replace(re, "\"");
	re = /[‘’]/g;	
	return query.replace(re, "\'");
}
function showHideFields(node) {	
	var freq = getSelectValue(node);
	if (freq == 'HOURLY') {		
		dojo.style("hourlyFields1", "display", "");
		dojo.style("dailyFields1", "display", "none");
		dojo.style("dailyFields2", "display", "none");
		dojo.style("weeklyFields1", "display", "none");
	} else if(freq == 'DAILY') {		
		dojo.style("hourlyFields1", "display", "none");
		dojo.style("dailyFields1", "display", "");
		dojo.style("dailyFields2", "display", "");
		dojo.style("weeklyFields1", "display", "none");
	} else if (freq == 'WEEKLY') {
		dojo.style("hourlyFields1", "display", "none");
		dojo.style("dailyFields1", "display", "none");
		dojo.style("dailyFields2", "display", "none");
		dojo.style("weeklyFields1", "display", "");
	} else { //freq == "As It happens"
		dojo.style("hourlyFields1", "display", "none");
		dojo.style("dailyFields1", "display", "none");
		dojo.style("dailyFields2", "display", "none");
		dojo.style("weeklyFields1", "display", "none");
	}
}

// remove buzzgraph keywords via page reload with updated 'mk' parameter
function refineMaskKeywordSearch(cssClass, previousMkStr, reloadUrl) {
    var mk = "";
    dojo.query("." + cssClass).forEach(
        function(node) {
            if (node.checked) {
            	console.log(node.value);
                var vs = node.value.split(" ");
                for (v in vs) {
                    mk += encodeURIComponent(vs[v]) + ";";
                }
            }
        }
    );
    mk = mk + previousMkStr;
    load(reloadUrl + "&mk=" + mk);
}

function yt_tab_switch(obj) {
	
	dojo.query(".yt_mm_selected").forEach(function(node, index, arr){
	      dojo.removeClass(node, "yt_mm_selected");
	});	
	dojo.query(".yt_most_selected").forEach(function(node, index, arr){
	      dojo.removeClass(node, "yt_most_selected");
	});
	dojo.addClass(obj, "yt_mm_selected");
	var tmpId = obj.getAttribute("id");
	dojo.addClass(tmpId + "Con", "yt_most_selected");	
}
function yt_hb_tab_switch(obj) {
	
	dojo.query(".sub_tab_selected").forEach(function(node, index, arr){
		dojo.removeClass(node, "sub_tab_selected");
	    dojo.addClass(node, "sub_tab");
	});	
	dojo.query(".yt_most_selected").forEach(function(node, index, arr){
	      dojo.removeClass(node, "yt_most_selected");
	});
	
	obj.className = "sub_tab_selected";
	
	var tmpId = obj.getAttribute("id");
	dojo.addClass(tmpId + "Con", "yt_most_selected");
}

function closeSentItem(node) {
	if (node && node.parentNode && node.parentNode.parentNode) {
		node.parentNode.parentNode.removeChild(node.parentNode);
	}
}

function bitLyCallbackParser(jsonData){
	console.debug(jsonData.data);
	
	if (jsonData.status_code != 200) {
		return;
	}
try {	
	var cName = "bthash_";
	if (jsonData.data) {
		if (jsonData.data.clicks) {			
			cName += "clicks_"+ getBitlyHash(jsonData.data.clicks[0].short_url);
			var htmlTmp = jsonData.data.clicks[0].user_clicks;
			var htmlTmpG = jsonData.data.clicks[0].global_clicks;
			if (htmlTmp) {
				setClassHTML(cName, dojo.number.format(htmlTmp, "#,###"));
			}
			if (htmlTmpG) {
				setClassHTML(cName + "_gc", dojo.number.format(htmlTmpG, "#,###"));
			}
		} else if (jsonData.data.expand) {
			cName += "url_"+ getBitlyHash(jsonData.data.expand[0].short_url);
			var url = jsonData.data.expand[0].long_url;
			var html = 'Full URL: <a href="'+url+'">' + trim(url, 50, "...") + '</a>';
			setClassHTML(cName, html);			
		} else if (jsonData.data.info) {
			cName += "title_"+ getBitlyHash(jsonData.data.info[0].short_url);
			var title = jsonData.data.info[0].title;
			if (title) {
				setClassHTML(cName, "<b>" + trim(title, 50, "...") + "</b>");
			}
		} else if (jsonData.data.referrers) {
			cName += "referrers_"+ getBitlyHash(jsonData.data.short_url);
			
			var tmpHTML = "";
			var rl = jsonData.data.referrers.length;
			if (rl < 1) {
				return;
			} 
			if (rl > 10) {
				rl = 10;
			}
			tmpHTML = '<br /><b>Referrers</b><br /><table style="margin-top:5px;" border="0" cellspacing="0" cellspacing="0">';
			for (var i = 0; i < rl; i++) {				
				var referrer = ""; 
				if (jsonData.data.referrers[i].referrer_app) {
					referrer = jsonData.data.referrers[i].referrer_app;					
				} else if (jsonData.data.referrers[i].referrer) {
					referrer = jsonData.data.referrers[i].referrer;
				}
				
				tmpHTML += '<tr><td>' + trim(referrer, 50, "...") + '&nbsp;</td><td><b>' + dojo.number.format(jsonData.data.referrers[i].clicks, "#,###") + '</b></td></tr>';
			}
			tmpHTML += '</table>';
			
			setClassHTML(cName, tmpHTML);

		} else if (jsonData.data.countries) {
			cName += "countries_"+ getBitlyHash(jsonData.data.short_url);
			
			var tmpHTML = "";
			var rl = jsonData.data.countries.length;
			if (rl < 1) {
				return;
			} 
			if (rl > 10) {
				rl = 10;
			}
			tmpHTML = '<br /><b>Country</b><br /><table style="margin-top:5px;" border="0" cellspacing="0" cellspacing="0">';
			for (var i = 0; i < rl; i++) {
				
				tmpHTML += '<tr><td >' + trim(jsonData.data.countries[i].country, 50, "...") + '&nbsp;</td><td><b>' + dojo.number.format(jsonData.data.countries[i].clicks, "#,###") + '</b></td></tr>';
			}
			tmpHTML += '</table>';
			
			setClassHTML(cName, tmpHTML);		
			
		}

	}
 }catch(e){}
}
function setClassHTML(calssName, html) {
	dojo.query(("." + calssName)).forEach(function(node, index, arr) {
	      node.innerHTML=html;
	});
}
function getBitlyHash(url) {
	var hash = "";
    var index = url.lastIndexOf("/");
    if (index > 1) {
    	hash = url.substring(index+1);
    }
	return hash;
}
function destroyParent(node) {
	if (node && node.parentNode && node.parentNode.parentNode) {
		dojo.destroy(node.parentNode);
	}
}
function clickBlogBoxLink(e){
	e.stopPropagation ? e.stopPropagation() : (e.cancelBubble=true);
}

function clickBlogBox(node){
	dojo.toggleClass(node.parentNode, 'blog_box_open');
}
