/* JSLint Globals */
/*global $pupupOpened, countries */
if (typeof window.console != 'object') {
    var names = ['log', 'debug', 'info', 'warn', 'error', 'assert', 'dir', 'dirxml', 'group', 'groupEnd', 'time', 'timeEnd', 'count', 'trace', 'profile', 'profileEnd'];

    window.console = {};

    var fnLog = function($text)
    {
        if (window.opera && opera.postError) {
            opera.postError($text);
        } else {
            /*alert($text);*/
        }
    };

    for (var i = 0; i < names.length; ++i) {
        window.console[names[i]] = fnLog;
    }
}

// Waneer een browser het array.push niet ondersteund voegen we deze zelf maar toe dan.
if (![].push) {
    Array.prototype.push = function()
    {
        for (var $i = 0; $i < arguments.length; $i++) {
            this[this.length] = arguments[$i];
        }
    };
}

// Waneer een browser het array.push niet ondersteund voegen we deze zelf maar toe dan.
if (![].pop) {
    Array.prototype.pop = function()
    {
        var $popItem = this[this.length - 1];
        this.length--;
        return $popItem;
    };
}

function trim($str, $trimDoubleSpaces)
{
    if ($trimDoubleSpaces) {
        $str = $str.replace(/\s\s/g, ' ');
    }
    return $str.replace(/^\s+|\s+$/g, '');
}


function ltrim($str)
{
    return $str.replace(/^\s+/, '');
}


function rtrim($str)
{
    return $str.replace(/\s+$/, '');
}


function rand($n)
{
    return Math.floor(Math.random() * $n + 1);
}

/**
 * Renamed to getAllElementsByClassName to ensure compatibility with other scripts
 * which could use mozilla's version of getElementsByClassName
 */
/**
 * Hier komen diversen document.* uitbreidingen.
 * Deze kunnen globaal over de gehele website worden gebruikt.
 **/
/**
 * TODO We need to improve/remove the document. methods.
 * Make the functions so that it will also work with document and NOT with this.
 * This to prevent memory leaks.
 */
/**
 * Methode welke array terug geeft waarin alle elementen met een bepaalde classname zitten.
 * @param String    tagName     Naam van de tag waarin deze classname kan zitten.
 *                              Waneer * wordt opgegeven als tagName worden alle tags doorzocht.
 * @param String    clName      Naam van de class welke gezocht moet worden.
 **/
document.getAllElementsByClassName = function($tagName, $clName, $rootElement)
{
    if (!$rootElement) {
        $rootElement = this;
    }

    var $returnNode = [];
    var $checkClassName = new RegExp('\\b' + $clName + '\\b'); // * Aangepast zodat er verschillende achtervoegsels kunnen zijn.
    //  var $checkClassName = new RegExp('\\b'+$clName+'');
    var $element = $rootElement.getElementsByTagName($tagName);
    var $elmLength = $element.length;
    for (var $i = 0; $i < $elmLength; $i++) {
        if ($checkClassName.test($element[$i].className)) {
            $returnNode[$returnNode.length] = $element[$i];
        }
    }
    try {
        return $returnNode;
    }
    finally {
        $returnNode = null;
    }
};


document.getElementsById = function($tagName, $idValue, $rootElement)
{
    if (!$rootElement) {
        $rootElement = this;
    }

    var $returnNode = [];
    var $checkIdValue = new RegExp($idValue);
    var $element = $rootElement.getElementsByTagName($tagName);
    var $elmLength = $element.length;
    for (var $i = 0; $i < $elmLength; $i++) {
        if ($checkIdValue.test($element[$i].id)) {
            $returnNode[$returnNode.length] = $element[$i];
        }
    }
    return $returnNode;
};

/**
 * Retrieve all elements which have a specific attribute.
 *
 * @param {string} $tagName tagname like a, hr, div etc...
 * @param {string} $attribute like onfocus, onclick, accesskey style etc...
 */
