//----------------------------------------------------------
//  _    _    _                                 __ _ _ _              _
// | |_ (_)__| |_ ___ _ _ _  _    _ __ _ _ ___ / _(_) (_)_ _  __ _   (_)___
// | ' \| (_-<  _/ _ \ '_| || |  | '_ \ '_/ _ \  _| | | | ' \/ _` |_ | (_-<
// |_||_|_/__/\__\___/_|  \_, |__| .__/_| \___/_| |_|_|_|_||_\__, (_)/ /__/
//                        |__/___|_|                         |___/ |__/
//
//----------------------------------------------------------
// File      : history_profiling.js
// Author    : Richard Lewis
// Project   : /mnt/webdev/data/js/cybersecurity/
// Syntax    : javascript
// Date      : Wed 30 Jul 2008
// Copyright : Richard Lewis 2008
//----------------------------------------------------------
// history_profiling.js -
//----------------------------------------------------------

function goHistory() {
    // onload

    backSetup();
    goSetup();
    bruteSetup();
    visitedSetup();
}
//----------------------------------------------------------

function visitedSetup() {
    // visited example setup

    var visitedbt = getEle('visited');

    visitedbt.onclick = function(evt) {
        visitedbtClick(this, evt);
    }
}
//----------------------------------------------------------

function visitedbtClick() {
    // visited click

    crtVisited('visitedout');

}
//----------------------------------------------------------

function crtVisited(parentID) {
    // create visited example

    var parentEle = getEle(parentID);

    if ( ! ('testLinks' in parentEle) )
        crtTestLinks(parentEle);

    var testLinks = parentEle.testLinks;

    var tbody = getEle('visitedout');

    for (var k = 0; k < testLinks.length; ++k) {

        var url  = testLinks[k].url;
        var desc = testLinks[k].desc;

        var aLink = crtEle('a');

        aLink.href = url;
        aLink.appendChild( crtTxt(desc) );

        var td1 = crtEle('td');
        td1.className = "lower";

        td1.appendChild( crtTxt(url) );
        
        var td2 = crtEle('td');
    
        td2.appendChild( aLink );

        var td3 = crtEle('td');
        td3.rowSpan   = "2";
        td3.className = "lower";

        if (window.getComputedStyle)  
            var color = window.getComputedStyle(
                aLink, null).color;

        else if (aLink.currentStlye)
            var color = aLink.currentStyle.color;

        else
            color = "rgb(153, 0, 0)";

        var tr1 = crtEle('tr');

        tr1.appendChild(td2)

        tbody.appendChild(tr1)

        if ( color == "rgb(0, 153, 0)" )
            td3.appendChild(
                crtTxt("Visited") );

        else
            td3.appendChild(
                crtTxt("Fresh") );

        tr1.appendChild(td3);

        var tr2 = crtEle("tr");

        tr2.appendChild(td1);

        tbody.appendChild(tr2);
    }
}
//----------------------------------------------------------

function crtTestLinks(ele) {
    // create test links

    var testLinks = new Array();

    var urls =
        "http://www.cybersecurity.org.uk/articles/histroy_profiling.htm," +
        "http://www.cybersecurity.org.uk," +
        "http://www.google.com," +
        "http://www.google.co.uk," +
        "http://www.yahoo.com," +
        "http://www.poisedsolutions.com," + 
        "http://www.poisedcontacts.com," +
        "http://www.beautifulbalms.com," +
        "http://www.net-a-porter.com," +
        "http://www.poisedsolutions.com/binarymagick/";

    var descs = 
        "History Profiling @ CyberSecurity (this page)," +
        "Cyber Security Home Page," +
        "gooogle.com," +
        "google.co.uk," +
        "yahoo.com," +
        "Poised Solutions - IT Development UK," +
        "Poised Contacts - Fresh look at IT recruitment.," +
        "Beautiful Balms - handmade creams and aqua flower essences.," +
        "Net-a-porter - cutting edge designer clothing and accessories.," +
        "Binary Magick - binary tricks";

    var urlsA  = urls.split(",");
    var descsA = descs.split(",");

    for ( var k = 0; k < urlsA.length; ++k ) {

        var testLink = new Object();

        testLink.url  = urlsA[k];
        testLink.desc = descsA[k];

        testLinks.push(testLink);
    }

    ele.testLinks = testLinks;
}
//----------------------------------------------------------

