﻿function AS() {
    var ASObj = {};    
    
    var rootURL = "";
    var headID = 0;
    var tagArray = [];
    var tagArraySite = [];
    var tagArrayRelated = [];
    var tagArrayLinked = [];
    var termExtractCount = 0;
    
    function AddJSONScriptTag(codeRequest) {

        var fullUrl = rootURL + codeRequest;
        try {
             // Create a new script object
             aObj = new JSONscriptRequest(fullUrl);
             // Build the script tag
             aObj.buildScriptTag();
             // Execute (add) the script tag
             aObj.addScriptTag();               
        }
        catch (err) {
            alert(err);
        }
    }
    function JSONscriptRequest(fullUrl) {
        // REST request path
        this.fullUrl = fullUrl; 
        // Get the DOM location to put the script tag
        this.headLoc = document.getElementsByTagName("head").item(0);
        // Generate a unique script tag id
        this.scriptId = 'fpHead_Id' + headID;
        
        var scriptTag = returnObjById('fpHead_Id' + headID);
        if(scriptTag){
          this.headLoc.removeChild(scriptTag);
        }
        headID++;
    }
    // buildScriptTag method
    JSONscriptRequest.prototype.buildScriptTag = function () {
        // Create the script tag
        this.scriptObj = document.createElement("script");

        // Add script object attributes
        this.scriptObj.setAttribute("type", "text/javascript");
        this.scriptObj.setAttribute("src", this.fullUrl);
        this.scriptObj.setAttribute("id", this.scriptId);
    };
    // removeScriptTag method
    JSONscriptRequest.prototype.removeScriptTag = function () {
        // Destroy the script tag
        this.headLoc.removeChild(this.scriptObj);  
    };
    // addScriptTag method
    JSONscriptRequest.prototype.addScriptTag = function () {
           
        //alert("this.scriptObj");
        // Create the script tag
        this.headLoc.appendChild(this.scriptObj);
    };
    
    
    ASObj.displaySimTermsSite = function(jsonData) {
        ASObj.displaySimTerms(jsonData, "Site");
    };
    ASObj.displaySimTermsRelated = function(jsonData) {
        ASObj.displaySimTerms(jsonData, "Related");
    };
    ASObj.displaySimTermsLinked = function(jsonData) {
        ASObj.displaySimTerms(jsonData, "Linked");
    };
    ASObj.displaySimTerms = function(jsonData,suffix) {
        var t = eval(jsonData);
        var resultSet = t.ResultSet;
        var error = t.Error;
        
        termExtractCount--;
        
        if (resultSet) {
            var r = resultSet.Result;
            
            if (r && r.length > 0) {
                
                
                for (i = 0; i < r.length; i++) {
                    switch (suffix) {
                        case "Site":
                            tagArraySite.push(r[i]);
                            break;
                        case "Related":
                            tagArrayRelated.push(r[i]);
                            break;
                        case "Linked":
                            tagArrayLinked.push(r[i]);
                            break;
                    }
                }
                
                if (termExtractCount === 0) {
                    ProcessTags();
                }
                
            }
        } else if (error) {
        
            var title = error.Title;
            if (!title) title = "No title";
            var message = error.Message;
            if (!message) message = "No message";
            var divErrors = returnObjById("divErrors");
            divErrors.innerHTML += "<br/>Error retrieving terms (" + suffix + "): " + title + " =//= " + message;
            
            //ActionsStatus("Extracting Terms for " + suffix,false);
        }
        
        ActionsStatus("Extracting Terms for " + suffix,false);
    };    
    function YWSAttrib() {
        return "<a style=\"float:right\" href=\"http://developer.yahoo.com/about\"><img src=\"http://us.dev1.yimg.com/us.yimg.com/i/us/nt/bdg/websrv_120_1.gif\" border=\"0\"></a>";
    }
    
    
    
    function ProcessTags() {
        
        tagArray.length = 0;
        
        if (tagArraySite.length > 0) {
            for (i = 0; i < tagArraySite.length; i++) { 
                tagArray.push([tagArraySite[i],1]);
            }
        }
        
        if (tagArrayRelated.length > 0) {
            for (i = 0; i < tagArrayRelated.length; i++) {
                var tag = tagArrayRelated[i];
                
                var addRelated = true;
                for (j = 0; j < tagArray.length; j++) {
                    if (tagArray[j][0] === tag) {
                        tagArray[j][1] = tagArray[j][1] + 1;
                        addRelated = false;
                    }
                }
                if (addRelated) {
                    tagArray.push([tag,1]);
                }
            }
        }
        
        if (tagArrayLinked.length > 0) {
            for (i = 0; i < tagArrayLinked.length; i++) {
                var tag = tagArrayLinked[i];
                
                var addLinked = true;
                for (j = 0; j < tagArray.length; j++) {
                    if (tagArray[j][0] === tag) {
                        tagArray[j][1] = tagArray[j][1] + 1;
                        addLinked = false;
                    }
                }
                if (addLinked) {
                    tagArray.push([tag,1]);
                }
            }
        }
        
        DisplayTags();
    }
    function DisplayTags() {
        var html = "<center><table width=\"700\"><tr><td style=\"float:left;text-align:left;font-size:120%;\">";
        for (var cnt = 0; cnt < tagArray.length; cnt++) {
            var wt = "normal";
            var col = "Black";
            if (tagArray[cnt][1] === 2) {
                wt = "bold";
                col = "Green";
            } 
            else if (tagArray[cnt][1] === 3){
                wt = "bolder";
                col = "Blue";
            }
            html += "<span style=\"display:inline-block;\" onmouseover=\"AS.ShowKeywordDelBut(" + cnt + ",true)\" onmouseout=\"AS.ShowKeywordDelBut(" + cnt + ",false)\"><div style=\"font-weight:" + wt + ";color:" + col + ";padding:0 5px;margin:0 5px;vertical-align:middle;\">" + tagArray[cnt][0] + "<img id=\"delBut" + cnt + "\" src=\"img/close_button.gif\" onclick=\"AS.ClearResult(" + cnt + ")\" title=\"remove keyword\" style=\"vertical-align:middle;cursor:pointer;padding-left:3px;visibility:hidden;\"></div></span>";
        }
        html += "</td></tr></table></center>";
        var div = returnObjById("divTags");
        div.innerHTML = html;
    }
    ASObj.ShowKeywordDelBut = function(cnt, state) {
        var but = returnObjById("delBut" + cnt);
        if (state) {
            but.style.visibility = "visible";
        } else {
            but.style.visibility = "hidden";
        }
    };
    ASObj.ClearResult = function(cnt) {
        tagArray.splice(cnt,1);
        var div = returnObjById("divTags");
        div.innerHTML = "";
        DisplayTags();
    };
    ASObj.Initialize = function() {        
        tagArraySite.length = 0;
        tagArrayRelated.length = 0;
        tagArrayLinked.length = 0;
        termExtractCount = 0;
    };
    ASObj.ResultsCount = function() {        
        return (tagArraySite.length + tagArrayRelated.length + tagArrayLinked.length);
    };
    ASObj.ResultsArray = function() {        
        var resultsArray = [tagArray.length];
        for (var i = 0;i<tagArray.length;i++) {
            resultsArray[i] = tagArray[i][0];
        }
        return resultsArray;
    };
    ASObj.ExtrTrms = function(q,txt,suffix) {
        
        txt = txt.replace(/%A9/gi,"%20");
        txt = txt.replace(/%AE/gi,"%20");
        txt = txt.replace(/%B3/gi,"%20");
        txt = txt.replace(/%u[a-fA-F0-9]{4}/gi,"%20");

	    while (txt.search(/%20%20/) > -1) {
        	    txt = txt.replace(/%20%20/gi,"%20");
	    }
        
        
        if (txt.length > 50) {
            termExtractCount++;
            var codeRequest = "http://search.yahooapis.com/ContentAnalysisService/V1/termExtraction?appid=_GlynyfV34FK7UJJ7pn3qXES_nNykDgZcGlSHxn.V7gKI_CbAg6M08EZ_TTOvcI-" + q + "&output=json&callback=AS.displaySimTerms" + suffix + "&context=" + txt ;
            if (codeRequest.length > 2000) {
                codeRequest = codeRequest.substring(0,1999);
            }
            
            if (codeRequest.lastIndexOf("%") >= codeRequest.length - 2) {
                codeRequest = codeRequest.substring(0,codeRequest.lastIndexOf("%"));
            }
            AddJSONScriptTag(codeRequest);
        } else {
            ActionsStatus("Extracting Terms for " + suffix,false);
        }
    
    };

    ASObj.search = function() {
        var searchBox = returnObjById("searchBox");
        window.location.href = "?q=" +  escape(searchBox.value);    
    };
    ASObj.keypress = function(e) {
        var keycode;
        if (window.event) {
            keycode = window.event.keyCode;
        }
        else if (e) {
            keycode = e.which;
        }
        if (keycode === 13) {
            AS.search();
        }
    };

    
    //returns a url parameter value when passed the parameter name. Will return "" if the param does not exist.
    ASObj.getURLparam = function(name){
        name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
        var regexS = "[\\?&]"+name+"=([^&#]*)";
        var regex = new RegExp( regexS );
        var results = regex.exec( window.location.href );
        if( results === null ) {
            return "";
        }
        else {
            return unescape(results[1]);
        }
    };
    
    ASObj.bookmark_us = function (url, title){
        if (window.sidebar) { // firefox
            window.sidebar.addPanel(title, url, "");
        }
        else if(window.opera && window.print){ // opera
            var elem = document.createElement('a');
            elem.setAttribute('href',url);
            elem.setAttribute('title',title);
            elem.setAttribute('rel','sidebar');
            elem.click();
        } 
        else if(document.all) {// ie
            window.external.AddFavorite(url, title);
        }
    };    
    
    function returnObjById( id ) {
        var returnVar;
        if (document.getElementById) {
            returnVar = document.getElementById(id); }
        else if (document.all) {
            returnVar = document.all[id]; }
        else if (document.layers) {
            returnVar = document.layers[id]; }
        return returnVar;
    }
    ASObj.shortenString = function(stringToShorten, maxLength) {
      if (stringToShorten !== undefined && stringToShorten.length > maxLength) {
          stringToShorten = stringToShorten.substring(0, maxLength-3) + "...";
        }
      return stringToShorten;
    };

    return ASObj;
    
}
AS = new AS();