document.getElementsByAttribute = function($tagName, $attribute)
{
    var $returnNode = [];
    var $element = this.getElementsByTagName($tagName);
    var $elmLength = $element.length;
    for (var $i = 0; $i < $elmLength; $i++) {
        if ($element[$i].hasAttribute($attribute)) {
            $returnNode[$returnNode.length] = $element[$i];
        }
    }
    return $returnNode;
};


document.getScrollTop = function()
{
    if (document.documentElement && document.documentElement.scrollTop) {
        return document.documentElement.scrollTop;
    } else if (document.body) {
        return document.body.scrollTop;
    } else {
        return null;
    }
};


document.getScrollLeft = function()
{
    if (document.documentElement && document.documentElement.scrollLeft) {
        return document.documentElement.scrollLeft;
    } else if (document.body) {
        return document.body.scrollLeft;
    } else {
        return null;
    }
};


document.getInnerHeight = function()
{
    if (typeof window.innerHeight != 'undefined') {
        return window.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight) {
        return document.documentElement.clientHeight;
    } else if (document.body) {
        return document.body.clientHeight;
    } else {
        return null;
    }
};


document.getInnerWidth = function()
{
    if (typeof window.innerWidth != 'undefined') {
        return window.innerWidth;
    } else if (document.documentElement && document.documentElement.clientWidth) {
        return document.documentElement.clientWidth;
    } else if (document.body) {
        return document.body.clientWidth;
    } else {
        return null;
    }
};


/**
 * Deze methode wordt gebruikt om de huidige positie van de muis te bepalen doormiddel van een event.
 * ---
 * @Param Element   currentEvent        Het event object waar de positie van bepaald moet worden.
 * ---
 * @Author www.quirksmode.org
 **/
function getPos(currentEvent)
{
    var position = {};
    position.posX = 0;
    position.posY = 0;

    if (currentEvent.pageX || currentEvent.pageY) {
        position.posX = currentEvent.pageX;
        position.posY = currentEvent.pageY;
    } else if (currentEvent.clientX || currentEvent.clientY) {
        position.posX = currentEvent.clientX + document.getScrollLeft();
        position.posY = currentEvent.clientY + document.getScrollTop();
    }
    return position;
}


/**
 * Methode welke 2 Objecten/Arrays samenvoegt tot 1.
 * Waneer er in src dezelfde keys zitten als in dest worden deze overschreven.
 * ---
 * @param Object/Array  dest    Array of Object waar alles in moet.
 * @param Object/Array  src     Array of Object welke aan dest toegevoegd moet worden.
 **/
function objectMerge($dest, $src)
{
    if (typeof($dest) != 'object' || typeof($src) != 'object') {
        return $dest;
    }
    for (var $key in $src) {
        $dest[$key] = $src[$key];
    }
    return $dest;
}


/**
 * Hierbij kan je zoveel arrays als je wilt bij opgeven.
 */
function arrayJoin()
{
    var $merged = [];
    var $count = 0;
    for (var $i = 0, $argLength = arguments.length; $i < $argLength; $i++) {
        var $argArray = arguments[$i];
        for (var $j = 0, $arrayLength = $argArray.length; $j < $arrayLength; $j++) {
            $merged[$count] = $argArray[$j];
            $count++;
        }
    }
    return $merged;
}



/**
 * Methode welke controleert of een variable leeg is.
 *
 * De volgende waardes worden als leeg beschouwd.
 * String:          '' & '0'.
 * Number:          0.
 * Boolean:         false.
 * Array/Object:    Waneer er geen keys/values in zitten.
 * Waneer een variable niet gezet is.
 * Functies geven altijd false terug. Dus niet leeg.
 * ---
 * @param [mixed]   mixed   Variable waarvan bekeken moet worden of deze leeg is.
 **/
function empty($mixed)
{
    switch (typeof($mixed)) {
        case 'undefined':
            return true;
        case 'object':
            for (var $key in $mixed) {
                return false;
            }
            return true;
        case 'string':
            return ($mixed === '' || $mixed === '0');
        case 'number':
            return ($mixed === 0);
        case 'boolean':
            return !$mixed;
        case 'function':
            return false;
        default:
            return false;
    }
}