function bruteSetup() {
    // brute button example setup

    var brutebt = getEle('brutebt');

    brutebt.onclick = function(evt) {
        brutebtClick(this, evt);
    }
}
//----------------------------------------------------------

function brutebtClick() {
    // brute button click

    crtBrute('brutebteg');
}
//----------------------------------------------------------

function crtBrute(parentID) {
    // create brute force example

    var parentEle = getEle(parentID);

    clrEle(parentEle);

    if ( 'timeo' in parentEle )
       clearTimeout(parentEle.timeo);

    var randNum = Math.floor(Math.random() * 10000);
    var randStr = padZeroes(randNum, 4);

    for ( var k = 0; k < 4; ++k ) {

        var disp = crtEle('span');
        disp.className = 'display';

        var rdigit = randStr.substr(k, 1);

        disp.appendChild(crtTxt(rdigit));

        parentEle.appendChild(disp);
    }

    var sep = crtEle('span');

    sep.className = 'sep';

    sep.appendChild( crtTxt(".::.") );

    parentEle.appendChild( sep );

    guessStr = padZeroes(0, 4);

    for ( var k = 0; k < 4; ++k ) {

        var guess = crtEle('span');

        guess.id        = 'guess' + k;
        guess.className = 'guess';

        var gdigit = guessStr.substr(k, 1);

        guess.appendChild(crtTxt(gdigit));

        parentEle.appendChild(guess);
    }

    parentEle.guess   = 0;
    parentEle.randNum = randNum;
    parentEle.k       = 0;
    parentEle.timeo   = setTimeout(guessRun, 1);
}
//----------------------------------------------------------

function guessRun() {
    // guess run

    var parentEle = getEle('brutebteg');

    var target = parentEle.randNum
   
    var brute = parentEle.guess;

    ++brute;

    if ( brute < 10000 ) { 

        var bruteStr = padZeroes(brute, 4);

        for ( var k = 0; k < 4; ++k ) {

            var guess = getEle('guess' + k );

            var gdigit = bruteStr.substr(k, 1);

            guess.firstChild.nodeValue = gdigit;
        }

        if (brute != target) {

            parentEle.guess = brute;
            parentEle.timeo = setTimeout(guessRun, 1);
        }
    } 
}
//----------------------------------------------------------

function padZeroes(num, len) {
    // pad zeroes

    var str = num.toString();

    if ( str.length < len ) {

        var dif = len - str.length;

        for ( var k = 0; k < dif; ++ k )
            str = "0" + str;
    }

    return str;
}
//----------------------------------------------------------

function goSetup() {
    // go button example setup

    var gobt = getEle('gobt');

    gobt.onclick = function(evt) {
        gobtClick(this, evt);
    }
}
//----------------------------------------------------------

function gobtClick() {
    // go button click

    crtGo('gobteg');
}
//----------------------------------------------------------

function crtGo(parentID) {
    // create go example

    var parentEle = getEle(parentID);

    clrEle(parentEle);

    // assume last page in history chain

    var history_length = window.history.length;

    var max   = history_length;
    var lower = 0;

    if ( history_length > 10 ) {

        max   = history_length - 10;
        lower = Math.floor(Math.random() * max);
    }

    for ( var k = lower + 1; k < max; ++k ) {

        var txt = crtTxt("-" + k);

        var bt = crtEle('span');

        bt.className = 'button';

        bt.title = "Go back " + k;

        bt.goby = k * -1;

        bt.onclick = function(evt) {
            window.history.go(this.goby);
        };

        bt.appendChild(txt);

        parentEle.appendChild(bt);
    }
}
//----------------------------------------------------------

function backSetup() {
    // back button example setup

    var backbt = getEle('backbt');

    backbt.onclick = function(evt) {
        backbtClick(this, evt);
    }
}
//----------------------------------------------------------

function backbtClick() {
    // back button click

    crtBack('backbteg');
}
//----------------------------------------------------------

function crtBack(parentID) {
    // create a back button

    var parentEle = getEle(parentID);

    var txt = crtTxt('< < < BACK');

    var bt = crtEle('span');

    bt.onclick = function (evt) {
        window.history.back();
    };

    bt.className = 'button';

    bt.appendChild(txt);

    clrEle(parentEle);

    parentEle.appendChild(bt);
}
//----------------------------------------------------------

if (window.addEventListener)
    window.addEventListener("load", goHistory, false);

else if (window.attachEvent)
    window.attachEvent("onload", goHistory);
//----------------------------------------------------------