/**
 * Methode welke controleert of een bepaalde key in een Object of Array zit.
 * ---
 * @param String        needle      De zoek string.
 * @param Array/Object  haystack    Het Array of Object waarin gezocht moet worden.
 **/
function keyExists($needle, $haystack)
{
    if (typeof($haystack) != 'object') {
        return false;
    }
    return ($needle in $haystack);
}


/**
 * Methode welke controleert of een bepaalde waarde zich in een Object of Array bevint.
 * ---
 * @param String        needle      De zoek string.
 * @param Array/Object  haystack    Het Array of Object waarin gezocht moet worden.
 * @param Boolean       strict      Waneer deze op true staat wordt ook het type (string, number etc..) gecontroleert.
 **/
function valueExists($needle, $haystack, $strict)
{
    if (typeof($haystack) != 'object') {
        return false;
    }

    var $key;
    if ($strict) {
        for ($key in $haystack) {
            if ($haystack[$key] === $needle) {
                return true;
            }
        }
    } else {
        for ($key in $haystack) {
            if ($haystack[$key] == $needle) {
                return true;
            }
        }
    }
    return false;
}


/**
 * Methode welke een string omzet naar boolean waarde
 * String false word dus boolean false. String true word dus boolean true. Geen van beide geeft de string terug.
 * ---
 * @param String    $value  De stringwaarde welke omgezet moet worden naar een boolean
 * @return Mixed    Boolean/String  Waneer de waarde gelijk is aan false/true is het een boolean, anders word de string terug gegeven
 **/
function strToBool($value)
{
    return ($value.toLowerCase() == 'true') ? true : (($value.toLowerCase() == 'false') ? false : $value);
}


/**
 * Methode welke alle niet nummers verwijderd uit een string
 * ---
 * @param String    $string De stringwaarde waaruit integers/nummers gehaald moet worden.
 **/
function extractIntegers($string)
{
    alert($string.replace(/\D/g, ''));
}


/**
 * Methode welke slashes toevoegt aan een string.
 **/
function addslashes($text)
{
    return $text.replace(/\'/g, '\\\'');
}


function escapebackslashes($text)
{
    return $text.replace(/\\/g, '\\\\');
}


/**
 * Start Event Handlers
 */
var EventCache = function()
{
    var $eventList = [];

    return {
        $eventList: $eventList,

        add: function($element, $type, $handler, $useCapture)
        {
            $eventList[$eventList.length] = arguments;
        },

        flush: function()
        {
            var $i, $item;
            for ($i = $eventList.length - 1; $i >= 0; $i--) {
                $item = $eventList[$i];
                // Gecko, Opera, W3C etc...
                if ($item[0].removeEventListener) {
                    $item[0].removeEventListener($item[1], $item[2], $item[3]);

                    // IE
                } else if ($item[0].detachEvent) {
                    if ($item[1].substring(0, 2) != 'on') {
                        $item[1] = 'on' + $item[1];
                    }

                    try {
                        $item[0].detachEvent($item[1], $item[2]);
                    }
                    catch ($expt) {
                    }
                } else {
                    if ($item[1].substring(0, 2) != 'on') {
                        $item[1] = 'on' + $item[1];
                    }
                    $item[0][$item[1]] = null;
                }
            }
        }

    };
}();

/**
 * Methode addEvent().
 * Hiermee kunnen we events toevoegen aan een object.
 * ---
 * (on)abort, (on)blur, (on)change, (on)click,
 * (on)dblclick, (on)error, (on)focus, (on)keydown,
 * (on)keypress, (on)keyup, (on)load, (on)mousedown,
 * (on)mousemove, (on)mouseout, (on)mouseover, (on)mouseup,
 * (on)reset, (on)resize, (on)select, (on)submit, (on)unload.
 * ---
 * @param Object    $element    Het element/object waar een event aan gekoppeld moet worden.
 * @param String    $type       Het type event welke de trigger moet zijn.
 * @param Function  $handler    De functie die moet worden uitgevoerd bij het event.
 * @param Boolean   $useCapture To use event capture or bubbeling (Default).
 **/
function addEvent($element, $type, $handler, $useCapture/* false */)
{
    if ($element !== null && typeof $element != 'undefined') {
        $useCapture = (typeof $useCapture == 'undefined') ? false : $useCapture;
        var $onType = 'on' + $type;
        if ($element.addEventListener) {
            $element.addEventListener($type, $handler, $useCapture);
        } else if ($element.attachEvent) {
            $element.attachEvent($onType, $handler);
        } else if (typeof $element[$onType] == 'function') {
            var $oldFn = $element[$onType];
            $element[$onType] = function($e)
            {
                $oldFn($e);
                $handler($e);
            };
        } else {
            $element[$onType] = $handler;
        }
    }
    EventCache.add($element, $type, $handler, $useCapture);
}


/**
 * Methode removeEvent().
 * Hiermee kunnen we events verwijderen van een object.
 * ---
 * (on)abort, (on)blur, (on)change, (on)click,
 * (on)dblclick, (on)error, (on)focus, (on)keydown,
 * (on)keypress, (on)keyup, (on)load, (on)mousedown,
 * (on)mousemove, (on)mouseout, (on)mouseover, (on)mouseup,
 * (on)reset, (on)resize, (on)select, (on)submit, (on)unload.
 * ---
 * @param Object    $element    Het element/object waar een event aan gekoppeld moet worden.
 * @param String    $type       Het type event welke de trigger moet zijn.
 * @param Function  $handler    De functie die moet worden uitgevoerd bij het event.
 * @param Boolean   $useCapture To use event capture or bubbeling (Default).
 **/
function removeEvent($element, $type, $handler, $useCapture)
{
    if ($element !== null && typeof $element != 'undefined') {
        var $onType = 'on' + $type;
        // Gecko, Opera, W3C etc...
        if ($element.removeEventListener) {
            $element.removeEventListener($type, $handler, $useCapture);

            // IE
        } else if ($element.detachEvent) {
            try {
                $element.detachEvent($onType, $handler);
            }
            catch ($expt) {
            }

            // Others
        } else {
            $element[$onType] = null;
        }
    }
}


/**
 * Hier voegen we een event toe aan window.
 * Omdat events geheugen in beslag nemen, en sommige browsers deze NIET goed verwijderen.
 * Moeten we dit zelf doen tijdens een (on)unload.
 **/
addEvent(window, 'unload', function($e)
{
    EventCache.flush($e);
});

/**
 * End Event Handlers
 */
/**
 * Methode welke het Element via een unique Id ophaalt.
 * ---
 * @Param: String   elementId       Naam van de ID welke opgehaald moet worden.
 * @Param: String   formName        Waneer er iets binnen een formulier opgehaald moet worden,
 *                                  moeten we ook dit argument mee geven ivm (wat oudere) netscape versies.
 **/
var getElement; /* Arguments: elementId, [formName] */
if (document.getElementById) {
    getElement = function($elementId)
    {
        return document.getElementById($elementId);
    };
} else if (document.all) {
    getElement = function($elementId)
    {
        return document.all[$elementId];
    };
} else if (document.layers) {
    getElement = function($elementId, $formName)
    {
        var $myObject = {};
        if (!$formName) {
            $myObject = document.layers[$elementId];
        } else {
            $myObject = document.forms[$formName].$elementId;
        }
        $myObject.style = document.layers[$elementId];
        return $myObject;
    };
} else {
    getElement = function() {};
}


// todo Misschien mogenlijk maken om een style tag te verwijderen en dan opnieuw invoegen.
function addStyleSheet($cssFile, $mediaType)
{
    var $linkNodes = document.getElementsByTagName('link');
    var $linkNodesLength = $linkNodes.length;
    for (var $i = 0; $i < $linkNodesLength; $i++) {
        var $currentHref = $linkNodes[$i].getAttribute('href');
        if ($currentHref == $cssFile) {
            return;
        }
    }

    var $cssNode = document.createElement('link');
    $cssNode.setAttribute('rel', 'stylesheet');
    $cssNode.setAttribute('type', 'text/css');
    $cssNode.setAttribute('href', $cssFile);
    if ($mediaType) {
        $cssNode.setAttribute('media', $mediaType);
    }
    document.getElementsByTagName('head')[0].appendChild($cssNode);
}


// todo Misschien mogenlijk maken om een script tag te verwijderen en dan opnieuw invoegen.
function addJavaScript($jsFile)
{
    var $jsNodes = document.getElementsByTagName('script');
    var $jsNodesLength = $jsNodes.length;
    for (var $i = 0; $i < $jsNodesLength; $i++) {
        var $currentSrc = $jsNodes[$i].getAttribute('src');
        if ($currentSrc == $jsFile) {
            return;
        }
    }

    var $scriptNode = document.createElement('script');
    $scriptNode.type = 'text/javascript';
    $scriptNode.src = $jsFile;
    document.getElementsByTagName('head')[0].appendChild($scriptNode);
}


/**
 * Functie welke alle selectboxen binnen een formulier aan of uit zet.
 *
 * @example onclick="multiSelect(this [, 'FormId'])"
 **/
function multiSelect($checkboxElement, $formId)
{
    //if (!$formId) { $formId = $checkboxElement.form.id }
    var $formElements = ($formId) ? getElement($formId) : $checkboxElement.form;

    if (!empty($formElements)) {
        var $checkboxIdCaller = $checkboxElement.id;
        var $checkedState = $checkboxElement.checked;
        var $totalFormElements = $formElements.length;
        for (var $i = 0; $i < $totalFormElements; $i++) {
            var $formElement = $formElements[$i];

            if (empty($formElement) || ($formElement.type != 'checkbox' || $formElement.id == $checkboxIdCaller)) {
                continue;
            }
            $formElement.checked = $checkedState;
        }
    }
}


/**
 * Functie welke controleert hoeveel checkboxen er binnen een form aan zijn.
 *
 * @return Int Aantal aangevinkte checkboxen.
 **/
function checkedCount($formId)
{
    var $formElements = getElement($formId);
    var $totalChecked = 0;

    var $totalFormElements = $formElements.length;
    for (var $i = 0; $i < $totalFormElements; $i++) {
        var $formElement = $formElements[$i];

        if (empty($formElement) || $formElement.type != 'checkbox' || ($formElement.type == 'checkbox' && !$formElement.checked)) {
            continue;
        }
        $totalChecked++;
    }
    return $totalChecked;
}


/**
 * Methode welke de huidige style van een element terug geeft.
 * ---
 * @Param   String/Object   element         Hier kan of een string met de naam van het element worden opgegeven (de id).
 *                                          Of het element zelf waneer dit al is opgevraagd.
 * @Param   String          styleProperty   Welke style moet worden opgehaald. width of height bijvoorbeeld.
 **/
var getStyle; /* Arguments: element, styleProperty  */
if (document.defaultView) {
    getStyle = function($element, $styleProperty)
    {
        $element = (typeof($element) == 'object') ? $element : getElement($element);
        return document.defaultView.getComputedStyle($element, null)[$styleProperty];
    };
} else {
    getStyle = function($element, $styleProperty)
    {
        $element = (typeof($element) == 'object') ? $element : getElement($element);
        if ($element.currentStyle) {
            return $element.currentStyle[$styleProperty];
        } else {
            return null;
        }
    };
}


/**
 * Deze functie zet de focus (cursor) op een veld.
 * @param String elementId de naam van een veld.
 */
function setFocus($elementId)
{
    if (typeof $pupupOpened != 'undefined' && $pupupOpened === true) {
        return false;
    }

    var $elm = getElement($elementId);
    if ($elm !== null) {
        $elm.focus();
    }
    return true;
}


/**
 * Deze functie maakt aan de hand van een naam of een id een element zichtbaar
 * @param String naam of id van het element
 * @require Javascript functie getElement
 */
function ShowContent($elementId)
{
    getElement($elementId).style.display = '';
}


/**
 * Deze functie maakt aan de hand van een naam of een id een element onzichtbaar
 * @param String naam of id van het element
 * @require Javascript functie getElement
 */
function HideContent($elementId)
{
    getElement($elementId).style.display = 'none';
}


/**
 * Deze functie zorgt er voor dat tab tekens binnen een textArea of input gebruikt kunnen worden.
 * Deze functie kan alleen worden aangeroepen via attachAllowTabs();
 **/
function allowTabCharacter($e)
{
    if (!$e) {
        $e = window.event;
    }
    var $curTarget = $e.target ? $e.target : $e.srcElement;

    if ($e.keyCode == 9/* && $e.ctrlKey == true*/ && $e.type == 'keydown') { // tab character == 9
        if ($curTarget.setSelectionRange) {
            var $selStart = $curTarget.selectionStart;
            var $selEnd = $curTarget.selectionEnd;
            $curTarget.value = $curTarget.value.substring(0, $selStart) + "\t" + $curTarget.value.substr($selEnd);
            $curTarget.setSelectionRange($selStart + 1, $selStart + 1);
            $curTarget.focus();
        } else if ($curTarget.createTextRange) {
            document.selection.createRange().text = "\t";
            $curTarget.onblur = function()
            {
                this.focus();
                this.onblur = null;
            };
        } else {
            $curTarget.value += "\t";
        }

        if ($e.returnValue) {
            $e.returnValue = false;
        }
        if ($e.preventDefault) {
            $e.preventDefault();
        }
        return false;
    }
    return true;
}


/**
 * Deze functie zorgt er voor dat tijdens een keydown op een textarea of input de tabs worden afgevangen.
 * ---
 * @param: $elementId   De id van de textarea of input welke tabs moet ondersteunen.
 **/
function attachAllowTabs($elementId)
{
    var $attachToElement = getElement($elementId);
    if ($attachToElement === null) {
        return false;
    }
    addEvent($attachToElement, 'keydown', function($e)
    {
        allowTabCharacter($e);
    });
    addEvent($attachToElement, 'keyup', function($e)
    {
        allowTabCharacter($e);
    });
    addEvent($attachToElement, 'keypress', function($e)
    {
        allowTabCharacter($e);
    });
    return true;
}


/**
 * Deze functie zorgt er voor dat er een string in een bepaalde textarea gezet kan worden.
 * Dit gebeurt op de positie waar de cursor op dat moment staat in de textarea.
 **/
function addStringToTextarea($elementId, $addText)
{
    var $elementObject = getElement($elementId);
    $elementObject.focus();

    if ($elementObject.setSelectionRange) {
        var $selStart = $elementObject.selectionStart;
        var $selEnd = $elementObject.selectionEnd;
        $elementObject.value = $elementObject.value.substring(0, $selStart) + $addText + $elementObject.value.substr($selEnd);
        $elementObject.setSelectionRange($selStart + $addText.length, $selStart + $addText.length);
    } else if ($elementObject.createTextRange) {
        document.selection.createRange().text = $addText;
    } else {
        $elementObject.value += $addText;
    }

    $elementObject.focus();
    return true;
}


/**
 * Deze functie zorgt ervoor dat als er ergens in een formulier de landcode word
 * gewijzigd dat de country code ingevuld word en dat waarnodig het gsm-nummer leeggemaakt wordt.
 * @param event             $e                  Het event
 * @param object/string     $countrySelect      De landen select box
 * @param object/string     $countryCodeField   Het veld waar de country code in moet verschijnen
 */
function handleCountryChange($e, $countrySelect, $countryCodeField)
{
    if (!$e) {
        $e = window.event;
    }

    var $elmCountrySelect = (typeof($countrySelect) == 'object') ? $countrySelect : getElement($countrySelect);
    var $elmCountryCodeField = (typeof($countryCodeField) == 'object') ? $countryCodeField : getElement($countryCodeField);

    if ($elmCountrySelect === null || $elmCountryCodeField === null || empty($elmCountrySelect.options)) {
        return false;
    }

    var $selectedValue = $elmCountrySelect.options[$elmCountrySelect.selectedIndex].value;
    $elmCountryCodeField.value = ($selectedValue != 'choose') ? '+' + countries[$selectedValue] + ' ' : '';

    return false;
}


/**
 * Deze functie opent het popupje welke een ringtone afspeelt
 * @param Integer $id de id van het content item
 */
function play($id)
{
    window.open('/listentune/?id=' + $id, 'listenTune', 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,copyhistory=no,width=300,height=100,screenX=0,screenY=0,top=0,left=0');
}


/**
 * Deze functie opent de help popup
 */
function openHelpPopup()
{
    window.open('/content/helppopup/', 'supportpop', 'toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=no,resizable=no,copyhistory=no,width=600,height=450,screenX=0,screenY=0,top=0,left=0');
}


/**
 * Deze functie opent de help popup
 */
function openSupportedPhonesPopup()
{
    window.open('/content/supportedphonespopup/', 'supportpop', 'toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=no,resizable=no,copyhistory=no,width=600,height=450,screenX=0,screenY=0,top=0,left=0');
}


/**
 * Deze functie geeft een array terug met als Key de getVar Name en als Value de getVar Value.
 */
function getGetVars()
{
    var $getVars = location.search.substring(1).split('&');
    var $returnGetVars = [];

    for (var $i = 0; $i < $getVars.length; $i++) {
        var $newVar = $getVars[$i].split('=');
        $returnGetVars[decodeURIComponent($newVar[0])] = decodeURIComponent($newVar[1]);
    }
    return $returnGetVars;
}


/**
 * Herlaadt de pagina; dwz: roept opnieuw de pagina aan met de huidige URL
 */
function reloadGet()
{
    window.location = location.href;
}


// the $preventDisalbe is added so forms can prevent the disableing of there submit button in some cases.
var $preventDisableSubmit = {};
function disableAfterSubmit($form)
{
    if ($preventDisableSubmit[$form.id] === true) {
        $preventDisableSubmit[$form.id] = false;
        return;
    }
    for (var i = 0; i < $form.elements.length; i++) {
        if ($form.elements[i].type.toLowerCase() == 'submit') {
            $form.elements[i].disabled = true;
        }
    }
}

function addDisableFormEvent($formId)
{
    var $form = getElement($formId);
    if ($form != null) {
        addEvent($form, 'submit', function() { disableAfterSubmit($form); });
    }
}

function addHelpValueScript($inputId)
{
    var $element = getElement($inputId);
    var $elementHelper = getElement($inputId + '_helpvalue');

    if ($element !== null && $elementHelper !== null) {
        $element.onfocus = function()
        {
            if ($element.value == $elementHelper.value) {
                $element.value = '';
            }
        };

        $element.onblur = function()
        {
            if ($element.value === '' || $element.value == $elementHelper.value) {
                $element.value = $elementHelper.value;
            }
        };

        if ($element.value === '') {
            $element.value = $elementHelper.value;
        }
    }
}


function loginKeypress($element, $text)
{
    if ($element.value == $text) {
        $element.value = '';
    }
}


function loginClick($element, $text)
{
    if ($element.value == $text) {
        $element.value = '';
    }
}


function loginBlur($element, $text)
{
    if ($element.value === '') {
        $element.value = $text;
    }
}


function loginFocus($element, $text)
{
    if ($element.value == $text) {
        $element.value = '';
    }
}


/**
 * This function will make the target link flash by changing the color every 500ms.
 * @param {String}  $id     The id of the target element.
 * @param {Integer} $color  The color code for changing purposes.
 */
function flash($id, $color)
{
    var $newColor = $color == 1 ? 2 : 1;
    var $linkColor = $newColor == 1 ? '#F00' : '#000';
    var $link = getElement($id);
    if ($link && $link != 'undefined') {
        $link.style.color = $linkColor;
        setTimeout('flash(\'' + $id + '\', \'' + $newColor + '\')', 500);
    }
}


function getCurrentCaretPosition($elm)
{
    var $caretPos = 0;

    // Firefox
    if ($elm.selectionStart || $elm.selectionStart == '0') {
        $caretPos = $elm.selectionStart;

    // Crappy IE
    } else if (document.selection) {
        $elm.focus();
        var Sel = document.selection.createRange();
        Sel.moveStart('character', -$elm.value.length);
        $caretPos = Sel.text.length;
    }

    return $caretPos;
}


function setCaretPosition($elm, $pos)
{
    if($elm.setSelectionRange) {
        $elm.focus();
        $elm.setSelectionRange($pos, $pos);
    } else if ($elm.createTextRange) {
        var $range = $elm.createTextRange();
        $range.collapse(true);
        $range.moveEnd('character', $pos);
        $range.moveStart('character', $pos);
        $range.select();
    }
}

/**
 * Make the Enquête link in the main menu blink from red to white
 */
function flashEnqueteLink() {
    var elem = $('a.topMenuLink[rel=enquete]');
    var hoverColour = elem.css('color');
    // Every new animation is done after the previous is done by using the callback argument.
    // This prevents errors in IE when there is some kind of delay.
    // This also means that setInterval() isn't needed anymore.
    elem.animate({'color': 'rgb(255, 0, 0)'}, 500, /* The Callback */ function()
    {
        elem.animate({'color': hoverColour}, 500, /* The Callback */ flashEnqueteLink);
    });
}

/**
 * Will add Google Analytics Stats for external/download links.
 * @param String trackDownloadLink
 */
function trackDownload(trackDownloadLink)
{
	if (typeof(pageTracker) !== 'undefined') {
		pageTracker._trackPageview(trackDownloadLink);
	}
}

/**
 * Adds an evenTracking value to Google Analytics.
 *
 * @param String eventCategory The Category to which this event belongs (banners, pressRelease etc...)
 * @param String eventType The Type of event (click, open, view etc...)
 * @param String eventLabel [OPTIONAL] Is very usefull to track specific url's or types, like (banner1.png, banner2.png, pressRelease1.pdf, http://www.externalwebsite.com/website.html)
 * @param Integer eventValue [OPTIONAL] To provide numerical data about the user event.
 */
function GaEventTracking(eventCategory, eventType, eventLabel, eventValue)
{
    if (typeof(pageTracker) != 'undefined') {
        pageTracker._trackEvent(eventCategory, eventType, eventLabel, eventValue);
    }
}

/**
 * Add the AddThis button through jQuery to prevent errors.
 */
(function($){
    // Prevent overwriting an already set addthis_config variable.
	if (typeof(window.addthis_config) == 'undefined') {
		window.addthis_config = {};
	}
    $.addthis = function(code){
        function init(){
            try{
                var addThisA = $('a.addthis');
				if (addThisA.length === 1) {
					// Make sure that the username is set.
					// The ?pub= doestn't work when using the getScript() from jQuery.
					window.addthis_config.username = code;
					window.addthis_pub = code;

					// determine whether to include the normal or SSL version
					var addthisurl = (location.href.indexOf('https') == 0 ? 'https://' : 'http://') + 's7.addthis.com/js/250/addthis_widget.js?pub=' + code;

					// include the script
					$.getScript(addthisurl, function() {
						addThisA.append('<img src="http://s7.addthis.com/static/btn/lg-share-en.gif" width="125" height="16" alt="Bookmark and Share" style="border:0"/>').attr('href', 'http://www.addthis.com/bookmark.php?v=250').mouseover(function() {
							return addthis_open(this, '', '[URL]', '[TITLE]');
						}).mouseout(function() {
							addthis_close();
						}).click(function() {
							return addthis_sendto();
						});
					});
				}
            } catch(err) {
                // Just do nothing, but prevent worse.
            }
        }
        init();
    }
})(jQuery);

$(document).ready(function() {
    setTimeout(function() {
        $.addthis('smscity');
        }, 1);
});
